跳到主要内容

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 条目无匹配)​

本文档不改变处理.