IP 分片概述

IP 分片概述

物理网络层一般要限制每次发送数据帧的最大长度。 任何时候 IP 层接收到一份要发送的 IP 数据报时,它要判断向本地哪个接口发送数据(选路), 并查询该接口获得其 MTU。IP 把 MTU 与数据报长度进行比较,如果需要则进行分片。 分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

把一份 IP 数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网 络协议不同,它们要求在下一站就进行进行重新组装,而不是在最终的目的地)。 重新组装由目的端的 IP 层来完成,其目的是使分片和重新组装过程对运输层( TCP 和 UDP)是透明的, 除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。 IP 首部中包含的数据为分片和重新组装提供了足够的信息。

回忆 IP 首部(图 3-1),下面这些字段用于分片过程。 对于发送端发送的每份 IP 数据报来说,其标识字段都包含一个唯一值。 该值在数据报分片时被复制到每个片中(我们现在已经看到这个字段的用途)。 标志字段用其中一个比特来表示“更多的片”。 除了最后一片外,其他每个组成数据报的片都要把该比特置 1。 片偏移字段指的是该片偏移原始数据报开始处的位置。 另外,当数据报被分片后,每个片的总长度值要改为该片的长度值。

最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置 1,IP 将不对数据报进行分片。

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

尽管 IP 分片过程看起来是透明的,但有一点让人不想使用它:即使只丢失一片数据也要重传整个数据报。 为什么会发生这种情况呢? 因为 IP 层本身没有超时重传的机制 —— 由更高层来负责超时和重传(TCP 有超时和重传机制,但 UDP 没有。 一些 UDP 应用程序本身也执行超时和重传)。

当来自 TCP 报文段的某一片丢失后,TCP 在超时后会重发整个 TCP 报文段, 该报文段对应于一份 IP 数据报。没有办法只重传数据报中的一个数据报片。 事实上,如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的。 就这个原因,经常要避免分片。 使用 UDP 很容易导致 IP 分片(在后面我们将看到, TCP 试图避免分片, 但对于应用程序来说几乎不可能强迫 TCP 发送一个需要进行分片的长报文段)。

需要重申的是,任何运输层首部只出现在第 1 片数据中。 另外需要解释几个术语:

  • IP 数据报是指 IP 层端到端的传输单元(在分片之前和重新组装之后)
  • IP 分组是指在 IP 层和链路层之间传送的数据单元。 一个分组可以是一个完整的 IP 数据报,也可以是 IP 数据报的一个分片。

UDP-IP-Fragment

Ref

《TCP/IP 详解 卷 1:协议》第 1 章 概述 11.5 IP 分片