http的分组传输TransferEncodingchunked
最近在一个新项目上遇到一个问题,客户端应用层通过tcp socket接收到的http报文解析突然出错,通过wireshark抓包看到Server端的http报文是tcp分包传输的,刚发送1-2包数据,client端已经开始处理起了报文,并认为报文非法而直接关闭了tcp连接。
那么比较正常的流程和异常流程的HTTP报文,发现异常的时候server http header里面没有
Content-Length字段,取而代之的是Transfer-Encoding:chuunked。
那么为什么chunked编码的报文,client端会解析出错呢?
查看client端的代码发现客户端认为一个完整的http报文的结束是以body的r 作为结束符。但是分块数据的body里面实际是有很多r 的,所以误判了报文已经接收完整。Transfer-Encoding:chunked
chunked是HTTP1.1才支持的分块数据传输,为的是应对发送数据时可以不需要预先知道报文的总大小,而是选择分开发送,一块一块的发送。http body分块数据格式如下/*分块1*/ br 分块1数据的长度b=11, 01234567890r 长度为11的数据data /*分块2*/ 5r 分块1数据的长度5, 12345r 长度为11的数据data /*分块3*/ 7r 1234567r /*结束块*/ 0r 结束块长度必须填0 r
分块数据的长度独占一行,长度值不包括它后面的CRLF(r ),也不包括数据段的结尾的CRLF(r )
分块数据的最后一块分块长度必须是0,data为空。
更多的时候我们习惯了拿别人造好的轮子使用,而忽略了对知识的理解,引以为鉴。