IP分片浅析

来源:互联网 发布:淘宝上传凭证是什么 编辑:程序博客网 时间:2024/05/21 11:26

分片原因:

       在TCP/IP分层中,数据链路层用MTUMaximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节。

      当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。

MSS的原理

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

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

    尽管IP分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。因为IP层本身没有超时重传的机制——由更高层来负责超时和重传(T C P有超时和重传机制,但UDP没有。一些UDP应用程序本身也执行超时和重传)。当来自T C P报文段的某一片丢失后,T C P在超时后会重发整个T C P报文段,该报文段对应于一份IP数据报。没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。就这个原因,经常要避免分片。


MTU=MSS+20(IP首部)+20(TCP首部);

一般网络协商使用MTU代替MSS


IP分片的实现

IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。

IP首部有4个字节是用于分片的,如下图所示。前16位是IP数据报的标识,同一个数据报的各个分片的标识是一样的,目的端会根据这个标识来判断IP分片是否属于同一个IP数据报。中间3位是标志位,其中有1位用来表示是否有更多的分片,如果是最后一个分片,该标志位为0,否则为1。后面13位表示分片在原始数据的偏移,这里的原始数据是IP层收到的传输的TCPUDP数据,不包含IP首部。

需要注意的,在分片的数据中,传输层的首部只会出现在第一个分片中,如下图所示。因为传输层的数据格式对IP层是透明的,传输层的首部只有在传输层才会有它的作用,IP层不知道也不需要保证在每个分片中都有传输层首部。所以,在网络上传输的数据包是有可能没有传输层首部的。

避免IP分片

         在网络编程中,我们要避免出现IP分片,那么为什么要避免呢?原因是IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,结果是所有的分片都要重传一遍,这个代价有点大。由此可见,IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。

对于UDP包,我们需要在应用层去限制每个包的大小,一般不要超过1472字节,即以太网MTU1500)—UDP首部(8)—IP首部(20)。

对于TCP数据,应用层就不需要考虑这个问题了,因为传输层已经帮我们做了。在建立连接的三次握手的过程中,连接双方会相互通MSSMaximum Segment Size,最大报文段长度),MSS一般是MTUIP首部(20)—TCP首部(20,每次发送的TCP数据都不会超过双方MSS的最小值,所以就保证了IP数据报不会超过MTU,避免了IP分片


IP分片算法的原理

    分片重组是IP层一个最重要的工作,其处理的主要思想:当数据包从一个网络A进入另一个网络B时,若原网络的数据包大于另一个网络的最大数据包的长度,必须进行分片。

因而在IP数据包的报头有若干标识域注明分片包的共同标识号、分片的偏移量、是否最后一片及是否允许分片。传输途中的网关利用这些标识域进行分片,目有主机把收到的分片进行重组以恢重数据。因此,分片包在经过网络监测设备、安全设备、系统管理设备时,为了获取信息、处理数据,都必须完成数据包的分片或重组。

 

Identification

R

DF

MF

Fragment Offset

                                                          

R:保留未用;DF:Don’t Fragment,“不分片”位,如果将这一比特置1,IP 层将不对数据报进行分片;MF:More Fragment,“更多的片”,除了最后一片外,其它每个组成数据报的片都要把比特置1;Fragment Offset:该片偏移原始数据包开始处的位置。偏移的字节数是该值乘以8。

100-----保留未用

010-----不分片

001-----有分片

000-----该ID标识下最后一个分片数据包


关于TCP分段重组的思考:

   TCP层协商了MSS后,不需要将各种MSS段的小包重组成一个大包。

TCP/IP是基于流的可靠传输协议 ----------------------这句话的含义是指连接从建立到结束整个过程传输的数据是一串数据(可能是基于byte解释,也可能是基于word解释)。这样传输流就并不关心数据原始结构是什么。而这个数据流交给应用层后,应用层会进行对应的解释,还原成原始结构的数据。

 
IP分段的原因是它要跟链路层打交道,链路层上的单次传输容量(MTU)可能小于IP包的大小。IP包就会分段通过。
但TCP到IP这一层不需要,因为TCP没有包的概念,IP层能传多少是多少。

即TCP端是缓冲处理接收的数据的-------在tcp的发送和接收端分别有一对发送、接收队列。使用滑动窗口来解决报文的重组和流量控制,使用超时重传来解决失序。

  

0 0
原创粉丝点击