为什么使用Transfer-Encoding头的HTTP请求在Wireshark中未被识别
问题描述
这是携带Content-Length头的POST方法HTTP请求:
POST /pg3.php HTTP/1.1 Host: 10.10.10.8 Content-Type: application/x-www-form-urlencoded Content-Length: 11 Connection: keep-alive Cookie: pg3_cookie=123456 user=mehran
这是携带Transfer-Encoding头的POST方法HTTP请求:
POST /pg3.php HTTP/1.1 Host: 10.10.10.8 Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked Connection: keep-alive Cookie: pg3_cookie=123456 11 user=mehran 0
我在服务端使用Wireshark抓包时发现,第二个使用Transfer-Encoding头的请求未被识别为HTTP请求,仅被识别为包含HTTP请求内容的TCP push报文,第一个携带Content-Length头的请求识别正常。请问出现该现象的原因是什么?
原因说明
核心原因是你构造的分块编码HTTP请求不符合RFC 7230规范,Wireshark的HTTP解析器无法完成完整的报文校验,因此不会将其标记为HTTP协议报文,只能识别为普通TCP报文,具体问题如下:
- 块长度字段使用了十进制值而非规范要求的十六进制值。你提交的请求体内容
user=mehran实际长度为11字节(十进制),对应的十六进制表示应为B,但你填写的块长度为11,换算为十进制是17字节。HTTP解析器会尝试读取17字节的块内容,但实际仅收到11字节,长度不匹配直接导致解析中断。 - 分块编码的结束标记不完整。按照规范,最后一个长度为0的块之后需要追加两个连续的CRLF(即空行)标识整个请求体结束,你给出的请求中
0之后缺少对应的空行,也会导致解析器判定报文不完整。
如果排除报文构造问题后仍识别异常,可以排查Wireshark配置:
- 确认Wireshark的TCP解析配置中已开启「Allow subdissectors to reassemble TCP streams」选项,HTTP分块编码的解析依赖TCP流重组能力,未开启时也可能出现单段识别失败的情况。
- 如果请求被拆分为多个TCP段发送,可以右键点击对应TCP流选择「Follow->HTTP Stream」,即可查看重组后的完整HTTP报文。
内容的提问来源于stack exchange,提问作者mehran_2020
相关产品推荐
相关产品推荐

