才子佳人博客

我的故事我讲述

IP数据报的分片和重组过程
 
来源:blog.csdn.net  编辑:xjh  2017-10-17

一份数据从一个主机通过以太网发送到另一个主机时,是要经过层层路由转发,其中过程相对比较复杂,在这里我们要讨论的是IP在路由中转发时是以怎样的形式转发,目的主机在接收到这些数据报时又是怎样处理。在这里我们不详细讨论首部的所有字段,就讨论一下数据报分片有关的问题。

在IP数据报中,总长度是16位的字段,数据报的最大长度为2^16-1=65535字节,虽然尽可能长的数据报可以提升传输速率,但是由于以太网的普遍应用,实际上使用数据报长度很少超过1500个字节的,所以在这里,只要超过1500字节,我们就认为此数据报应该分片了。

IP数据报被分片以后,各分片(fragment)分别组成一个具有IP首部的分组,并各自独立地选择路由,在其分别抵达目的主机后,目的主机的IP层会在传送给传输层之前将接收到的所有分片重装成一个完整的IP数据报。也就是说,一个分组可以是一个完整的IP数据报也可以是IP数据报的一个分片,而分片对传输层是透明的。

一、IP分片

(一)IP分片的原理:

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

IP分片和完整IP报文拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。在IP头里面,16位识别号唯一记录了一个IP包的ID(IP_ID),具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP分片相对整个包的位置;而3位标志则标志着是否分片,以及该分片后面是否还有新的分片。也就是说,IP报文头结构第二行的三个域组成了IP分片的所有信息, 接收方就可以利用这些信息对IP数据进行重构。

1、标志字段的作用

标志字段在分片数据报中起很重要作用,在数据报分片时它的值被设置到每片中。标志域共三位,其中用两位来分别指示数据报要不要分片,分片的话是不是最后的分片。第一位保留=0,第二位DF设置=1时禁止分片,所以如果数据报太大超过MTU而且不可以分片则发送失败。第三位MF设置=1时,表示接收的分片不是最后一个分片,MF设置=0,表示接收的分片是最后一个分片。

可见,更多分片位MF能够让接收主机判断分片的数据报是否发送完毕;而禁止分片位DF除了能够将将数据报分片,而且还能够实现另一个用途,在某些情况下,可以利用分片位动态的找到网络端到端的MTU大小。如果路由器配置时,置此位为0,则当主机尝试发送一个比传输路径上的数据报大的帧时,路由器不转发该帧,而是丢弃,并给源主机发送ICMP报文,说明该数据报太大,源主机利用此信息调整数据报大小,再重新发送。

片偏移:表示当前数据报分片在完整数据报中的偏移,这里一个单位是8字节,比如片偏移为100,则代表该片在完整数据报的偏移是100*8=800字节。

这里以以太网为例:

由于以太网传输电气方面的限制,每个以太网帧最小64bytes,最大不能超过1518bytes, 抛去以太网帧的帧头(目的MAC地址48bit=6Bytes+源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes,那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这就是前面所说的MTU的值。这个也是网络层协议非常关心的地方,因为网络层的IP协议会根据这个值来决定是否把上层传达下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。

2、MTU原理

当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一段很长的水管,由不同粗细的水管连接而成(MTU不同 )通过这段水管最大水量就要由最细的水管决定。

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

对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不关心,所以一般UDP应用对分片没有特殊要求。而对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。

3、最大报文段长度 MSS 的原理

最大报文段长度MSS选项是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。也就是TCP数据报文每次能够传输的最大数据包长度。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,TCP协议在实现的时候往往用MTU值代替这个值,即需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes,所以往往MSS为1460。通讯双方会根据双方提供的MSS值,取其最小值确定为这次连接的最大MSS值。

当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些分片到达目的端时有可能会乱序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。

尽管IP分片过程对上层看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。因为IP层本身没有超时重传的机制,由更高层TCP来负责超时和重传(但UDP没有)。故一些UDP应用程序本身自带超时和重传功能。所以,当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段,而该报文段对应于一份IP数据报,而没有办法只重传数据报中的一个数据报分片。

(二)IP分片的步骤:

一个未分片的数据报的分片信息字段全为0,即多个分片标志位为0,并且片偏移量为0。分片一个数据报,需执行以下几个步骤:

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

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

每个数据分片被放入一个IP数据报,分片的数据报的报文头是略微修改了原来的报文头,详见前文 IP头详解及定义。

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

每个分片中的片偏移量字段设为这个数据部分在原来数据报中所占的位置,这个位置相对于原来未分片数据报中的开头处。

如果在原来的数据报中包括了选项,则选项类型字节的高位字节决定了这个信息是被复制到所有分片数据报,还是只复制到第一个分片数据报。

重新设置新数据报的报文头字段及总长度字段。

重新计算报文头部校验和字段。

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

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

二、重组

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

如果计时器超时并且分片保持尚未认可状态,则数据报被丢弃。这个计时器的初始值称为IP数据报的生存期值。它是依赖于上层实现的。

重组的步骤:

在接收方,一个由发送方发出的原始IP数据报,其所有分片将被重新组合,然后才能提交到上层TCP协议。

为了能高效地组装分片,用于保存分片的数据结构必须能做到以下几点:

1、快速定位属于某一个数据报的一组分组

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

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

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

最后说明,分片机制有一定的缺陷:分片越多,分片丢失的机率就越大,对于一个数据报,一旦一个分片丢失,那么整个数据报就要重传;另外,每一个数据报都要复制报头(只复制ip包头),这在一定程度上也增加了带宽消耗。

来源:
http://blog.csdn.net/leex_brave/article/details/51971053


分类:网络日志| 查看评论
相关文章
文章点击排行
本年度文章点击排行
发表评论:
  • 昵称: *
  • 邮箱: *
  • 网址:
  • 评论:(最多100字)
  • 验证码: