IP分片报文和TCP分段报文
分组可以发生在传输层和网络层,传输层中的TCP会分段,网络层中的IP会分片。IP层的分片更多的是为传输层的UDP服务的,由于TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会发生分片的现象。我们在学习TCP/IP协议时都知道,TCP报文段如果很长的话,会在发送时发生分段,在接受时进行重组,同样IP数据报在长度超过一定值时也会发生分片,在接收端再将分片重组。传输层分段的主要控制参数是最大分段大小MSS,网络层分片的主要控制参数是最大传输单元MTU。
1. 最大传输单元(MTU)
IP数据报在互联网上传输时,可能要经过多个物理网络才能从源端传输到目的端。不同的网络由于链路层和介质的物理特性不同,因此在进行数据传输时,对数据帧的最大长度都有一个限制,这个限制值即最大传输单元MTU(Maximum Transmission Unit)。MTU是链路层中的网络对数据帧的一个限制,以以太网为例,MTU为1500个字节。一个IP数据报在以太网中传输,如果它的长度大于该MTU值,就要进行分片传输,使得每片数据报的长度小于MTU。分片传输的IP数据报不一定按序到达,但IP首部中的信息能让这些数据报片按序组装 (标识、标志、偏移)。IP数据报的分片与重组是在网络层进完成的。
同一个网络上的两台主机之间通信时,该网络的MTU值是确定的,一般不存在分片问题。分片问题一般只存在于具有不同MTU值的互联网中。由于现在互联网主要使用路由器进行网络连接,因此分片工作通常由路由器负责。当两台主机之间的通信要通过多个具有不同MTU值的网络时,MTU的瓶颈是通信路径上最小的MTU值,它被称为路径MTU。由于路由选择不一定是对称的(从A到B的路由可能与从B到A的路由不同),因此,路径MTU在两个方向上不一定是一致的,下表是几种常用网络的MTU值:
| 网络名称 | MTU(字节) |
|---|---|
| 以太网 | 1500 |
| IEEE802.3/802.2 | 1492 |
| FDDI | 4352 |
| X.25 | 576 |
2. MSS(最大分段大小)
MSS是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议在建立连接的时候通常要协商双方的MSS值,每一方都有用于通告它期望接收的MSS选项(MSS选项只出现在SYN报文段中,即TCP三次握手的前两次)。MSS的值一般为MTU值减去两个首部大小(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)。所以如果用链路层以太网,MSS的值往往为1460。而Internet上标准的MTU(最小的MTU,链路层网络为x.25协议时)为576,那么如果不设置,则MSS的默认值就为536个字节。TCP报文段的分段与重组是在传输层完成的。
3. 分片
很显然,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明显,分段后的每一段TCP报文段再加上IP首部后的长度不可能超过MTU,因此也就不需要在网络层进行IP分片了。因此TCP报文段很少会发生IP分片的情况。再来看UDP数据报,由于UDP数据报不会自己进行分段,因此当长度超过了MTU时,会在网络层进行IP分片。同样,ICMP也会出现IP分片情况。
在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1518=6+6+2+4+1500字节,其中以太网数据帧的帧头为6+6+2字节。当一个IP数据报封装成链路层的帧时,此IP数据报的总长度 (首部加上数据部分)一定不能超过下面的数据链路层的MTU值,否则要分片,把一个IP数据报为了适合网络传输而分成多个数据报的过程称为分片,被分片后的各个IP数据报可能经过不同的路径到达目标主机。一个IP数据报在传输过程中可能被分片,也可能不被分片。如果被分片,分片后的IP数据报和原来没有分片的IP数据报结构是相同的,即也是由IP头部和IP数据区两个部分组成。

分片后的IP数据报,数据区是原IP数据报数据区的一个连续部分,头部是原IP数据报头部的复制,但与原来未分片的IP数据报头部有两点主要不同:标志和片偏移。由于分片报文是对IP数据部分的拆分,因此三层以上的头部信息(例如传输层的端口)只存在于IP报文的第一个分片。
4. 重组

当分了片的IP数据报到达最终目标主机时,目标主机对各分片进行组装,恢复成源主机发送时的IP数据报,这个过程叫做IP数据报的重组。
- 在IP数据报头部中,标识用2个字节表示,它唯一地标识主机发送的每一份数据报。在一个数据报被分片时,每个分片把数据报“标识”字段的值原样复制一份,所以一个数据报的所有分片具有相同的标识。标识是由源主机生成的,源主机可以使用不同的方法来生成标识符,比如递增计数器、随机数、哈希函数等。标识的生成方法应该尽量保证在一定时间内不重复,以避免与其他数据包混淆。同时,标识的生成方法应该尽量简单和高效,以减少开销和延迟。
- 标志字段共3位。其中第一位未使用,第二位DF为“不分段”标志位,值为1时表示不允许路由器分割该数据段。第三位MF表示“更多的段”,除了最后一个段以外,其他所有的段都必须设置为1,用途是接受方可以知道什么时候一个数据包的所有数据分段都已经到达了。
- 片偏移指明了当前数据分段在完整数据包中的位置(单位字节),比如片偏移为185,则代表该片在完整数据包的偏移是
185*8=1480字节。片偏移共13位,因此数据包最多有2^13=8192个段。
目标端主机重组数据报的原理是:
- 根据“标识”字段可以确定收到的分片属于原来哪个IP数据报;
- 根据“标志”字段的“片未完MF”子字段可以确定分片是不是最后一个分片;
- 根据“偏移量”字段可以确定分片在原数据报中的位置。