跳到主要内容

3.4.3. Sequence Number Verification (序列号验证)

所有 AH 实现必须 (MUST) 支持防重放服务, 尽管接收方可以基于每个 SA 启用或禁用其使用。防重放适用于单播和多播 SA。但是, 本标准没有为多发送方 SA (单播或多播) 提供防重放机制指定任何机制。在缺乏此类 SA 的防重放机制的协商 (或手动配置) 的情况下, 建议禁用 SA 的发送方和接收方对序列号的检查 (通过协商或手动配置), 如下所述。

如果接收方未为 SA 启用防重放, 则不对序列号执行入站检查。但是, 从发送方的角度来看, 默认是假设接收方已启用防重放。为了避免让发送方进行不必要的序列号监控和 SA 设置 (见第 3.3.2 节 "Sequence Number Generation (序列号生成)"), 如果使用了 SA 建立协议 (如 IKE), 则如果接收方不提供防重放保护, 接收方应该 (SHOULD) 在 SA 建立期间通知发送方。

如果接收方已为此 SA 启用了防重放服务, 则在建立 SA 时, SA 的接收数据包计数器必须 (MUST) 初始化为零。对于每个接收到的数据包, 接收方必须 (MUST) 验证数据包包含的序列号不会与此 SA 生命周期内接收的任何其他数据包的序列号重复。在将数据包与 SA 匹配后, 这应该 (SHOULD) 是应用于数据包的第一个 AH 检查, 以加速拒绝重复数据包。

通过使用滑动接收窗口来拒绝重复。窗口的实现方式是本地问题, 但以下文本描述了实现必须展示的功能。

窗口的 "右" 边缘表示此 SA 上接收到的最高验证序列号值。包含低于窗口 "左" 边缘的序列号的数据包被拒绝。落在窗口内的数据包针对窗口内已接收数据包的列表进行检查。

如果为 SA 选择了 ESN 选项, 则仅显式传输序列号的低 32 位, 但接收方在根据接收窗口检查接收到的序列号时, 使用从其本地计数器计算的完整序列号 (使用指示 SA 的高 32 位)。在构造完整序列号时, 如果数据包中携带的低 32 位值低于接收方序列号计数器的低 32 位, 则接收方假设高 32 位已递增, 移至新的序列号子空间。(此算法可以容纳单个 SA 的接收间隙大到 2**32-1 个数据包。如果发生更大的间隙, 则可以使用额外的启发式检查来重新同步接收方的序列号计数器, 如附录 B 中所述。)

如果接收到的数据包落在窗口内且不是重复的, 或者如果数据包在窗口的右侧, 则接收方继续进行 ICV 验证。如果 ICV 验证失败, 接收方必须 (MUST) 将接收到的 IP 数据报作为无效丢弃。这是可审计事件。此事件的审计日志条目应该 (SHOULD) 包括 SPI 值, 日期/时间, 源地址, 目标地址, 序列号, 以及 (在 IPv6 中) 流 ID。仅当 ICV 验证成功时才更新接收窗口。

必须 (MUST) 支持 32 个数据包的最小窗口大小, 但首选 64 的窗口大小, 并且应该 (SHOULD) 用作默认值。接收方可以 (MAY) 选择另一个窗口大小 (大于最小值)。(接收方不通知发送方窗口大小。) 对于更高速度的环境, 应该增加接收窗口大小, 而不考虑保证问题。本标准未指定非常高速 (例如, 多吉比特/秒) 设备的最小和推荐接收窗口大小的值。