IP分片

IP报文分片与重组

数据链路层中的每条数据链路的MTU都不一样,比如以太网的MTU为1500字节,而FDDI为4352字节等等。但是IP位于数据链路层的上一层,它必须不受限于不同数据链路的MTU大小。任何一台主机都有必要对IP分片进行相应的处理,分片往往在网络上遇到比较大的报文无法一下子发送出去才会被处理。
用一个例子来进行说明,如下图我们使用两个数据链路来完成数据传输,左边我们使用FDDI的数据链路,其MTU为4352;右边我们使用以太网的数据链路,MTU为1500;由于以太网的MTU是1500字节,因此4352字节的IP数据报无法在一个帧当中发送完成。这时候路由器就会将此IP数据报分成3个分片进行发送。经过分片之后的IP数据报只能由目标主机进行重组(重组主要是根据IP首部中16位标识来判断我接收的数据报有哪几片,然后根据13位片偏移字段将这些分片有序的进行重组)
IP分片_第1张图片

路径MTU

分片机制有他的不足-路由器的处理负荷加重。现在计算机网络的物理传输速度不断上升以及人们对网络安全的要求越来越高,所以对于路由器来说要做的事情也越来越多的。为了解决这个问题我们引入了路径MTU

  • 路径MTU:发送端主机到接收端主机不需要分片时最大MTU的大小,而是取路径中存在的所有数据链路中最小的MTU。然后发送端主机按照路径MTU的大小来进行数据报的分片后进行发送,路由器只负责转发这些分片。

路径MTU的原理

首先发送端主机在发送IP数据报的时候将首部的3位标志位中的分片禁止标志位设置为1(就意味着不分片)。根据这个标志位,途中的路由器即使遇到只有分片才能处理的大包,也不会去分片,而是将这个包丢弃。随后通过一个ICMP的不可达消息将数据链路上MTU的值发送给主机。
下一次从发送给同一目标主机的IP数据报获得ICMP所通知的MTU值以后,将它设置为当前MTU。发送主机根据这个MTU对数据报进行分片处理。如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP通知的MTU是一个合适的MTU值。当MTU的值比较多的时候,最少可以缓存约十分钟,在这十分钟内使用刚刚求得的MTU。但是过了这十分钟之后则重新过根据数据链路上的MTU做一次路径MTU发现。
IP分片_第2张图片

例子

数据报的数据部分为5000字节长(使用固定首部),需要分片长度不超过1500字节的数据报片。因固定首部长度为20字节,因此每个数据报片的长度不能超过1480字节。于是分为4个数据报片,其数据报片的数据部分长度分别为1480字节、1480字节、1480字节和560字节。原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。分片结果如下图所示:
IP分片_第3张图片

你可能感兴趣的:(Linux)