http的chunked协议

Content-Length是用来标识http的body有多少个字节,但当要传输的数据是一直产生的,或者是无法提前知道 body有多少字节时,就可以使用http/1.1的 chunked编码协议。这就是所谓的流式数据传输。特别注意,http2有自己的流式数据传输解决方案,并不使用chunked协议,所以此协议只适用于http/1.1版本。

当不写Content-Length时,只需要写Transfer-Encoding: chunked即可。无论是客户端请求,还是服务端返回都可以使用。body数据格式为:

4\r\n
Wiki\r\n
5\r\n
pedia\r\n
E\r\n
 in\r\n
\r\n
chunks.\r\n
0\r\n
\r\n

每一个chunk都是以一个16进制编码的数字独占一行打头,该16进制为字符串编码,表明接下来的chunk长度。末尾以0长度结尾,表明整个数据传输完成。由此可见,chunked协议,保持了一个长久的http连接。

值得注意,默认当Transfer-Encoding: chunked和Content-Encoding: gzip同时使用时,是将整个数据先gzip压缩,然后再分块。所以服务端也需要接收完整个数据才能进行解压。gzip支持流式压缩和解压,所以客户端和服务端都可以进行流式传输。

chunked编码有效地减小了大数据传输对内存的需求,客户端可以边读取边发送,而服务端可以边接收边处理。chunked协议可以实现边传输边展现,能有效减小站点响应时间,减少http请求数量(参见facebook的big_pipe页面加载技术)。例如将多个小图片按chunk传输,减少http连续,发送header的过程。

发表于2018-01-21 23:19   修改于2018-01-21 23:19   评论:0   阅读:192  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo