tcpdump 抓 IP 分片

用 ip 头部标志位与偏移过滤分片报文:MF 标志(0x2000)或分片偏移非 0 均可识别,大包被丢、PMTUD 异常时会看到残片。

抓 IP 分片

分片由 IP 头里的标志位与片偏移共同标识:MF 位表示后面还有分片,片偏移非 0 表示这是后续片。tcpdump 可以用字节偏移表达式一次覆盖两种情形:ip[6:2] & 0x3fff != 0。抓包中看到分片,通常说明路径 MTU 小于报文长度,或者路径 MTU 发现机制没有正常工作。

基本信息

适用平台Linux / macOS / BSD 上的 tcpdump
语法ip[6:2] & 0x3fff != 0(MF 或偏移非 0)
细分写法ip[6] & 0x20 != 0 只看 MF 置位;ip[6:2] & 0x1fff != 0 只看后续片
IPv6 差异分片信息位于扩展头,该表达式不通用
重组查看需要 Wireshark 等工具完成重组

典型使用场景

  • 大包不通但小包正常,核对链路上是否出现分片
  • 验证路径 MTU 发现机制是否被策略设备阻断
  • 统计分片报文规模,评估对转发性能的影响
  • 配合需分片的通知报文定位 MTU 瓶颈位置
  • 排查某些安全设备对分片处理不一致导致的问题

常用示例

常用示例
tcpdump -i eth0 -nn 'ip[6:2] & 0x3fff != 0' -c 20              # 所有分片
tcpdump -i eth0 -nn -v 'ip[6] & 0x20 != 0' -c 10                # 只看 MF 置位的片
tcpdump -i eth0 -nn -v 'ip[6:2] & 0x1fff != 0' -c 10            # 只看偏移非 0 的后续片
tcpdump -i eth0 -nn 'icmp and icmp[0] = 3 and icmp[1] = 4'      # 需要分片的通知

表达式与用途

表达式匹配内容用途
ip[6:2] & 0x3fff != 0全部分片统计分片总量
ip[6] & 0x20 != 0MF 置位的片只看后面还有内容的片
ip[6:2] & 0x1fff != 0偏移非 0 的片只看后续分片
需分片的通知报文ICMP 类型 3 代码 4确认路径 MTU 问题
首个分片带完整的传输层头,后续片没有;按端口过滤会漏掉后续分片,排查时应去掉端口条件。
抓不到需分片的通知报文不代表路径没有问题,这类 ICMP 常被策略设备限速或直接丢弃。

补充要点

  • 分片只在特定路径上出现,抓包点选在瓶颈链路更能反映真实情况
  • 先统计分片规模,再决定是调整 MTU 还是优化应用报文大小
  • 分片与隧道封装叠加时,长度换算需要逐层扣减头部开销
  • 重组后的完整报文需交给支持重组的工具查看
看到分片先确认是否为路径 MTU 发现机制失效造成的退路行为,再决定怎么调整。

易错点

  • 在分片过滤上叠加端口条件,导致后续分片全部漏掉、样本不完整
  • 沿用 IPv4 表达式抓 IPv6 分片:结构不同,表达式失效
  • 看到分片就认定网络故障:小报文控协议下的分片可能是设计使然,需结合 MTU 与业务判断

数据来源与参考

  • man 8 pcap-filter
  • RFC 791(IP 分片字段)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌