跳到主要内容

3. The IPv4 ID Field (IPv4 ID 字段)

IP 支持数据报分片, 即把较大的数据报拆分为较小的组成部分, 以便穿过最大传输单元 (maximum transmission unit, MTU) 受限的链路.在 IPv4 和 IPv6 中, 分片的表示方式有所不同:

  • 在 IPv4 中, 分片通过基本首部中的四个字段来表示: 标识 (Identification, ID)、分片偏移 (Fragment Offset)、"不分片" (Don't Fragment, DF) 标志和 "更多分片" (More Fragments, MF) 标志 [RFC791].
  • 在 IPv6 中, 分片在一个扩展首部中表示, 该首部包含 ID、分片偏移 (Fragment Offset) 以及与 IPv4 中对应标志类似的 M (更多分片) 标志 [RFC2460].

IPv6 分片在几个重要方面与 IPv4 分片不同.IPv6 分片只在源端发生, 因此不需要 DF 位来阻止下游设备发起分片 (即 IPv6 的行为始终如同 DF=1).只有在数据报已被分片时, 或者源端收到 "数据包过大" 的 ICMPv6 差错报文, 表明路径无法支持所要求的最小 1280 字节 IPv6 MTU 因而需要转换时, IPv6 分片首部才会出现 [RFC2460] [RFC4443].后一种情况仅对发往 IPv4 目的地的 IPv6 数据报有意义, 以支持在转换为 IPv4 之后的后续分片.

除这两种情况外, 未分片的数据报不包含 ID 字段; 因此, 它仅对已被分片的数据报, 或作为 IPv4 转换的一部分而预期会被分片的数据报有意义.最后, IPv6 ID 字段为 32 位, 并且在 IPv6 中要求按源/目的地址对保持唯一, 而在 IPv4 中它只有 16 位, 并要求按源地址/目的地址/协议元组保持唯一.

本文档聚焦于 IPv4 ID 字段的问题, 因为在 IPv6 中该字段更大, 并且只出现在分片中.

3.1. Uses of the IPv4 ID Field (IPv4 ID 字段的用途)​

IPv4 ID 字段最初是为分片和重组而设计的 [RFC791].在给定的源地址、目的地址和协议内, 原始数据报的各个分片根据其 IPv4 ID 进行匹配.这要求在可能发生分片时 (例如 DF=0), 或者分片已经发生时 (例如 frag_offset>0 或 MF=1), ID 在源地址/目的地址/协议元组内保持唯一.

人们还为 IPv4 ID 字段设想了其他用途.该字段曾被提议用于检测和移除重复的数据报, 例如在拥塞的路由器上 ([RFC1122] 第 3.2.1.5 节中有所提及) 或网络加速器中.同样, 它也曾被提议用于端主机, 以减轻重复对高层协议的影响 (例如 TCP 中的额外处理, 或 UDP 中需要应用层重复抑制).第 5.1 节将进一步讨论这一点.

某些诊断工具使用 IPv4 ID 字段来关联在网络路径上不同位置测量到的数据报.在 IPv6 中这已经不够用了, 因为未分片的数据报缺少 ID, 所以这些工具已经在更新, 以避免这种对 ID 字段的依赖.第 5.1 节也将进一步讨论这一点.

为了支持分片和重组, ID 显然需要保持唯一 (在 MDL 内, 在源地址/目的地址/协议元组内), 但并非所有数据报都会被分片或允许分片.本文档废弃非分片用途, 在这些情况下允许 ID 重复 (在 MDL 内, 在源地址/目的地址/协议元组内).

3.2. Background on IPv4 ID Reassembly Issues (IPv4 ID 重组问题的背景)​

以下是对此前提出的高速环境下 IPv4 分片重组问题的总结 [RFC4963].鼓励读者查阅 RFC 4963, 以获取对这些问题的更详细讨论.

在 IPv4 最大数据报大小为 64 KB 的情况下, 一个在 120 秒内不重复的 16 位 ID 字段意味着, 两个 IP 端点之间给定协议的所有 TCP 连接的合计速率被限制在约 286 Mbps; 而在更典型的 1500 字节 MTU 下, 该速率下降到 6.4 Mbps [RFC791] [RFC1122] [RFC4963].目前, 这一限制适用于两个 IP 地址之间单一协议 (即 IPv4 协议字段) 内的所有 IPv4 数据报, 而不管分片是启用还是被抑制, 也不管数据报是否被分片.

由于 IPv6 具有更大的 32 位 ID 字段 (并且 IPv6 下一首部字段, 即相当于 IPv4 协议字段的字段, 在区分分片时并不被考虑), 即使在典型 MTU 下, IPv6 在两个 IP 端点之间使用分片时, 跨所有协议的合计速率也能达到 18.7 Tbps.当不使用分片时, 该字段不存在, 在这种情况下 IPv6 的速率不受 ID 字段唯一性的限制.

另请注意, 120 秒只是对 MDL 的一个估计值.它以重组超时作为下界, 以 TCP 最大报文段生存时间 (Maximum Segment Lifetime) 作为上界 ([RFC1122] 中对两者均有说明).网络延迟还会以其他方式产生, 例如卫星链路, 它们可能增加数秒的延迟, 即使生存时间 (Time to Live, TTL) 并未相应地减少.因此, 并不存在强制机制来确保超过 120 秒的数据报被丢弃.

无线互联网设备经常以超过 54 Mbps 的速率连接, 而有线链路以 1 Gbps 为默认速率已有数年之久.尽管许多端到端传输路径受拥塞限制, 这些设备在局域网上可以轻松实现 100+ Mbps 的应用层吞吐量 (例如磁盘到磁盘的文件传输速率), 而且十多年来, 使用商用现成 (Commercial-Off-The-Shelf, COTS) 系统在广域路径上进行的大量吞吐量演示都展现出了这些速率.这强烈表明 IPv4 ID 唯一性早已失去意义.