IP“碎片化”

当IP层接收到报文时,首先决定转发接口,接着询问转发接口的MTU(即最大可以发送多大的报文),IP会比较MTU和报文的大小,接着决定是否要“碎片化”(即把一个大的报文分成几个小的报文)。


碎片化的IP报文在到达最终目的地后才会重组,重组信息由IP头部提供(有些网络层协议的“碎片”在下一跳路由器重组),接下来填之前IP头部报文字段的坑。


标识字段唯一的标识了一个IP报文,同一IP报文的所有“碎片化”IP报文都含有相同的标识字段,flags字段运用一位表示是否还有更多“碎片”,除了最后一片“碎片”,所有的“碎片”都会将该位置1,片段偏移字段包含该“碎片”在原IP报文中的起始位置,若把原IP报文看成是数组,则片段偏移字段相当于下标。“碎片”的IP头部的长度字段是该“碎片”的长度,不是原IP报文的长度。


在flags区域有个位表示“不允许碎片化”,一旦开启,IP层在需要“碎片化”时也不会“碎片化”,它会丢弃该报文,同时返回ICMP需要进行分片但设置不分片比特报文给发送源,这个特性很有用,待会会讲


“碎片化”应该尽可能的避免,原因如下:

一旦某个“碎片”丢失,就要重传整个报文(因为我们不清楚如何进行分片的),在拥塞的网络下,“碎片”可能增加网络拥塞,而且“碎片”的数量越多,发生丢包的可能性就越高。“碎片”化的另一个坏处是若未接收到第一片“碎片”并且此时出现错误,则不会组织ICMP错误报文,因为ICMP错误报文需要传输层的头部,只有第一个“碎片”存在传输层头部。

当IP层接收到第一片“碎片”时,会开启一个计时器,当这个计时器到期,而“碎片”还没有完全到达时,IP层便会丢弃所有的“碎片”,如果没有定时器,则接收主机的缓冲区可能会溢出。

ICMP需要进行分片但设置不分片比特报文

结构如下:

IP“碎片化”_第1张图片

下一站网络的MTU为选填项,路由器可以选择不填。


你可能感兴趣的:(网络协议)