基于Ping命令的IP分片数据分析 (IP4)
概述: 为了让分片的数据变的清晰,本次测试只使用了ICMP的Request和reply,也即通过Ping命令对路由发送数据包。
Ping 192.168.1.1
说明:Ping默认以32bit字节的数据包发送请求,所以一般是不分片的,这里首先大概熟悉一下ip数据包和相关环境。
分析:
1 默认ping是4次请求的,所以通过上图可以看到请求、回复成对出现的8个数据包
2 首先看第一个数据包的数据如下图所示,可以看到Flags标志的“More fragments”位为0表示这是最后一个分片了,也就是说没有分片,所以Fragment offset自然也是0.
3 再来看看长度关系:
3.1 Total Length=60表示整个IP数据包长度是60字节
3.2 Header length=20表示IP头长度是20字节(也即IHL的值为5的通用ip头长度)
3.3 ICMP的数据长度是32字节
3.4 ICMP头的长度固定为8字节
3.5 60=20+32+8刚好成立
Ping 192.168.1.1 –l 2000
说明:一般来说MTU为1500,所以要让ip进行分片传送,数据包的长度必须 > 1500-20,这里的20是ip头的最小长度。使用长度超过1480的数据包来Ping都是会拒绝的,至于原因,本人也不清楚,有兴趣的可以自己研究一下,知道的也可以顺道告知一声,不胜感激。
分析:
1 可以看到现在的数据包和刚才不一样了,每个ICMP请求之前都先有一个IP包。
2 首先来看看第一个数据包(IP包),MF标志=1说明后面还有分片,offset=0表明这是第一个分片,分片id为0x2e6b。ip包长度为1500,ip头长度是20
3 再来看看第二个数据包(ICMP包),offset=1480表示这个数据包在分片之前的偏移,MF=0说明这是最后一个分片,id同样=0x2e6b表明和第一个数据包在分片之前属于同一个数据包。Ip包长度为548,ip头长度为20 (wireshark的Data部分在ip的最后一个分片中会重组所有IP分片,然后显示所有数据长度,所以在这里不以这个数字来分析)
4 好了,现在来看看各个长度和偏移
4.1 第一个数据包的IP->Total Length为1500
4.2 第一个数据包的IP->Header length为20
4.3 第二个数据包的IP->Total Length为548
4.4 第二个数据包的IP->Header length为20
4.5 第二个数据包的ICMP头长度为8
4.6 我们发送的数据包长度为2000
4.7 2000=1500-20+548-20-8正好成立
Ping 192.168.1.1 –l 4000
说明:增加一点数据包的长度,主要是和Ping 2000的时候作比较,了解ICMP协议头出现的位置。
分析:可以看到是2个IP然后一个ICMP
1 我们来看看第三个数据包(也即第一个ICMP包)
2 可以看到偏移是2960,MF=0,这是最后一个分片。也就是说IP分片的最后一个数据包才包含ip上层协议的协议头信息。
本文通过 Ping 命令深入分析IP分片现象,详细解释了不同数据包长度下IP分片的规则,包括Flags标志、Fragment offset、Total Length、Header length等关键字段,并探讨了大于MTU值的数据包处理方式。
1万+





