IP
IP数据报的格式,请同学们参考谢《计算机网络》教材,写得已经非常详细。这里主要对一些数据报格式中的疑问作出解释。在应用程序中,必须关心IP数据报的长度。如果它超过网络的MTU,那么就要对IP数据报进行分片。如果需要,源目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。在下面,将讨论IP分片的一些原理及其在分片中所需要的几个元素。
分片是分组交换的思想体现,也是IP协议需要解决的两个主要问题之一。在IP协议中的分片算法主要解决异种网最大传输单元(MTU)的不同。但是分组在传输过程中不断地分片和重组会带来很大的工作量还会增加一些不安全的因素。
1.什么是IP分片
IP分片是网络上传输IP报文的一种技术手段。IP协议在传输数据报时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。这一过程称为分片(Fragmentation)。
2.为什么要进行IP分片
通常要传输的IP报文的大小超过最大传输单位MTU(Ma_imumTransmissionUnit)时就会产生IP分片情况。IP分片通常发生在网络环境中。比如说,在以太网(Ethernet)环境中可传输最大IP报文大小(MTU)为1500字节。而传输的报文大小要比1500字节大,这个时候就需要利用到分片技术,经分片后才能传输此报文。另外,使用UDP很容易导致IP分片,而很难强迫TCP发送一个需要进行分片的报文。
3.IP分片原理及分析
分片和重新组装的过程对传输层是透明的,其原因是当IP数据报进行分片之后,只有当它到达下一站时,才可进行重新组装,且它是由目的端的IP层来完成的。分片之后的数据报根据需要也可以再次进行分片。
IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。在IP头里面,16位识别号唯一记录了一个IP包的ID,具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP片相对整个包的位置;这两个表中间的3位标志则标志着该分片后面是否还有新的分片。这三个标志就组成了IP分片的所有信息,接受方就可以利用这些信息对IP数据进行重新组织。
3.1标志字段的作用
标志字段在分片数据报中起了很大作用,在数据报分片时把它的值复制到每片中。标志字段的最低位表示“更多的片”(见“IP数据报的格式”),因此,除了最后一片外,其他每个组成数据报的片都要把该比特置1。片偏移字段指的是该片偏移原始数据报开始处的位置。另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。如果将标志字段的比特置1,则IP将不对数据报进行分片。相反,把数据报丢弃并发送一个ICMP差错报文然后通知源主机废弃的原因。如果不是特殊需要,则不应该置1;最右比特置1表示该报文不是最后一个IP分片。
故意发送部分IP分片而不是全部,则会导致目标主机总是等待分片消耗并占用系统资源。某些分片风暴攻击就是这种原理。
3.2MTU原理
当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管(MTU不同)组成,通过这段水管的最大水量就要由中间最细的水管决定。
对于网络层的上层协议而言(这里以TCP/IP协议族为例),水管粗细它们并不在意,它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据报的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以完成的事情,分成多次完成,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意。有些高层因为某些原因就会要求我这个数据报不能分片,所以会在IP数据报报头里面加上一个标签DF(Don’tFragment)。这样当这个IP数据报在一大段网络中(水管里面)传输的时候,如果遇到MTU小于IP数据报的情况,转发设备就会根据要求丢弃这个数据报。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路的MTU都是1500或者大于1500。
对于UDP协议而言,这个协议本身是无连接的协议,对数据报的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。
对于TCP协议而言就不一样了,这个协议是面向连接的协议,它非常在意数据报的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求——不能分片(DF)。
分片重组是IP层一个最重要的工作,其处理的主要思想是:当数据报从一个网络A进入另一个网络B时,若原网络的数据报大于另一个网络的最大数据报的长度,必须进行分片。因而在IP数据报的报头有若干标识域注明分片包的共同标识号、分片的偏移量、是否最后一片及是否允许分片。传输途中的网关利用这些标识域进行分片,目的主机把收到的分片进行重组以恢重数据。因此,分片包在经过网络监测设备、安全设备、系统管理设备时,为了获取信息、处理数据,都必须完成数据报的分片或重组。
三、IP数据报的重组
重组是分片的逆过程,即在所有分片基础上重新还原成原数据报的一个副本的过程。IP协议规定:只有最终目的主机才能对分片进行重组。因为每个分片头部基本是原数据报头部
的副本,因此都有与原数据报相同的目的地址,那么目的主机能否进行重组取决于所有的分片是否都成功到达。
目的主机收到一个IP报文时,可以根据其分片偏移和MF标志判断其是否为一个分片。在数据报分片以后的传输过程中,还有两个问题要解决:一是片的丢失;二是片的进一步分解。
由于IP不能确保传递质量,如果底层网络丢失了包,则封装在其中的数据报或分片也随之丢失。这样,一个数据报的一部分分片到达目的主机后,很可能仍有一些分片被延迟或丢失。这时目的主机还不能重组这些分片,必须把它们保留在内存。当然,这些片不能无限期地保留下去。为节省内存资源,IP规定了保留分片的最大时间。当数据报的第一个分片到达时,开始计时。如果数据报的所有分片在规定的时间内全部达到,则取消计时。否则,计时过后,所有分片仍未到齐,目的主机将丢弃这些已到的分片。
引入IP重组计时后产生的结果是:要么所有段全部到达,要么什么也没得到(整个数据报被丢弃)。而且,发送方主机重传数据报后,有可能选择了不同的路由,即每次传输不一定经过相同的路由器,因此不能保证重发的数据报会像上次一样地被分片。
执行数据报分片后,路由器将每一段转发到它的下一个路由器。如果某一分片转发后遇到一个MTU值更小的网络时,该段本身将再被执行分片。也就是说,IP网络上的另一个路由器可能将该段进一步分割成更小的一些片。如果由于网络设计的问题,使其中MTU按从大到小次序连接,则路径上的每个路由器都要对分片再进行分片,造成网络传输效率很低。
与此同时,IP对源段和子段并不加以区分,一律一视同仁。目的方并不知道收到的是一个第一次分片形成的段,还是一个经历了多个路由器多次分片后形成的段。这样做的好处在于:目的方并不需要先重组子段后才能执行重组过程,节省了CPU时间,也减少了每一段的头部中所需的信息量。