1. ICMP分片包头部信息解析误区
第一次用Wireshark分析大尺寸ICMP包时,我也被它的显示方式误导过。当时执行ping 10.26.174.99 -l 3000命令发送3000字节的ICMP请求,Wireshark却在最后一个分片条目下完整显示了ICMP头部,这让我误以为所有分片都携带协议头。直到对比了各分片的原始字节,才发现Wireshark的这个"善意谎言"。
关键发现:Wireshark为了便于分析,会将重组后的完整协议头挂在最后一个分片显示,但实际传输时只有第一个分片包含真实的ICMP头部。
2. 分片包结构深度解析
2.1 标准分片包组成
当ICMP报文超过MTU(通常1500字节)时,IP层会进行分片处理。以以太网环境为例:
-
第一片分片结构:
plaintext复制
[14字节以太网头] + [20字节IPv4头] + [8字节ICMP头] + [部分数据]其中ICMP头部包含:
- 字节1:Type(类型,请求为8/回复为0)
- 字节2:Code(代码,通常为0)
- 字节3-4:Checksum(校验和)
- 字节5-6:Identifier(进程标识符)
- 字节7-8:Sequence Number(序列号)
-
后续分片结构:
plaintext复制
[14字节以太网头] + [20字节IPv4头] + [纯数据]这些分片不再重复携带ICMP头部,仅包含数据部分。
2.2 Wireshark的重组机制
Wireshark默认开启的"Reassemble fragmented IPv4 datagrams"功能工作原理如下:
- 分片收集:通过IP头的Identification字段识别属于同一数据包的所有分片
- 分片判定:根据Fragment Offset和MF(More Fragments)标志判断分片顺序
- 数据重组:收到MF=0的最后一片后,将所有分片按offset拼接
- 协议解析:将重组后的完整数据挂在最后一个分片条目下显示
这种设计虽然方便查看完整报文,但会掩盖真实的传输细节。要查看原始分片信息,需要:
bash复制# 在Wireshark过滤器中关闭重组功能
ip.flags.mf == 1 # 只显示非最后分片
3. 实操验证与字节对比
3.1 实验步骤还原
- 发送分片ICMP请求:
powershell复制ping 10.26.174.99 -l 3000 -n 1 - 在Wireshark中捕获流量,过滤:
bash复制
icmp || (ip.flags.mf == 1) - 分别查看第一个和最后一个分片的原始字节:
| 分片位置 | 关键字段 | 字节偏移 | 示例值 |
|---|---|---|---|
| 第一片 | ICMP Type | 34(0x22) | 08 |
| 第一片 | Identifier | 38-39 | 0x3a5b |
| 最后片 | 相同位置 | 34-39 | 随机数据 |
3.2 分片识别技巧
在原始分片分析时,注意以下IP头字段:
- Identification:16位标识符,相同值表示同一组数据包
- Fragment Offset:13位偏移量,单位8字节
- MF标志:1表示还有后续分片,0表示最后一片
典型分片特征:
plaintext复制分片1:MF=1, Offset=0
分片2:MF=1, Offset=185 (1480字节后)
分片3:MF=0, Offset=370 (2960字节后)
4. 常见问题排查指南
4.1 分片相关故障场景
-
分片丢失:
- 现象:Wireshark只显示部分分片
- 排查:检查中间设备的ACL是否过滤了分片包
bash复制# 查看防火墙规则 iptables -L | grep "fragment" -
分片重组失败:
- 现象:收到所有分片但无法重组
- 检查:各分片的Identification字段是否一致
-
MTU不匹配:
- 现象:大包通信失败但小包正常
- 测试:执行Path MTU发现
bash复制ping -M do -s 1472 10.26.174.99
4.2 Wireshark分析技巧
- 查看原始分片:
- 右键分片条目 → "Decode As..." → 取消IPv4重组
- 分片统计:
bash复制Statistics → IPv4 Statistics → All Addresses → "Fragments"列 - 过滤特定分片:
bash复制ip.id == 0x3a5b && ip.flags.mf == 1 # 查看某ID的非最后分片
5. 协议分析经验总结
在实际网络分析中,分片行为会带来几个关键影响:
-
性能影响:
- 分片/重组消耗CPU资源
- 任一分片丢失需重传整个数据包
- 建议应用层控制包大小避免分片
-
安全考量:
- 部分防火墙不检查后续分片
- 可构造异常分片绕过检测(如Tiny Fragment攻击)
-
调试建议:
- 关键业务避免依赖分片
- 测试环境用
ping -f强制不分片测试 - 持续监控分片统计:
bash复制
netstat -s | grep -i fragment
通过这次深度分析,我更加理解了协议分析工具"美化"显示背后的真实网络行为。这也提醒我们:当工具显示与理论预期不符时,要深入字节层面验证,才能避免被表象误导。