HTTP协议:分块传输编码(Chunked transfer encoding)
来源:互联网 发布:java 2d游戏引擎 编辑:程序博客网 时间:2024/05/22 10:46
分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。通常数据块的大小是一致的,但也不总是这种情况。
原理
HTTP 1.1引入分块传输编码提供了以下几点好处:
- HTTP分块传输编码允许服务器为动态生成的内容维持HTTP持久链接。通常,持久链接需要服务器在开始发送消息体前发送Content-Length消息头字段,但是对于动态生成的内容来说,在内容创建完之前是不可知的。[1]
- 分块传输编码允许服务器在最后发送消息头字段。对于那些头字段值在内容被生成之前无法知道的情形非常重要,例如消息的内容要使用散列进行签名,散列的结果通过HTTP消息头字段进行传输。没有分块传输编码时,服务器必须缓冲内容直到完成后计算头字段的值并在发送内容前发送这些头字段的值。
- HTTP服务器有时使用压缩 (gzip或deflate)以缩短传输花费的时间。分块传输编码可以用来分隔压缩对象的多个部分。在这种情况下,块不是分别压缩的,而是整个负载进行压缩,压缩的输出使用本文描述的方案进行分块传输。在压缩的情形中,分块编码有利于一边进行压缩一边发送数据,而不是先完成压缩过程以得知压缩后数据的大小。
格式
如果一个HTTP消息(请求消息或应答消息)的Transfer-Encoding消息头的值为chunked,那么,消息体由数量未定的块组成,并以最后一个大小为0的块为结束。
每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。
最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。
消息最后以CRLF结尾。
例子
HTTP/1.1 200 OKContent-Type: text/plainTransfer-Encoding: chunked25This is the data in the first chunk1Cand this is the second one3con8sequence0
编码应答的解释
前两个块的数据中包含有显式的\r\n字符。
"This is the data in the first chunk\r\n" (37 字符 => 十六进制: 0x25)"and this is the second one\r\n" (28 字符 => 十六进制: 0x1C)"con" (3 字符 => 十六进制: 0x03)"sequence" (8 字符 => 十六进制: 0x08)
应答需要以0长度的块( "0\r\n\r\n".)结束。
解码的数据
This is the data in the first chunkand this is the second oneconsequence
0 0
- HTTP协议:分块传输编码(Chunked transfer encoding)
- Http 分块传输编码 Transfer-Encoding: chunked
- HTTP1.1协议的chunked编码(chunked transfer encoding分块传输编码)
- http协议Chunked transfer encoding
- HTTP协议响应头之Transfer-Encoding:分块传输详解
- HTTP协议响应头之Transfer-Encoding:分块传输详解
- HTTP 1.1 中Transfer-Encoding chunked编码
- HTTP 1.1 中Transfer-Encoding chunked编码
- HTTP 1.1 中Transfer-Encoding chunked编码
- 解HTTP协议中的"Transfer-Encoding: chunked"
- HTTP协议中的"Transfer-Encoding: chunked"
- 理解HTTP协议中的"Transfer-Encoding: chunked"
- 理解HTTP协议中的"Transfer-Encoding: chunked"
- 理解HTTP协议中的"Transfer-Encoding: chunked"
- 【HTTP协议】Transfer-Encoding: chunked 长度不确定的http报文
- 【HTTP协议】Transfer-Encoding: chunked 长度不确定的http报文
- http 协议 通用信息头 Transfer-Encoding: chunked
- http协议分块传输编码
- BZOJ 1146 CTSC 2008 网络管理 Network 树链剖分+二分答案+平衡树
- 比较web service和EJB
- python的__call__函数
- Android 通过mTitle修改标题 无效的解决办法
- 【内核研究】线程局部存储_TheadLocal
- HTTP协议:分块传输编码(Chunked transfer encoding)
- Dive into python第七章正则表达式学习笔记
- 调和级数
- hdu 2492 Ping pong 树状数组
- C++语法下String类的简单程序
- C++中 模板Template的使用
- 15个初学者必看的基础SQL查询语句
- Bayan 2015 Contest Warm Up E题(双连通分量缩点+DP计数)
- 结构体初始化