跳到主要内容

2. Segment Routing Header (段路由头)

2. Segment Routing Header (段路由头)

路由头在 [RFC8200] 中定义。Segment Routing Header (段路由头, SRH) 具有一个新的 Routing Type (路由类型) (4)。

SRH 定义如下:

  0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Last Entry | Flags | Tag |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Segment List[0] (128-bit IPv6 address) |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| |
...
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Segment List[n] (128-bit IPv6 address) |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// //
// Optional Type Length Value objects (variable) //
// //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中:

Next Header: 在 [RFC8200] 第 4.4 节中定义。

Hdr Ext Len: 在 [RFC8200] 第 4.4 节中定义。

Routing Type: 4。

Segments Left: 在 [RFC8200] 第 4.4 节中定义。

Last Entry: 包含 Segment List (段列表) 中最后一个元素的索引 (从零开始)。

Flags: 8 位标志。第 8.1 节创建了一个 IANA 注册表用于定义新标志。定义了以下标志:

      0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|U U U U U U U U|
+-+-+-+-+-+-+-+-+

U: 未使用, 保留供将来使用。在传输时必须为 0, 在接收时被忽略。

Tag: 将数据包标记为一类或一组数据包的一部分 -- 例如, 共享相同属性集的数据包。当 Tag 在源处不使用时, 在传输时必须设置为零。当 Tag 在 SRH 处理期间不使用时, 应该被忽略。在处理第 4.3.1 节中定义的 SID 时不使用 Tag。在处理本文档中未定义的其他 SID 时可能会使用它。Tag 的分配和使用不在本文档范围内。

Segment List[0..n]: 128 位 IPv6 地址, 表示 Segment List 中的第 n 个段。Segment List 从 SR Policy (SR 策略) 的最后一个段开始编码。也就是说, Segment List 的第一个元素 (Segment List[0]) 包含 SR Policy 的最后一个段, 第二个元素包含 SR Policy 的倒数第二个段, 依此类推。

TLV: Type Length Value (类型长度值, TLV) 在第 2.1 节中描述。

在 SRH 中, Next Header, Hdr Ext Len, Routing Type 和 Segments Left 字段在 [RFC8200] 的第 4.4 节中定义。根据该节中的约束, Next Header, Header Ext Len 和 Routing Type 不可变, 而 Segments Left 可变。

TLV 值的可变性由类型中的最高有效位定义, 如第 2.1 节所述。

第 4.3 节在本文档定义的 SID 上下文中定义了 SRH 中剩余字段 (Flags, Tag, Segment List) 的可变性。

将来定义的新 SID 必须指定 Flags, Tag 和 Segment List 的可变性属性, 并指示 Hashed Message Authentication Code (哈希消息认证码, HMAC) TLV (第 2.1.2 节) 验证的工作方式。请注意, 实际上这些字段是可变的。

与 SR 模型一致, SRH 的源始终知道如何设置 SRH 的 Segment List, Flags, Tag 和 TLV, 以便在 SR 域内使用。如何实现这一点不在本文档范围内, 但可能基于拓扑, 可用的 SID 及其可变性属性, 目标的 SRH 可变性要求或任何其他信息。

2.1. SRH TLVs

本节定义 Segment Routing Header 的 TLV。

TLV 为段处理提供元数据。本文档中定义的唯一 TLV 是 HMAC (第 2.1.2 节) 和填充 TLV (第 2.1.1 节)。在处理第 4.3.1 节中定义的 SID 时, 除非本地配置另有指示 (第 4.3.1.1.1 节), 否则将忽略所有 TLV。因此, 对于任何实现, TLV 和 HMAC 支持都是可选的; 但是, 添加或解析 TLV 的实现必须支持 PAD TLV。其他文档可能会定义额外的 TLV 及其处理规则。

当 Hdr Ext Len 大于 (Last Entry+1)*2 时, 存在 TLV。

在段端点处理 TLV 时, TLV 必须完全包含在由 Hdr Ext Len 确定的 SRH 内。检测到超出 SRH Hdr Ext Len 边界的 TLV 将导致向源地址发送 ICMP Parameter Problem (参数问题), Code 0 消息, 指向 SRH 的 Hdr Ext Len 字段, 并丢弃数据包。

实现可以根据本地配置限制其处理的 TLV 的数量和/或长度。它可以限制:

  • 连续 Pad1 (第 2.1.1.1 节) 选项的数量为 1。如果需要超过一个字节的填充, 则应使用 PadN (第 2.1.1.2 节)。

  • PadN 中的长度为 5。

  • 要处理的非 Pad TLV 的最大数量。

  • 要处理的所有 TLV 的最大长度。

当超过这些配置的限制时, 实现可以停止处理 SRH 中的其他 TLV。

 0                   1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------------------
| Type | Length | Variable-length data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-----------------------

Type: 来自 "Segment Routing Header TLVs" [IANA-SRHTLV] 的 8 位代码点。在接收时必须忽略无法识别的类型。

Length: 可变长度数据字段的长度 (以字节为单位)。

Variable-length data: 特定于 Type 的数据。

Type Length Value (TLV) 条目包含可选信息, 可由数据包的 Destination Address (目标地址, DA) 中标识的节点使用。

每个 TLV 都有自己的长度, 格式和语义。分配 (由 IANA) 给每个 TLV Type 的代码点定义了 TLV 中携带的信息的格式和语义。可以在同一个 SRH 中编码多个 TLV。

TLV 类型的最高位 (位 0) 指定该类型的 TLV 数据是否可以在到达数据包最终目的地的路上改变:

0: TLV 数据在路上不改变

1: TLV 数据在路上改变

所有 TLV 都使用 xn+y 格式指定其对齐要求。xn+y 格式按照 [RFC8200] 定义。SR 源节点在构造 SRH 时使用 TLV 和 Padding TLV 的 xn+y 对齐要求。

TLV 的 Length 字段用于在检查 SRH 时跳过 TLV, 以防节点不支持或无法识别该 Type。Length 定义 TLV 长度 (以八位字节为单位), 不包括 Type 和 Length 字段。

本文档中定义了以下 TLV:

Padding TLVs (填充 TLV)

HMAC TLV

将来可能会定义其他 TLV。