丢包与时延定位60 条

分片丢失观察

UDP 大报文分片后丢任一片整体不可用:抓包中不完整的分片组(缺片)即证据;分片环境对丢包更敏感。

分片丢失为什么更致命

IP 分片把一个大报文拆成多个片段传输,接收方只要缺任意一片就无法重组,整个报文作废。TCP 有重传兜底,UDP 大报文只能等应用超时,所以依赖分片的应用对丢包格外敏感。抓包上的表现是同一 IP 标识的分片组缺片,或者出现分片重组超时的 ICMP 消息。

基本信息

关键字段ip.flags.mf、ip.frag_offset、ip.id、ip.len
相关 ICMPtype 3 code 4(需分片但 DF 置位)、type 11 code 1(重组超时)
观察对象同一 ip.id 的分片是否齐全
常见场景UDP 大报文、隧道内层、老式应用协议

典型使用场景

  • UDP 应用间歇失败但小报文正常,怀疑大报文被分片后丢失
  • 排查 DNS 响应偏大时走分片被中间设备丢弃
  • 隧道环境中内层大包丢失,与封装开销有关
  • 确认问题出在 MTU 而不是应用逻辑
  • 评估安全设备对分片的处理差异导致的不一致现象

检查分片完整性

检查分片完整性
tshark -r t.pcap -Y "ip.flags.mf==1 || ip.frag_offset>0" -T fields -e ip.src -e ip.id -e ip.frag_offset -e ip.len
# 按 ip.id 分组后检查片段是否齐全,缺任意一片整包即作废
tshark -r t.pcap -Y "icmp.type==11 && icmp.code==1" -T fields -e ip.src -e ip.dst
# 分片重组超时,说明接收侧等不到全部片段
tshark -r t.pcap -Y "icmp.type==3 && icmp.code==4" -T fields -e ip.src
# 需分片但 DF 置位,路径 MTU 不足的直接信号

字段逐项读法

字段含义读法
ip.flags.mf还有后续分片非最后一片为 1,最后一片为 0
ip.frag_offset分片偏移,单位 8 字节偏移为 0 的是第一片
ip.idIP 标识同一分片组共享同一个值
ip.len该片长度最后一片通常比前面的片小
frame.len整帧长度用于核对是否被 snaplen 截断
分片与乱序不是一回事。乱序到达的片段按偏移排齐后仍能重组,缺片则必然失败。分析前先按 ip.id 排序,再判断到底是真的缺片还是只是顺序颠倒。
分片在不同抓包点的可见性不同:下游没抓到某一片,不等于上游没发。要判断丢在哪一跳,必须在两端或多点同时抓包,并统一过滤条件与时间窗。

排查顺序

  • 先确认报文是否真的被分片:过滤 mf 置位或偏移大于 0 的帧
  • 按 ip.id 分组,逐组检查片段是否齐全、偏移是否连续
  • 确认是否存在重组超时或需分片的 ICMP 差错消息
  • 核对路径 MTU,检查是否因隧道封装或链路 MTU 较小导致
  • 条件允许时在应用侧改用不分片的大报文方案,从根上规避分片

易错点

  • 把乱序当成缺片:不排序就下结论,容易误报丢包
  • 只用下游抓包判断上游是否发送:单点数据无法确定丢包位置
  • 忽略 MTU 与封装开销:隧道环境下内层大包会被反复丢弃,现象却像应用故障
  • 用过小的 snaplen 采集:分片帧被截断,偏移与长度字段无法判读

数据来源与参考

  • RFC 791(IP 分片)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌