通常ping命令发送的icmp包的大小是一定的,比较小。
如果要使发送的包在发送过程中分片,要使用参数加大ip包的负载,也就是icmp包的大小。
-l 选项可以设置IP包的负载大小,后面的数值设置icmp包数据区域的大小。(不是icmp包的大小)
-f 选项设置ip包头的DF选项(不进行分片)
发包:
设置icmp包的大小为1473B
Wireshark抓包:
24 25 28 29 为一组icmp回显请求/应答包。
24 25号是对原始数据包(20B + 8B + 1473B)的分片
24号包:
偏移量为0,说明是第一个分片。
总长度为1514B包括(14B以太网帧头 + 20BIP包头 + 1480B的数据), 此时的IP包长为20B+1480B = 1500B,刚好为以太网MTU的大小。
25号包:
长度明明是35B,但是这里有一个icmp包的包头,还有1473B的数据,而且刚刚24号包里好像也没有看到ICMP的包头,难道是分片后把icmp的包头放到了第二个包里发送?
对25号包里的icmp包头的出现应该是wireshark自动分析的结果,这个包里其实是没有这个包头的,只有分片后剩余的1B的数据。(35 - 20B -14B),在Wireshark中显示这个结果应该是Wireshark的分析。
而且刚刚24号包中是有icmp的包头的:
上图标出的8字节数据其实就是icmp的包头。那么24号包发送的数据就是1480-8 = 1472B,8为1480中的icmp包头。
25号包发送了1B的数据,加起来刚好是ping -l选项中设置的1473。
MTU:是链路层的概念,指的是链路层最大传输数据包的大小,限制的是上层的包的大小,比如MTU为1500,指的是IP包超过这个值会分片。
在ipv4中,分片可发生在主机或路由器上,但重组只能发生在源主机上,
原因:1、减轻路由器的负担 2、IP是无连接的协议,各数据包相互独立,可不按同一条路径进行传输,那么一台Router自然接收不到完整的包的集合,而是所有包的一部分,无法完成重组。
在抓包过程中IP头中相应标志位的变化没有列出,篇幅有限。