应用层报文判读71 条

Chunked 传输判读

Transfer-Encoding: chunked 表示实体分块发送、以 0 长度块收尾:流式接口常见;缺少结尾 0 块说明传输未完成。

分块传输是怎么回事

当响应长度无法事先确定时,服务端会用 Transfer-Encoding: chunked 把实体拆成若干块陆续发出,每块前面是十六进制的长度,最后以一个长度为 0 的块收尾。这是流式接口、服务端推数据、边算边发的典型做法。判断响应是否完整,关键看有没有收到结尾的 0 块;只有中途断开、缺少结尾标记,才说明传输没有走完。

基本信息

适用平台Wireshark / tshark 解析的 HTTP/1.1 流量
过滤字段http.transfer_encoding contains "chunked"
结束标记长度为 0 的块,其后可跟可选的尾部字段
与长度头关系使用分块传输时通常不再出现 Content-Length

典型使用场景

  • 流式接口迟迟没有返回完整数据,确认传输是否正常结束
  • 排查客户端解析报错,判断是分块格式问题还是内容问题
  • 验证网关是否对分块响应做了缓冲,压缩了流式的意义
  • 统计首块到达时间,量化服务端首个字节的响应速度
  • 确认长连接上多次响应之间是否被正确切分
  • 为「下载进度不动但连接仍在」类问题提供证据

观察要点

观察要点
http.transfer_encoding contains "chunked"
# 分块头部形如: 1a3\r\n……数据……\r\n (1a3 为十六进制长度)
# 结尾: 0\r\n\r\n,其后可能有 trailer 或直接结束
# Wireshark 的 Dechunked 视图可直接查看重组后的实体
# 缺少 0 块即视为未正常结束,需与连接关闭原因一起看

观察项逐项读法

观察项含义正常与异常
Transfer-Encoding声明分块传输与 Content-Length 同时出现属可疑
分块长度行十六进制表示的本块字节数出现非法字符即格式异常
0 块实体结束标志缺失说明传输未完成
首块到达时间服务端首字节耗时偏大指向服务端处理或缓冲
连接关闭方式流结束后的收尾被重置关闭说明有中断方
分块大小与网络分片无关:一个块可能跨多个 TCP 报文段,按段计块会得出错误的块数。
分块传输的耗时统计要基于块到达时间而非仅首尾之差,否则会漏掉分块之间的应用侧停顿。

易错点

  • 按块大小重算耗时:块之间的等待往往来自应用生成数据,只看首尾会低估真实停顿
  • 把分块与分片混为一谈:分块是应用层概念,分片是网络层概念,两者的成因与排查方向完全不同
  • 忽略结尾 0 块:没有 0 块说明传输未完成,此时基于内容的结论都不可靠
  • 在中间设备侧抓包判读流式效果:缓冲型网关会把分块攒起来再发出,看到的形态不代表服务端实现

数据来源与参考

  • RFC 9112(分块传输)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌