前面有一篇文章是关于使用zlib库函数解压以gzip压缩方式传输的http报文。里面提到了chunked分块传输格式,现在由于项目需要,做了这部分的研究,现在把成果记录下来。
首先介绍一下chunked分块传输格式。对于一般的http报文,使用Content-Length字段标明报文长度,但是对于那些无法事先确定报文大小的网页而言,就只能使用chunked编码方式。对于这种方式的报文,一般会使用transfer-coding字段标明是chunked分块传输格式。
Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。对于使用gzip压缩格式的报文而言,http报文先被压缩后被分块,所以我们应该先把数据包重组,然后再进行解压。简单来说,其格式如下:
[Chunk大小][回车][Chunk数据体][回车]…(中间若干个chunk块)…[0][回车][footer内容(有的话)][回车]
最后一个chunk块长度为0,footer内容也一般为空。
下面举个例子,这是我用wireshark抓的一个数据包,头部的transfer-coding字段标明为chunked编码方式。“0d 0a 0d 0a”四个字节表示头部结束,接下来便是报文主体。“32 35”为第一个chunk块的长度,注意chunk-size是以十六进制的ASCII码表示的,所以其长度其实是十六进制的“25”,即37个字节。再接下来是第二个chunk块,然后注意“30 0d 0a 0d 0a”部分,30表示本chunk块长度为0,也即chunk串的结束标志。
0000-000F 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
0010-001F 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content-Type: t
0020-002F 65 78 74 2f 70 6c 61 69 6e 0d 0a 54 72 61 6e