IP分片中偏移单位为8B的解释

最近遇到一个问题:为什么IP中的偏移单位是8B而不是4或16等其他字节?上网查了一下,发现回答往往是RFC的规定,IP的规定,并没有做出实质性的解释。

再仔细研究一下IP头中每个字段的含义,终于发现偏移单位定为8B是有其原因的。它是由IP头部格式中的“总长度(16bit)”和“偏移(13bit)”两个字段所决定的。总长度定义了IP包的最大长度为2^16=64KB,偏移说明了IP分片时它最多能表示2^13个偏移单位,这样偏移单位就是2^16/2^13=2^3,即为8B了。如果偏移单位不是8B,如选4B,则13bit的"偏移"就不能表示出IP的最大长度了,而如果选16B,只需要12bit的"偏移"就能表示出IP的最大长度了,即偏移单位小于8B时,“偏移”不能够表示出IP的最大长,偏移单位大于8时,“偏移”不会被完全利用。以8B做为偏移单位正好合适。

转自:http://ilinger.blog.hexun.com/26152266_d.html

由于链路MTU(maxiun transmit unit)大小的约束,ip报文要分片。

IP首部包含了分片和重组所需的信息:

  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  | Identification |R|DF|MF| Fragment Offset |

  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

  |<-------------16-------------->|<--3-->|<---------13---------->|

  Identification:发送端发送的IP数据包标识字段都是一个唯一值,该值在分片时被复制到每个片中。

  R:保留未用。

  DF:Don't Fragment,“不分片”位,如果将这一比特置1 ,IP层将不对数据报进行分片。

  MF:More Fragment,“更多的片”,除了最后一片外,其他每个组成数据报的片都要把该比特置1。

  Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。

  另外,当数据报被分片后,每个片的总长度值要改为该片的长度值

posted @ 2012-12-04 17:03  静心小阁  阅读(7078)  评论(0编辑  收藏  举报