跳到主要内容

7. IP 分组处理

本文档定义了一种概念上属于 IP 链路的隧道机制. 然而, 由于链路附着在 IP 路由器上, 如果实现没有把相关职责委托给另一个实现 (例如内核), 它可能需要处理 IP 路由器的一些职责.

7.1. 链路操作

本文档描述的 IP 转发隧道并不是 IPv6 寻址架构意义上的完整功能 "interfaces" [IPv6-ADDR]. 特别是, 它们不一定具有 IPv6 link-local 地址. 此外, 这类接口不使用 IPv6 stateless autoconfiguration 或 router advertisement 消息, 也不使用 neighbor discovery.

使用 HTTP/2 或 HTTP/3 时, 客户端 MAY 在收到其 IP 代理请求响应之前机会式地开始发送被代理 IP 分组. 但需要注意, 如果 IP 代理以失败响应该请求, 或者 IP 代理在收到请求之前就收到了这些 datagram, 它们可能不会被 IP 代理处理. 由于需要收到地址和路由才能知道某个分组可以通过隧道发送, 如果 IP 代理选择提供与客户端假设不同的寻址或路由信息, 这类机会式分组可能会被 IP 代理丢弃.

注意, 多个被代理 IP 分组可能封装在同一个外层分组中, 例如因为一个 QUIC 分组可以携带多个 QUIC DATAGRAM 帧. 一个被代理 IP 分组也可能跨越多个外层分组, 因为 DATAGRAM capsule 可以被拆分到多个 QUIC 或 TCP 分组中.

7.2. 路由操作

本节中的要求是对通常适用于 IP 路由器的要求的重述, 可能不适用于依赖外部软件进行路由的 IP 代理实现.

当端点收到包含 IP 分组的 HTTP Datagram 时, 它会解析该分组的 IP 头部, 执行任何本地策略检查 (例如源地址验证), 检查其路由表以选择出站接口, 然后在该接口上发送 IP 分组, 或将其传递给本地应用. 端点也可以选择丢弃任何收到的分组而不转发. 就 IP 代理而言, 如果收到的 IP 分组未通过任何正确性或策略检查, 那是转发错误而不是协议违规; 见第 7.2.1 节. IP 代理端点 MAY 对它们转发的 IP 分组实现额外过滤策略.

在另一个方向上, 当端点收到 IP 分组时, 它会检查该分组是否匹配为某个 IP 隧道映射的路由, 并在通过 HTTP Datagrams 传输该分组之前执行与上文相同的转发检查.

当 IP 代理端点在不同链路之间转发 IP 分组时, 它们会在封装时递减 IP Hop Count (或 TTL), 但不会在解封装时递减. 换言之, Hop Count 会在 IP 分组即将在 HTTP Datagram 中传输之前递减. 这可以在存在路由环路时防止无限循环, 并与 IPsec [IPSEC] 中的选择相匹配. 这不适用于 IP 代理端点自身生成的 IP 分组.

实现者需要确保不会把任何 link-local 流量转发到其接收所在 IP 代理接口之外. IP 代理端点还需要正确回复目的地为 link-local multicast 地址的分组.

IPv6 要求每条链路的 MTU 至少为 1280 字节 [IPv6]. 由于 HTTP 中的 IP 代理在 HTTP Datagrams 中传递 IP 分组, 而这些 datagram 又可以在无法分片的 QUIC DATAGRAM 帧中发送 [DGRAM], IP 隧道的 MTU 可能受运行 IP 代理的 QUIC 连接 MTU 限制. 这可能导致违反 IPv6 最小链路 MTU 的情况. 作为路由器运行且支持 IPv6 的 IP 代理端点 MUST 确保 IP 隧道链路 MTU 至少为 1280 字节 (即它们可以发送 payload 至少为 1280 字节的 HTTP Datagrams). 这可以通过多种技术实现:

  • 如果两个 IP 代理端点都能确定未使用 HTTP 中介, 端点可以填充承载 IP 代理的外层 QUIC 连接的 QUIC INITIAL 分组. (假设使用 QUIC version 1, 开销包括: type 1 字节, 最大 connection ID length 20 字节, 最大 packet number length 4 字节, DATAGRAM frame type 1 字节, 最大 Quarter Stream ID 8 字节, zero Context ID 1 字节, Authenticated Encryption with Associated Data (AEAD) authentication tag 16 字节, 总计 51 字节开销, 对应于把 QUIC INITIAL 分组填充到 1331 字节或更多.)

  • IP 代理端点也可以发送带有 1232 字节数据的 ICMPv6 echo request 来确认链路 MTU, 并在未收到响应时拆除隧道. 除非端点拥有带外手段来保证前述技术已经足够, 否则它们 MUST 使用此方法. 如果端点不知道其对等方的 IPv6 地址, 它可以把 ICMPv6 echo request 发送到 link-local all nodes multicast 地址 (ff02::1).

如果端点正在使用 QUIC DATAGRAM 帧传送 IPv6 分组, 并检测到 QUIC MTU 低到无法发送 1280 字节, 它 MUST 中止 IP 代理请求流.

7.2.1. 错误信令

由于 IP 代理端点经常继续把 IP 分组转发到其他网络接口, 它们需要处理转发过程中的错误. 例如, 如果端点没有到目的地址的路由, 如果它按策略配置为拒绝某个目的前缀, 或如果出站链路 MTU 低于待转发分组大小, 转发都可能失败. 在这类场景中, IP 代理端点 SHOULD 使用 ICMP [ICMP] [ICMPv6] 向其对等方发出转发错误信令, 方法是生成 ICMP 分组并使用 HTTP Datagrams 发送它们.

端点可以自由选择要发送的最适当 ICMP 错误. 与 IP 代理相关的一些示例如下:

  • 对于无效源地址, 发送 Destination Unreachable (ICMPv6 第 3.1 节), code 为 5, "Source address failed ingress/egress policy".

  • 对于不可路由目的地址, 发送 Destination Unreachable (ICMPv6 第 3.1 节), code 为 0, "No route to destination", 或 code 为 1, "Communication with destination administratively prohibited".

  • 对于无法装入出站链路 MTU 的分组, 发送 Packet Too Big (ICMPv6 第 3.2 节).

为了接收这些错误, 端点需要准备好接收 ICMP 分组. 如果端点不发送 ROUTE_ADVERTISEMENT capsule, 例如客户端通过 IP 代理打开 IP flow, 它 SHOULD 处理来自其对等方的被代理 ICMP 分组, 以便接收这些错误. 注意, ICMP 消息可能来自不同于 IP 代理对等方的源地址; 如果使用范围限定, 也可能来自 target 之外 (见第 4.6 节).