跳到主要内容

5. Impact of Proposed Changes (拟议变更的影响)

本节讨论拟议变更对遗留设备、更新设备中的数据报生成、中间盒以及头压缩的影响.

5.1. Impact on Legacy Internet Devices (对遗留互联网设备的影响)​

IPv4 ID 字段的遗留用途包括分片生成、分片重组、重复数据报检测以及 "其他" 用途.

当前设备生成的 ID 值已经在短于当前估计的互联网 MDL (两分钟) 的时间内, 在源地址/目的地址/协议元组内被重用.它们假定其端到端路径上的 MDL 要低得多.

近十年来, 已知现有设备会为原子数据报生成不变化的 ID, 尤其是一些手机.这类恒定的 ID 值正是将其作为 ROHC [RFC5225] 的一项优化予以支持的原因.第 5.4 节将进一步讨论这一点.生成具有恒定 (零) ID 的 IPv4 数据报也作为 IP/ICMP 转换标准 [RFC6145] 的一部分进行了描述.

许多当前设备支持忽略 IPv4 不分片 (Don't Fragment, DF) 位的分片.这类设备已经在转发来自重用 ID 的源的流量.如果重用相同 ID (在源地址/目的地址/协议元组内) 的不同数据报的分片以交错方式到达目的地, 分片就会失败, 流量就会被丢弃.要么这种交错并不常见, 要么来自这类设备的流量并未广泛经过这些忽略 DF 的设备, 因为尚未有大量重组错误发生的报告.忽略 DF 的设备不符合现有标准, 而修改标准以使其合规并不可行.

如第 4.1 节所讨论, ID 字段曾被设想用于重复检测.尽管本文档现在允许原子数据报重用 IPv4 ID, 但这类重用已经十分普遍 (如上所述).已知协议加速器会实现 IPv4 重复检测, 但已知这类设备为了获得更高的端到端性能也会违反其他互联网标准.对于当前的这种流量, 这些设备本来就已经会表现出错误丢弃, 而这一点并未被报告.

ID 字段还有其他潜在用途, 例如用于诊断目的.这类用途已经需要适应 ID 字段被重用的原子数据报.没有报告表明这类用途在处理当前重用 ID 的数据报时遇到问题.

因此, 由于先前的要求, 本文档建议 IPv4 重复检测和诊断机制采用与 IPv6 兼容的方法, 即不依赖 ID 字段的方法 (例如 [RFC6621] 中建议的方法).这是将 ID 字段仅用于重组的必然结果, 也是现有设备已经重用 ID 字段这一已知隐患的必然结果.

5.2. Impact on Datagram Generation (对数据报生成的影响)​

以下是对先前 IPv4 ID 字段规范变更所产生建议的总结.

由于原子数据报可以使用任意的 IPv4 ID 值, 在这些情况下 ID 字段不再造成性能影响.然而, 对于非原子数据报, 性能影响依然存在.因此:

非原子 IPv4 数据报的源必须 (MUST) 对其输出进行速率限制, 以符合 ID 唯一性要求.这类源特别包括基于 UDP 的 DNS [RFC2671].

由于对 MDL 没有严格的定义, 无论 IPv4 ID 重用间隔或重组超时如何, 重组隐患都存在.因此:

高层协议应当 (SHOULD) 验证 IPv4 数据报的完整性, 例如使用能够检测重组错误的校验和或哈希 (UDP 和 TCP 校验和在这方面较弱, 但聊胜于无).

可以使用隧道来实施额外的完整性检查, 例如子网封装与适配层 (Subnetwork Encapsulation and Adaptation Layer, SEAL) [RFC5320]、IPsec [RFC4301] 或流控制传输协议 (Stream Control Transmission Protocol, SCTP) [RFC4960] 所支持的方式.这类检查可以避免在使用 UDP 和 TCP 校验和时 [RFC4963], 或在使用如 UDP-Lite [RFC3828] 中的部分校验和时可能发生的重组隐患.由于这类完整性检查可以避免重组错误的影响:

使用强完整性检查的非原子 IPv4 数据报源可以 (MAY) 在小于典型 MDL 值的间隔内重用 ID.

但请注意, 这种频繁重用仍可能导致重组损坏和吞吐量低下, 尽管它不会把重组错误传播到高层协议.

5.3. Impact on Middleboxes (对中间盒的影响)​

中间盒包括重写设备, 例如网络地址转换器 (network address translator, NAT)、网络地址/端口转换器 (network address/port translator, NAPT) 以及其他地址共享机制 (address-sharing mechanism, ASM).它们还包括检查和过滤数据报但不是路由器的设备, 例如加速器和防火墙.

本文档提出的变更可能不会被中间盒实现; 然而, 这些变更更可能使当前中间盒的行为变得合规, 而不是影响这些设备所提供的服务.

5.3.1. Rewriting Middleboxes (重写型中间盒)​

NAT 和 NAPT 会重写 IP 字段, 而隧道入口 (使用 IPv4 封装) 会复制和修改某些 IPv4 字段; 因此它们都被视为数据报源, 任何为任何数据报重写源地址/目的地址/协议/ID 元组任何部分的设备也是如此 [RFC3022].对于其他 ASM 也是如此, 包括 IPv4 残余部署 (IPv4 Residual Deployment, 4rd) [De11]、IVI [RFC6219] 以及 "A+P" (地址加端口) 家族中的其他机制 [Bo11].对于任何其他数据报重写机制同样如此.因此, 正如已经指出的那样, 它们要受任何数据报源的全部要求约束.

NAT/ASM/重写器对分片而言构成一种特别具有挑战性的情形.由于它们在两个方向上都会覆盖重组元组的部分内容, 它们可能破坏元组唯一性并导致重组隐患.每当 IPv4 源地址、目的地址或协议字段被修改时, NAT/ASM/重写器都需要确保 ID 字段被适当地生成, 而不是简单地复制自传入的数据报.

具体而言:

地址共享或重写设备必须 (MUST) 确保其地址或协议被转换的数据报的 IPv4 ID 字段符合这些要求, 就如同该数据报是由该设备发起的一样.

这种合规性意味着, 在 NAT/ASM/重写器处被转换的非原子数据报的 IPv4 ID 字段需要遵守任何 IPv4 数据报源的唯一性要求.遗憾的是, 被转换的分片已经违反了该要求, 因为它们会在给定源地址/目的地址/协议元组的一个 MDL 内重复某个 IPv4 ID.

通过 NAT/ASM/重写器传输分片的这类问题已为人所知; 转换通常基于传输端口号, 而该端口号本来只存在于第一个分片中 [RFC3022].本文档强调这样一点: 转换不仅需要重组 (以及可能的后续分片), 而且可以利用重组来避免 IPv4 ID 唯一性方面的问题.

请注意, NAT/ASM 在其公网侧发出数据报时已经需要特别小心, 因为把来自许多源的数据报合并到单一出站源地址上可能导致 IPv4 ID 冲突.这种情形在本文档之前就已存在, 并不受本文档影响.在大规模、所谓的 "运营商级" NAT 中, 这一情形会加剧 [Pe11].

隧道入口对于最外层首部而言充当源, 但隧道对于内层首部 (即到达隧道入口时的数据报) 而言充当路由器.入口始终可以以外层首部发起源的身份进行分片, 因为它们控制着该 IPv4 ID 字段的唯一性以及外层首部上 DF 的取值, 而与内层 (到达的数据报) 首部上的这些取值无关.

5.3.2. Filtering Middleboxes (过滤型中间盒)​

中间盒还包括过滤数据报的设备, 例如网络加速器和防火墙.据报告, 其中一些设备具有依赖 IP ID 唯一性来识别重复的数据报去重功能, 这一点已在第 5.1 节中讨论过.

5.4. Impact on Header Compression (对头压缩的影响)​

头压缩算法已经能够适应 IPv4 ID 在相继数据报之间变化的各种方式 [RFC1144] [RFC2508] [RFC3545] [RFC5225].这类算法目前假定 IPv4 ID 是端到端保持的.有些算法已经允许假定 ID 不变 (例如 ROHC [RFC5225]), 而另一些则通过零增量来纳入不变的 ID (例如增强压缩 RTP (Enhanced Compressed RTP, ECRTP) [RFC3545]).

当压缩默认假定 ID 是变化的时, 拥有不变的 ID 可能会使压缩效率降低.这类不变的 ID 已在多个 RFC 中被描述 (例如 [RFC1144] 的脚注 21 和 cRTP [RFC2508]).当压缩可以假定 IPv4 ID 不变时 —— 如同 ROHC 和 ECRTP 那样 —— 效率可以提高.

5.5. Impact of Network Reordering and Loss (网络重排和丢包的影响)​

对网络重排和丢包的容忍是互联网体系结构的一项关键特性.尽管当前大多数 IP 网络会避免无谓地发生此类事件, 但重排和丢包都可能并且确实会发生.数据报本来就被允许被重排或丢失, 而对这类错误的恢复 (在受支持的情况下) 已经在传输层或更高协议层发生.

重排通常与路由瞬变或流被拆分到多条路径上有关.丢包通常与路径拥塞或链路故障 (部分或完全) 有关.这类事件对原子数据报和非原子数据报的影响不同, 下文将予以讨论.总之, 本文档的建议通过强调非原子数据报的 ID 唯一性要求, 以及更清楚地说明这些要求对两端和数据报中转设备的影响, 使互联网对重排和丢包更加健壮.

5.5.1. Atomic Datagrams Experiencing Reordering or Loss (经历重排或丢包的原子数据报)​

当 DF 位被正确遵守时, 重用 ID 值不会影响原子数据报, 因为顺序恢复并不依赖于数据报首部.TCP 使用传输首部中的序列号; 在另一些协议中, 顺序在应用层被指示和恢复.

当 DF=1 被忽略时, 重排或丢包可能导致不同数据报的分片交错, 从而被错误地重组并丢弃.如本文档所允许的那样, 原子数据报中重用 ID 值在此类情况下可能导致更高的数据报丢失.这种情况本来就可能存在, 因为已知有些设备会为原子数据报使用恒定的 ID (某些手机), 也已知有些设备会忽略 DF=1, 但并未有相应的大量丢包报告.缺少此类报告表明, 要么此类情况下不存在重排或丢包, 要么对由此产生的丢失具有容忍性.如果此类问题被报告出来, 解决不合规的设备 (那些忽略 DF=1 的设备) 会更有成效, 因为制定互联网规范去容忍忽略这些规范的设备是不切实际的.这就是本文档强调必须遵守 DF=1 的原因, 同时也强调数据报中转设备需要保留所接收到的 DF 位 (即不要清除它).

5.5.2. Non-atomic Datagrams Experiencing Reordering or Loss (经历重排或丢包的非原子数据报)​

非原子数据报依赖 ID 值的唯一性来容忍分片的重排, 尤其是在此类重排导致不同数据报的分片发生交错的情况下.分片丢失可能导致来自不同原始数据报的分片被重组, 这就是非原子数据报中的 ID 重用要基于数据报 (分片) 最大生命周期, 而不仅仅是预期的重排交错的原因.

本文档不改变非原子数据报中 ID 唯一性的要求, 因此不影响它们对此类重排或丢包的容忍性.本文档强调: 所有数据报源 (包括重写型中间盒) 都需要保持 ID 唯一性; 需要对源进行速率限制以确保 ID 唯一性; 不得为重传的数据报重用 ID; 以及需要使用高层完整性检查来防止重组错误 —— 所有这些都会带来对重排或丢包事件更高的容忍性.