HTTP协议中的chunked编码解析

 HTTP协议中的chunked传输编码全接触。


在HTTP协议中,服务器发往客户端的数据中,通常都包括HTTP头和HTTP体,当存在HTTP体的时候,HTTP体的长度通常是由HTTP头内的“Content-Length”字段确定。


就像下图:

640?wx_fmt=jpeg


不过,Content-Length”字段并非总是存在,这就涉及到今天要讲的chunked编码,它在HTTP协议标准的早期并不存在,而是在HTTP 1.1 才开始被引入到协议中。


chunked编码允许服务器发出的数据被分成多个部分,这样,服务器就可以在发送数据前无需知道待发送内容的总大小。因为它不需要填充Content-Length”字段。


当HTTP使用chunked编码进行传输的时候,在HTTP头部会出现字段“Transfer-Encoding: chunked”。同时,Content-Length”字段相应地就不会出现了。


如图:

640?wx_fmt=jpeg


当HTTP头部标示了HTTP体的数据为chunked编码时,整个HTTP体将是chunked编码。


chunked编码的一般格式如下:

len1 data1 len2 data2 ........0


即数据采用分块的模式进行传输,编码后的每块数据包含一个长度值和对应长度的传输内容,长度值为16进制数据的字符串形式,如上图的b50表示该块数据的传输内容长度为0xb50字节。长度值之后为固定值" ",传输内容之后也是固定值" "。chunked编码的最后一块为“0 ”,即数据块的长度为0。


640?wx_fmt=jpeg


在解析chunked编码时,按每块的长度将传输的内容进行拼接,直至块长为0的块即完成一个chunked编码的解析。如上图的图片,就仅一个0x158字节的数据块,它的第二块chunked就已经是0 ”了


chunked编码很简单,是不是?


不过,在协议还原的实现过程中,如何高效高性能地对chunked进行解码,是一件值得挑战的事哦。毕竟,HTTP的流量占比不小的。


640?wx_fmt=jpeg

长按进行关注。





原文地址:https://www.cnblogs.com/protosec/p/11673331.html