我们都知道,在以太网中,如果源主机向目标主机发送的数据包大于网关
MTU
,则该数据包在传输过程中会被
IP
协议分片传输,具体的分片过程是怎样的呢?我们通过协议分析软件抓包来进行详细的查看(抓包软件使用科来网络分析系统)。
因为以太网默认的
MTU
值为
1500Byte
,所以,为了达到分片的效果,我们应该传输大于
1500Byte
字节的数据包,才能使该数据包分段传输。
我们从本机(
192.168.6.11
)发送一个
2000
字节的数据包到局域网的另一台主机(
192.168.0.208
)为例,在传输的过程中,开启软件抓包,就能够查看到详细的分片结果。
我们以
ping
为例,在
Windows
命令提示符下输入:
ping 192.168.0.208 –l 2000
通过科来网络分析系统抓包,我们看到,该数据包被分片了,由于我们重复
Ping
了
4
次,所以,抓到了
4
次同样的请求与回显的数据包。如下图:
查看详细的数据包解码(见下图):
分析:因为
ping
的长度是
2000
字节,大于了
MTU
的值,所以会分片发送
,
如上图。捕获的这个数据包总长度为
1500
字节,更多分段位置
1
,表示还有数据分段。
s,
偏移量为
0
,需要注意的是
IP
头部的总长度字段值(这里是
1500
字节)并不全是数据的净载荷长度,这里还包括了
IP
以及
ICMP
的头部长度,分别是
20
字节和
8
字节。
另外,
IP
协议的头部总长度并不一定就是
MTU
值
1500
字节,这个值与网络环境、操作系统等因素有关。
下图是第一个分片包。
分析:
IP
字段的标识
0x787F
,与第一个包相同,说明这是同一个数据包,只是被分片了。
偏移量为
185
,表示相对第一个包的位置,以便接收主机根据偏移量进行数据重组。
需要注意的是此处分片包并没有
ICMP
字段,接收主机会可以根据偏移重组成完整的
ICMP
数据包。
最后,我们来计算一下该数据包的长度:第一个数据包的总长度为
1500
字节,减去
IP
头部长度
20
字节,减去
ICMP
头部长度
8
字节,即
1500-20-8
=
1472
字节;第二个数据包的总长度为
548
字节,减去
IP
头部长度
20
字节,即
548-20
=
528
字节,两个数据包的净载荷
1472+528
=
2000
,正好是我们发送的数据长度。
以上是对
IP
分片的个人理解,有不对的地方欢迎大家交流指正。
转载于:https://blog.51cto.com/lbzxy/128782