http的响应头,如果存在Transfer-Encoding: chunked。代表使用分块传输编码。
背景:在传统的请求中,HTTP的响应实体是作为整包发送给客户端的,用首部字段Content-Length,来表示响应实体的长度。这个长度对客户端十分重要,为什么这么说呢,因为客户端必须知道哪个位置才是响应消息的结束,以及后续响应的开始,服务端必须精确的告诉客户端实体长度是多少,如果Content-Length比实际返回的长度短,那么就会造成内容截断,,如果比实体内容长,客户端就一直处于pendding的状态,直到所有的实体内容都返回请求才结束。对于一个复杂页面来说,如果是等到消息体完全创建好之后再计算出Content-Length返回给客户端的话,在客户端那边会有一个漫长的等待过程,而对于用户来说,一个页面的所能容忍的等待时间不超过3秒,因此才出现了分块传输编码(Chunked Transfer Coding)。服务器发送数据时不再需要预先告诉客户端发送内容的总大小,只需在响应头里面添加Transfer-Encoding: chunked,以此来告诉浏览器我使用的是分块传输编码,这样就不需要 Content-Length 了。
分块传输编码会将实体主体分成多个部分(块),并以最后一个大小为0的块为结束。每个非空的块包括两部分:
快的长度(用十六进制表示),后面跟一个CR+LF (回车及换行),长度并不包括结尾的回车换行符
数据本身,同样后面跟一个CR+LF (回车及换行)
最后一块是单行,只由块大小(0)以及CR+LF 组成,不包含任何数据。
例如:
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0
解码 示意
“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)
最终 结果
This is the data in the first chunk
and this is the second one
consequence
以上用例中,正如在首部字段 Transfer-Encoding 中指定的那样,有效使用分块传输编码,且分别被分成37字节、28 字节、3字节、8字节大小的分块数据。