4. Packet Processing (数据包处理)
4. Packet Processing (数据包处理)
本节描述 SR 源节点、传输节点和 SR 段端点节点的 SRv6 数据包处理。
4.1. SR Source Node (SR 源节点)
源节点将数据包引导到 SR Policy。如果 SR Policy 产生的 Segment List 仅包含单个段, 并且不需要向 SRH flag 添加信息或添加 TLV; 则将 DA 设置为单个 Segment List 条目, 并且可以省略 SRH。
需要时, SRH 的创建如下:
Next Header 和 Hdr Ext Len 字段按照 [RFC8200] 中的规定设置。
Routing Type 字段设置为 4。
数据包的 DA 设置为第一个段的值。
SRH Segment List 的第一个元素是最终段。第二个元素是倒数第二个段, 依此类推。
Segments Left 字段设置为 n-1, 其中 n 是 SR Policy 中的元素数量。
Last Entry 字段设置为 n-1, 其中 n 是 SR Policy 中的元素数量。
TLV (包括 HMAC) 可以根据其规范设置。
数据包被转发到数据包的 Destination Address (目标地址) (第一个段)。
4.1.1. Reduced SRH (简化 SRH)
当源不需要在 SRH 中保留整个 SID 列表时, 可以使用简化的 SRH。
简化的 SRH 不包含相关 SR Policy 的第一个段 (第一个段已经在 IPv6 报头的 DA 中), 并且 Last Entry 字段设置为 n-2, 其中 n 是 SR Policy 中的元素数量。
4.2. Transit Node (传输节点)
如 [RFC8200] 中所述, 唯一允许检查 Routing Extension Header (路由扩展头) (因此也包括 SRH) 的节点是与数据包的 DA 对应的节点。任何其他传输节点绝对不能检查下层路由头, 并且必须根据其 IPv6 路由表将数据包转发到 DA。
当 SID 在数据包的 IPv6 报头的目标地址中时, 它作为 IPv6 地址通过 IPv6 网络路由。SID, 或覆盖 SID 的前缀, 及其可达性可以通过本文档范围之外的方式分发。例如, 可以使用 [RFC5308] 或 [RFC5340] 来通告覆盖节点上 SID 的前缀。
4.3. SR Segment Endpoint Node (SR 段端点节点)
在不限制实现细节的情况下, SR 段端点节点为其本地 SID 创建 Forwarding Information Base (转发信息库, FIB) 条目。
当支持 SRv6 的节点接收 IPv6 数据包时, 它对数据包的目标地址执行最长前缀匹配查找。此查找可以返回以下任何一项:
-
表示本地实例化的 SRv6 SID 的 FIB 条目
-
表示本地接口的 FIB 条目, 未在本地实例化为 SRv6 SID
-
表示非本地路由的 FIB 条目
-
无匹配
4.3.1. FIB Entry Is a Locally Instantiated SRv6 SID (FIB 条目是本地实例化的 SRv6 SID)
本文档和本节定义单个 SRv6 SID。将来的文档可能会定义额外的 SRv6 SID。在这种情况下, 本节的全部内容将在该文档中定义。
如果 FIB 条目表示本地实例化的 SRv6 SID, 则按照 [RFC8200] 第 4 节中的定义处理 IPv6 报头的下一个报头链。第 4.3.1.1 节描述如何处理 SRH; 第 4.3.1.2 节描述如何处理上层报头或不存在 Next Header。
处理此 SID 会修改 Segments Left, 并且如果配置为处理 TLV, 则可能修改在路上改变的 TLV 类型的 "variable-length data"。因此, Segments Left 是可变的, 在路上改变的 TLV 是可变的。SRH 的其余部分 (Flags, Tag, Segment List, 以及不在路上改变的 TLV) 在处理此 SID 时是不可变的。
4.3.1.1. SRH Processing (SRH 处理)
S01. 当处理 SRH 时 {
S02. 如果 Segments Left 等于零 {
S03. 继续处理数据包中的下一个报头,
其类型由路由头中的 Next Header 字段标识。
S04. }
S05. 否则 {
S06. 如果本地配置要求 TLV 处理 {
S07. 执行 TLV 处理 (参见 TLV 处理)
S08. }
S09. max_last_entry = ( Hdr Ext Len / 2 ) - 1
S10. 如果 ((Last Entry > max_last_entry) 或
S11. (Segments Left 大于 (Last Entry+1)) {
S12. 向源地址发送 ICMP Parameter Problem, Code 0 消息,
指向 Segments Left 字段, 并丢弃数据包。
S13. }
S14. 否则 {
S15. 将 Segments Left 减 1。
S16. 将 Segment List[Segments Left] 从 SRH 复制到
IPv6 报头的目标地址。
S17. 如果 IPv6 Hop Limit 小于或等于 1 {
S18. 向源地址发送 ICMP Time Exceeded -- Hop Limit Exceeded in
Transit 消息并丢弃数据包。
S19. }
S20. 否则 {
S21. 将 Hop Limit 减 1
S22. 将数据包重新提交给 IPv6 模块以传输
到新目标。
S23. }
S24. }
S25. }
S26. }
4.3.1.1.1. TLV Processing (TLV 处理)
当 Active Segment 是本文档中定义的本地 SID 时, 本地配置决定如何处理 TLV。本地配置的定义不在本文档范围内。
仅出于说明目的, 下面提供了可能与 SID 关联的两个示例本地配置。
示例 1: 对于从接口 I2 接收的任何数据包 跳过 TLV 处理
示例 2: 对于从接口 I1 接收的任何数据包 如果第一个 TLV 是 HMAC { 处理 HMAC TLV } 否则 { 丢弃数据包 }
4.3.1.2. Upper-Layer Header or No Next Header (上层报头或无下一个报头)
当处理与本文档中定义的本地实例化为 SRv6 SID 的 FIB 条目匹配的数据包的上层报头时:
如果 (上层报头是 IPv4 或 IPv6) 并且
本地配置允许 {
执行 IPv6 解封装
将解封装的数据包重新提交给 IPv4 或 IPv6 模块
}
否则 {
向源地址发送 ICMP parameter problem 消息并
丢弃数据包。错误代码 (4) "SR Upper-layer
Header Error", 指针设置为上层报头的偏移量。
}
唯一的错误代码允许 SR 源节点识别端点处 SID 处理中的错误。
4.3.2. FIB Entry Is a Local Interface (FIB 条目是本地接口)
如果 FIB 条目表示本地接口并且未在本地实例化为 SRv6 SID, 则按如下方式处理 SRH:
如果 Segments Left 为零, 则节点必须忽略路由头并继续处理数据包中的下一个报头, 其类型由路由头中的 Next Header 字段标识。
如果 Segments Left 非零, 则节点必须丢弃数据包并向数据包的源地址发送 ICMP Parameter Problem, Code 0 消息, 指向无法识别的 Routing Type。
4.3.3. FIB Entry Is a Nonlocal Route (FIB 条目是非本地路由)
本文档不改变处理。
4.3.4. FIB Entry Is a No Match (FIB 条目无匹配)
本文档不改变处理。