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