浅谈IP分片的大小及其原因

一、IP分片的定义

    IP分片是网络上传输IP报文的一种技术手段。IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组,这一过程称为分片。

二、进行IP分片的原因

    数据链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度。通常要传输的IP报文的大小超过最大传输单位MTU时就会产生IP分片情况,IP分片经常发生在网络环境当中。

    例如:在以太网环境当中可传输最大IP报文大小为1500字节(一般可以利用netstat -i命令来查看这个值),如果IP层有数据包要传,而且数据包的长度超过1500(不包括以太协议的首部和尾部18字节),这个时候就需要利用到分片技术,经分片后才能传输此报文。另外,使用UDP很容易导致IP分片,而很难强迫TCP发送一个需要进行分片的报文。

三、IP分片的过程

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

    IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。

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

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | Identification |R|DF|MF| Fragment Offset |

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

ldentification:(16位):发送端发送的IP数据包标识字段都是一个单一值,该值在分片时被复制到每个片中。(具有同一个ID的IP分片将会重新组装)

R:保留未用

DF:“不分片”位,如果将这一比特置1,IP层将不对数据进行分片(DF和MF合起来为3位)

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

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

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

某些分片风暴攻击的原理:故意发送部分IP分片而不是全部,则会导致目标主机总是等待分片消耗并占用系统资源

四、MTU原理

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

对于网络层的上层协议而言,它们对水管粗细不在意,它们认为这是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来可以一次搞定的事情,分多次搞定,所以在网络层更高一层(即传输层)的实现中往往会对此加以注意。有些高层因为某些原因就会要求不能分层,因此会在IP数据包包头加上一个DF标签。这样当这个数据包在一大段网络里传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。

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

对于TCP而言,这个协议是面向连接的协议,因此它非常在意数据包的到达顺序以及是否传输中有错误发生,因此有些TCP应用对分片有要求------不能分片(DF)

五、MSS的原理

    MSS就是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数据报,没有办法只重传数据报中的一个数据报片。事实上,如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就1无法知道数据报是如何被分片的。就这个原因,经常要避免分片。


参考博客:https://baike.baidu.com/item/分片/13677994



猜你喜欢

转载自blog.csdn.net/m0_37962600/article/details/80039349