Skip to main content

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

IPv4 标识 (ID) 字段最初设计用于支持数据报的分片和重组。根据 RFC 791 的规定,ID 字段在具有相同源地址、目的地址和协议的数据报中,在最大生存时间 (MSL) 内必须唯一。然而,随着网络速度的提升和应用需求的变化,当前的实现已经偏离了原始规范。

本章节详细讨论了 IPv4 ID 字段的两种主要用途: 用于分片 (fragmentation) 和用于重复检测 (duplicate detection),并分析了当前实现中存在的问题。


2.1 IPv4 ID Used for Fragmentation (用于分片的 IPv4 ID)

IPv4 ID 字段的主要用途是支持数据报的分片和重组。当一个数据报需要通过最大传输单元 (MTU) 较小的链路时,中间路由器可以将该数据报分片为多个较小的片段。每个片段都包含相同的 ID 值,以便目的节点能够将这些片段重组为原始数据报。

根据 RFC 791 的规定,对于具有相同源地址、目的地址和协议的数据报,其 ID 字段在 MSL 内必须唯一。这一要求确保了即使在网络延迟较大的情况下,目的节点也能够正确地将分片重组为原始数据报,而不会将来自不同数据报的分片错误地组合在一起。

然而,在高速网络环境下,16 位的 ID 字段可能会在短时间内耗尽。例如,在 10 Gbps 的链路上,假设每个数据报的平均大小为 1500 字节,那么每秒可以传输约 833,333 个数据报。如果每个数据报都需要一个唯一的 ID 值,那么 16 位的 ID 字段 (最多 65,536 个不同的值) 将在约 0.079 秒内耗尽。

为了解决这一问题,本文档引入了 原子数据报 (atomic datagram)非原子数据报 (non-atomic datagram) 的概念:

  • 原子数据报: 设置了 DF (Don't Fragment) 标志位的数据报。这些数据报不会被中间路由器分片,因此其 ID 字段不需要用于重组。

  • 非原子数据报: 未设置 DF 标志位的数据报。这些数据报可以被中间路由器分片,因此其 ID 字段必须在重组超时期间内唯一。


2.2 IPv4 ID Used for Duplicate Detection (用于重复检测的 IPv4 ID)

除了用于分片和重组外,IPv4 ID 字段还可以用于检测重复数据报。在某些情况下,网络中可能会出现重复的数据报,例如由于路由环路或链路层重传导致的重复。传输层协议 (如 TCP) 通常使用序列号来检测重复数据报,但在某些情况下,IPv4 ID 字段也可以提供额外的保护。

然而,IPv4 ID 字段仅有 16 位,这意味着在高速网络环境下,ID 字段可能会在短时间内重复使用。因此,依赖 IPv4 ID 字段进行重复检测并不可靠,特别是在高速网络环境下。

RFC 1122 指出,传输层协议应该使用自己的机制来检测重复数据报,而不应依赖 IPv4 ID 字段。例如,TCP 使用序列号和确认号来检测重复数据报,UDP 则依赖应用层协议来处理重复。

本文档进一步明确了这一点: IPv4 ID 字段主要用于支持分片和重组,而不应被用作重复检测的主要机制。对于原子数据报 (DF=1),其 ID 字段可以设置为任意值,接收端应忽略该字段的值。


2.3 Background on IPv4 ID Reassembly Issues (IPv4 ID 重组问题的背景)

在高速网络环境下,IPv4 ID 字段的 16 位限制可能导致以下问题:

  1. ID 字段耗尽: 在高速链路上,16 位的 ID 字段可能会在短时间内耗尽,导致无法为新的数据报分配唯一的 ID 值。

  2. 重组错误: 如果两个不同的数据报使用了相同的 ID 值,并且它们的分片在网络中同时存在,那么目的节点可能会将来自不同数据报的分片错误地组合在一起,导致重组错误。

  3. 性能下降: 为了避免 ID 字段耗尽,某些实现可能会限制数据报的发送速率,从而导致性能下降。

RFC 4963 详细讨论了在高速网络环境下 IPv4 重组错误的问题,并指出当前的 IPv4 ID 字段规范在高速网络环境下已经不再适用。

为了解决这些问题,本文档提出了以下解决方案:

  1. 区分原子数据报和非原子数据报: 对于原子数据报 (DF=1),其 ID 字段不需要用于重组,因此可以设置为任意值。对于非原子数据报 (DF=0),其 ID 字段必须在重组超时期间内唯一。

  2. 接收端行为更新: 接收端应忽略原子数据报的 ID 字段值,仅对非原子数据报的分片进行重组。

  3. 发送端行为更新: 发送端应根据数据报的 DF 标志位来决定如何设置 ID 字段。对于原子数据报,可以使用简化的 ID 生成算法 (如固定值或简单计数器)。对于非原子数据报,应使用能够确保 ID 唯一性的算法。

这些变化使得 IPv4 的 ID 字段处理方式与 IPv6 保持一致,并减轻了高速网络环境下的 ID 字段耗尽问题。


Navigation: