tcpdump无法直接用“fragment”过滤分片包,需通过IP头Flags位(DF=0且MF=1或Offset>0)精准识别IPv4分片;IPv6分片不在常规检测范围内,需用Wireshark等工具分析。

tcpdump 本身不能直接用一个简单关键字(比如 fragment)来“过滤出所有碎片分片包”,但可以通过检查 IP 头部的标志位和分片偏移字段,精准识别 IPv4 分片数据包。IPv6 的分片处理不同,且通常由源端完成、中间设备不参与,一般不在 tcpdump 常规分片检测范围内。
识别 IPv4 分片包的核心依据
IPv4 头中两个关键字段决定是否为分片:
- Flags 字段的第2位(DF位)为0,且第1位(MF位)为1:表示“更多分片”(More Fragments),是中间分片
- Flags 第2位为0,且 Fragment Offset > 0:表示该包是后续分片(含最后一个);Offset=0 且 MF=0 是首片(可能也是唯一一片)
- 注意:DF=1(Don’t Fragment)的包不是分片,而是禁止分片的请求;它本身不构成分片流的一部分
实用的 tcpdump 过滤表达式
以下命令基于 IP 头偏移量(ip[6:2])和标志位(ip[6]&0x20 = 0 表示 DF=0)组合判断,适用于大多数场景:
- 抓取所有**非首片分片**(即 Offset > 0 的包,含中间片和末片):
sudo tcpdump -i eth0 'ip[6:2] & 0x1fff != 0 and ip[6] & 0x20 = 0' - 抓取所有**分片相关包**(首片 + 中间片 + 末片,只要参与分片):
sudo tcpdump -i eth0 'ip[6] & 0x20 = 0 and (ip[6:2] & 0x1fff != 0 or ip[6] & 0x10 != 0)'
(其中ip[6] & 0x10 != 0表示 MF=1,即“还有更多分片”) - 只抓**首片**(Offset=0 且 MF=1,典型首片特征):
sudo tcpdump -i eth0 'ip[6:2] & 0x1fff = 0 and ip[6] & 0x10 != 0 and ip[6] & 0x20 = 0'
使用时的关键提醒
这些表达式依赖对 IP 头结构的理解(IP 头第6–7字节为 Flags + Fragment Offset),实际效果受以下因素影响:
- 必须加
-n避免 DNS 解析干扰输出,加-v可验证是否真为分片(输出中会显示 frag 或 frag … 字样) - tcpdump 默认截断包长(-s 68),若想看清分片上下文或载荷,建议加
-s 0抓全包 - 某些网卡或驱动可能在硬件层面重组分片(如 LRO/GRO 启用),导致你根本看不到分片包——需确认
ethtool -k <iface>中 generic-receive-offload 和 large-receive-offload 为 off - IPv6 分片头是扩展头,tcpdump 不支持直接用 BPF 过滤;如需分析 IPv6 分片,推荐先用
-w保存再用 Wireshark 或 tshark 解析
快速验证是否捕获到分片
运行后观察输出,分片包典型显示类似:
10:22:33.123456 IP (tos 0x0, ttl 64, id 12345, offset 1480, flags [+], proto TCP, length 1500) 192.168.1.100.12345 > 10.0.0.5.80: Flags [.], seq 12345:13825, ack 6789, win 501, options [nop,nop,TS val 123456789 ecr 987654321], length 1480其中 offset 1480 和 flags [+](即 MF=1)就是明确标识。


















