跳到主要内容

4. Updates to the IPv4 ID Specification (IPv4 ID 规范的更新)

本文档以三种不同的方式更新 IPv4 ID 字段的规范, 具体将在后续各小节中讨论:

  • 仅将 IPv4 ID 字段用于分片
  • 在 IPv4 ID 字段被使用时鼓励安全操作
  • 在 IPv4 ID 字段被使用时避免性能影响

有两类数据报, 其定义如下, 并在后续讨论中使用:

  • 原子数据报 (Atomic datagrams) 是尚未被分片、且进一步分片已被抑制的数据报.
  • 非原子数据报 (Non-atomic datagrams) 是已经被分片、或者仍可能被分片的数据报.

这一定义可以用伪代码表示, 使用常见的逻辑运算符 (等于为 ==, 逻辑 "与" 为 &&, 逻辑 "或" 为 ||, 大于为 >, 并按惯例使用括号) 如下:

  • 原子数据报: (DF==1)&&(MF==0)&&(frag_offset==0)
  • 非原子数据报: (DF==0)||(MF==1)||(frag_offset>0)

非原子数据报的判定是原子数据报判定的逻辑否定; 因此, 所有可能性都被考虑在内.

4.1. IPv4 ID Used Only for Fragmentation (IPv4 ID 仅用于分片)​

尽管 RFC 1122 提出 IPv4 ID 字段还有其他用途, 包括数据报去重, 但这类用途已经无法与已知的不改变其 ID 的源实现互操作.因此, 本文档只针对分片和重组来定义该字段的值:

IPv4 ID 字段不得 (MUST NOT) 用于分片和重组以外的目的.

在 ID 字段不存在的情况下 (IPv6 未分片的数据报), 仍可以使用基于哈希的重复检测来实现数据报去重, 这种方法也可以在不使用 ID 字段的情况下应用于 IPv4 原子数据报 [RFC6621].

在原子数据报中, IPv4 ID 字段没有意义; 因此, 它可以被设为任意值, 也就是说, 对于原子数据报, 不再要求 ID 在源地址/目的地址/协议元组内不重复:

发起源可以 (MAY) 将原子数据报的 IPv4 ID 字段设为任意值.

其次, 所有网络节点, 无论是中间路由器、目的主机还是其他设备 (例如 NAT 和其他地址共享机制、防火墙、隧道出口), 都不能依赖原子数据报的该字段:

所有检查 IPv4 首部的设备都必须 (MUST) 忽略原子数据报的 IPv4 ID 字段.

因此, IPv4 ID 字段仅对非原子数据报有意义 —— 即那些已经被分片的数据报, 或那些仍允许分片的数据报.如第 4 节所述, 原子数据报通过其 DF、MF 和分片偏移字段来识别, 因为这种判定完全向后兼容; 因此, 本文档不保留任何 IPv4 ID 值 (包括 0) 作为特殊区分值.

废弃将 IPv4 ID 字段用于非重组用途应当几乎没有影响 —— 如果有的话.IPv4 ID 已经被频繁重复, 例如在即使只是中等速度的连接上, 以及来自某些完全不改变 ID 的源, 并且没有观察到不利影响.曾有人提出重复抑制 [RFC1122] 并且已在某些协议加速器中实现, 但迄今为止尚未注意到 IPv4 ID 重用造成的影响.路由器不需要在任何特定的时间尺度上发送 ICMP, 因此 IPv4 ID 重复本不应被用于验证目的; 这种情形尚未被观察到.此外, 重复已经发生, 并且本应已被注意到 [RFC1812].隧道入口处的 ICMP 中继被规定使用软状态而非数据报缓存; 出于类似原因, 如果使用后者, 这本来也应该已被注意到 [RFC2003].这些以及其他遗留问题将在第 5.1 节中进一步讨论.

4.2. Encouraging Safe IPv4 ID Use (鼓励安全使用 IPv4 ID)​

本文档还修改了 IPv4 ID 字段的规范, 以鼓励安全使用该字段.

如 RFC 1122 所述, 如果 TCP 重传一个报文段, 则有可能重用 IPv4 ID (参见第 6.2 节).这会使源难以避免已接收分片的 IPv4 ID 重复.RFC 1122 得出结论认为这种行为 "没有用处"; 本文档将这一结论正式化如下:

在发送较早的非原子数据报的副本时, 不得 (MUST NOT) 重用该非原子数据报的 IPv4 ID.

RFC 1122 还指出分片可能重叠.如果相继的重传以不同方式分片但使用相同的重组 IPv4 ID, 就可能出现这种重叠.这种重叠被认为是重传数据报时重用 IPv4 ID 的结果, 本文档对此予以废弃.然而, 它也可能是网络中数据报重复的结果, 而这种情况仍可能发生.因此, 本文档不改变接收方需要支持重叠分片这一要求.

4.3. IPv4 ID Requirements That Persist (仍然保留的 IPv4 ID 要求)​

本文档不放松 [RFC791] 对非原子数据报的 IPv4 ID 字段唯一性要求, 即:

发出非原子数据报的源不得 (MUST NOT) 在给定源地址/目的地址/协议元组的一个 MDL 内重复 IPv4 ID 值.

这类源包括发起主机、隧道入口和 NAT (包括其他地址共享机制) (参见第 5.3 节).

本文档不放松所有网络设备必须遵守 DF 位这一要求, 即:

DF=1 的 IPv4 数据报不得 (MUST NOT) 被分片.

IPv4 数据报中转设备不得 (MUST NOT) 清除 DF 位.

具体而言, DF=1 阻止对原子数据报进行分片.DF=1 也阻止对已接收的分片进行进一步分片.只有当 DF=0 时才允许网络内分片; 本文档不改变这一要求.