抓 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 != 0 | MF 置位的片 | 只看后面还有内容的片 |
| ip[6:2] & 0x1fff != 0 | 偏移非 0 的片 | 只看后续分片 |
| 需分片的通知报文 | ICMP 类型 3 代码 4 | 确认路径 MTU 问题 |
首个分片带完整的传输层头,后续片没有;按端口过滤会漏掉后续分片,排查时应去掉端口条件。
抓不到需分片的通知报文不代表路径没有问题,这类 ICMP 常被策略设备限速或直接丢弃。
补充要点
- 分片只在特定路径上出现,抓包点选在瓶颈链路更能反映真实情况
- 先统计分片规模,再决定是调整 MTU 还是优化应用报文大小
- 分片与隧道封装叠加时,长度换算需要逐层扣减头部开销
- 重组后的完整报文需交给支持重组的工具查看
看到分片先确认是否为路径 MTU 发现机制失效造成的退路行为,再决定怎么调整。