码迷,mamicode.com
首页 > 其他好文 > 详细

IP数据报的分片和组装原理

时间:2016-07-22 19:39:04      阅读:2177      评论:0      收藏:0      [点我收藏+]

标签:ip数据报的分片和组装原理


   一份数据从一个主机通过路由器发送给另一个主机时,要经过很多路由层转发的。过程比较复杂,那么IP在路由层到底是以怎样的形式转发和目的主机这份数据报的时候又是如何处理的?

   首先我们需要了解数据报的格式:

技术分享技术分享


IP的转发和控制都是由IP数据报的头部决定


4位首部长度的数值是以 4字节为单位的,最小值为 5,也就是说首部长度最小是 4x5=20字节 ,

也就是不带任何选项的 IP首部 ,4位能表表示的最大值是 15,也就是说首部长度最大是 60字 节


8位TOS字段有 3个位用来指定IP数据报的优先级 (目前已经废弃不用 ),还有4个位表示可选

的服务类型 (最小延迟、最大呑吐量、最大可靠性、最小成本 ),还有一个位总 是0。


16位总长度是整个数据报 (包括IP首部和 IP层payload)的字节数。

每传一个 IP数据报 ,16 位的标识加1,可用于分片和重新组装数据报。


3位标志和13位片偏移用于分片 。

TTL(Time to live) 是这样用的 :源主机为数据包设定一个生存时间 ,比如 64,每过一个路由器

就把该值减 1,如果减到 0就表示路由已经太长了仍然找不到目的主机的网络 ,就丢弃该包 ,因此

这个生存时间的单位不是秒 ,而是跳 (hop)。


协议字段指示上层协议是 TCP、 UDP、 ICMP还是 IGMP。

然后是 校验和, 只校验IP首部 ,数据的校验由更高层协议负责。

IPv4的IP地址长度为 32位。


    在IP数据报中总长度是16位的字段,一次数据 报的最大长度为2^16-1,虽然尽可能长的数据报能够提高传输效率,但是很少 有超过 1500字节的;所以在这里只要超过1500字节,就认为此数据报该分片了。IP数据报被分片以后,各分片分别组成一个具有IP首部的分组,并各自独立的路由,分别抵达目的主机后,目的主机的IP层会在传送给传输层之前将收到的所有分片重新组装成一个数据报。


一.IP分片

1.IP分片原理:

    分片和重新组装的过程对于传输层是透明的,原因是IP数据报进行分片以后,只有它到达下一站时才可以 进行重新组装,且它是由目的端的IP层来完成的,分片之后的数据报根据需要可以再次 分片;

     IP分片和完整的报文差不多拥有相同的IP头,ID域对美英分片都是一致的,这样才能在进行组装的时候识别出来 同一个IP数据报文分片。在IP头里面,16位识别号唯一记录了一个IP报的ID,具有同一个ID的IP分片将会重新进行组装;而13位片偏移则记录了某IP片相对于整个包的位置;这两个表中间的3位标志则标志着该分片后面是否还有新的分片。这三个域组成了IP分片的所有信息,接受方可以利用这些信息对IP数据进行重新组装。

(1)标志字段的作用

   0   DF  MF

标志字段共三位,最高位为0,该值必须复制到 所有 分组中


不分片(Do not Fragment ,DF)值必须复制。DF=1表示 接受主机不能对分组进行分片。如果分组的长度超过 MTU,又不可以分片,那么这个分组只能丢弃,并要用ICMP差错报文向源主机报告 。DF=0,表示可以分片


分片(MF)表示分片是不是最后一个分片,MF=1表示接受分片不是 最后一个分片,MF=0表示 接受分片时是最后一个分片


故意发送部分IP分片而不是全部,则会导致目标主机总是等待分片消耗并占用系统资源。


2.MTU(最大传输 单元)原理


    当两台远程CP互联的时候,他们的数据要穿过很多的路由器和各种各样的网络媒介才能到达对端

,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定

    对于网络层的上层协议而言(这里以TCP/IP协议簇为例)他们对水管的粗细不在意因为他们认为 这是网络的事情。网络层IP协议会检测每个从上层协议下来的数据报包的大小 ,并根据本机的MTU大小决定是否分片处理。分片最大的坏处就是降低了传输性能,本来可以一次搞定的事情,分成多次。所以在网络的更高一层(传输层的实现)往往会对此加以注意,因为有些高层因为某些原因可能就要求不能对分组进行分片,索引会在IP数据报的包头加上一个标签:DF这样IP数据包在一大段网络传输的时候,如果遇到MTU小于 数据包的情况,转发设备会根据情况丢掉这个数据包。然后返回一个错误信息给 发送者,这往往会造成通讯上的问题,不过幸运的是大部分网络链路MTU都是1500或者大于 1500

    对于UDP而言,这个协议本身是无连接的协议,对数据包的到达顺序是否正确并不关心,所以一般UDP对分片没有多大要求

    对于TCP就不一样了,这个协议是面向连接的协议,对于 TCP而言它非常在意数据包的到达顺序

以及在传输过程中是否有错误发生,所以有些TCP应用对分片有要求---不能分片

3.MSS(最大报文段长度 )原理


    MSS就是TCP数据包每次能够传输的最大数据分段,为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方MSS的值,这个值TCP协议在实现的时候用MTU代替(要减去IP数据包的包头大小20bites和TCP数据段的包头20BITES)所以MSS大小往往为1460,双方会根据提供的MSS最小值 确定这次连接的MSS最大值


二.IP分片步骤

    一个未分片的数据报的分片信息字段全为0,即多个分片标志位为 0,并且偏移量 为0,分片一个数据报需要经过一下步骤

(1)检查DF标志位,查看是否允许分片,如果设置了该位,则数据报将被丢弃 ,并将ICMP错误返回给源端

(2)基于MTU值,把数据字段分成两个或对个部分,除了最后的数据 部分外,所有新建的数据选项 长度必须为8字节的倍数

(3)每个数据被放入一个IP数据报,这些数据报的包头略微改了原先的报文头

(4)除了最后的数据报分片外,所有的分片都设置了多个分片标志位

(5)每个分片中的片偏移量字段设为这个数据部分在原来数据报中所占的位置,这个位置相对于原来未分片数据报中的开头处。
(6)如果在原来的数据报中包括了选项,则选项类型字节的高位字节决定了这个信息是被复制到所有分片数据报,还是只复制到第一个数据报。
(7) 设置新数据报的报文头字段及总长度字段。
(8)重新计算报文头部校验和字段。

   此时这些分片数据报如一个完整的IP数据报一样被转发,IP独立的处理每个数据报分片,数据报分片能够通过不同的路由 ,到达目的,如果他们通过了那些规定了更小的MTU路由,还能够进一步对他们进行分片

    在目的主机上,数据被 重新组合成原来的数据报 ,发送主机设置的标示字段与数据报中的袁IP地址和目的IP地址一起使用,分片过程不改变这个字段


三 .重组

    为了重新组合这些数据报分片,接受主机在第一个分片到达时分配一个存储缓冲区。这个主机还将启动一个计时器。当数据报的后续分片到达时,数据被复制到缓冲区存储器中片偏移量指定的位置,当所有分片都到达时,完整的未分片的原始数据报就被恢复了。

    如果计时器超时并且分片保持尚未认可状态,则数据将被丢弃。这个计时器的初始值为IP数据报的生存期值,它依赖于实现的,一些实现允许对他进行配置。

重组步骤

在接受方,一个由发送方发出的原始数据IP报,将所有的分片重新组合,才能够提交到上一层协议,每一个将被重组的IP数据报都用一个ipq结构来表示

为了能够有效提高组装分片,用于保存分片的结构必须做到以下几点

(1)快速定位某一个数据报的一组分组

(2)在属于某一个数据报的一组分片中快速插入新的分片

(3)有效的判断一个数据报的所有分片是否已经被全部接收

(4)具有重组超时机制,如果在重组完成之前超时溢出,则删除该数据报的所有内容



IP数据报的分片和组装原理

标签:ip数据报的分片和组装原理

原文地址:http://10808695.blog.51cto.com/10798695/1828859

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!