3. SRv6 SID
3. SRv6 SID
[RFC8402] 定义 SRv6 Segment Identifier (段标识符) 为与段明确关联的 IPv6 地址。
当 SRv6 SID 位于数据包的 IPv6 头部的 Destination Address (目标地址) 字段中时, 它会作为 IPv6 地址通过 IPv6 网络中的中转节点进行路由。
其处理过程在 [RFC8754] 的 Section 4.3 中定义, 这里作为提醒重现如下:
在不限制实现细节的情况下, SR segment endpoint node (段端点节点) 为其本地 SID 创建 Forwarding Information Base (转发信息库, FIB) 条目。
当具有 SRv6 能力的节点接收到 IPv6 数据包时, 它对数据包的目标地址执行 longest-prefix-match lookup (最长前缀匹配查找)。此查找可能返回以下任何结果:
表示本地实例化的 SRv6 SID 的 FIB 条目
表示本地接口的 FIB 条目, 未本地实例化为 SRv6 SID
表示非本地路由的 FIB 条目
无匹配
本文档的 Section 4 定义了一组新的 SRv6 SID behaviors (行为), 这是对 [RFC8754] Section 4.3.1 中定义的行为的补充。
3.1. SID Format (SID 格式)
本文档将 SRv6 SID 定义为由 LOC:FUNCT:ARG 组成, 其中 locator (定位符, LOC) 编码在 SID 的 L 个最高有效位中, 后跟 F 位的 function (函数, FUNCT) 和 A 位的 arguments (参数, ARG)。L, 即 locator length (定位符长度), 是灵活的, 运营者可以自由使用其选择的定位符长度。F 和 A 可以是任何值, 只要 L+F+A <= 128。当 L+F+A 小于 128 时, SID 的剩余位必须为零。
locator 可以表示为 B:N, 其中 B 是 SRv6 SID block (SRv6 SID 块, 运营者为 SRv6 SID 分配的 IPv6 前缀), N 是实例化该 SID 的父节点的标识符。
当 SRv6 SID 的 LOC 部分是可路由的时, 它会指向实例化该 SID 的节点。
FUNCT 是绑定到 SID 的本地行为的不透明标识。
术语 "function" (函数) 指的是 SRv6 SID 中的比特串。术语 "behavior" (行为) 标识绑定到 SID 的行为。本文档的 Section 4 中定义了一些行为。
SRv6 Endpoint behavior (端点行为) 可能需要额外的信息用于其处理 (例如, 与流或服务相关)。此信息可以编码在 SID 的 ARG 位中。
在这种情况下, ARG 位的语义和格式作为 SRv6 Endpoint behavior 规范的一部分定义。
routed SID (路由 SID) 的 ARG 值在给定流的数据包之间应该保持不变。在流中的数据包之间变化的 ARG 值可能导致不同的 ECMP hashing (哈希) 并引起重新排序。
3.2. SID Allocation within an SR Domain (SR 域内的 SID 分配)
Locator 的分配与 IPv6 infrastructure allocation (基础设施分配) 一致。例如, 网络运营者可以:
-
将 block B::/48 分配给 SR domain (SR 域)
-
为域中的每个启用 SRv6 的节点分配唯一的 B:N::/64 块
作为示例, 一家移动服务提供商已在超过 1000 台商用路由器和 1800 台白盒路由器上商业部署了 SRv6。所有这些设备都启用了 SRv6 并通告 SRv6 SID。该提供商历史上部署了 IPv6 并从 Unique Local Address (唯一本地地址, ULA) 空间 [RFC4193] 分配基础设施地址。他们专门分配了三个 /48 前缀 (国家 X, 国家 Y, 国家 Z) 来支持其 SRv6 基础设施。从这些 /48 前缀中, 每个路由器被分配了一个 /64 前缀, 从中分配该路由器的所有 SID。
在另一个示例中, 一家大型移动和固定线路服务提供商已在其全国网络中商业部署了 SRv6。该提供商由 Regional Internet Registry (区域互联网注册机构, RIR) 分配了一个 /20 前缀。他们为其基础设施子分配了几个 /48 前缀以部署 SRv6。每个路由器被分配了一个 /64 前缀, 从中分配该路由器的所有 SID。
这两个示例中的 IPv6 地址消耗都很小, 分别代表不到可用地址空间的十亿分之一和百万分之一。
从 RIR 接收当前最小分配 /32 前缀的服务提供商可以将 /48 前缀分配给其部署 SRv6 的基础设施, 然后在每个 SRv6 节点为 SID 分配 /64 前缀。/48 分配是提供商可用于分配的可用 IPv6 地址空间的六万五千分之一 (1/2^16)。
当运营者在节点上实例化 SID 时, 他们使用本文档中定义的注册表的 SRv6 Endpoint Behavior codepoint (端点行为代码点) 之一指定 SID 值 B:N:FUNCT 和绑定到 SID 的行为 (参见 Table 6)。
节点在 control plane (控制平面) 中通告 SID, B:N:FUNCT (参见 Section 8), 以及标识 SID 行为的 SRv6 Endpoint Behavior codepoint。
SR source node (源节点) 无法通过检查 SID 的 FUNCT 值来推断行为。
因此, SRv6 Endpoint Behavior codepoint 与 SID 一起在控制平面中通告。
SR source node 使用 SRv6 Endpoint Behavior codepoint 将接收到的 SID (B:N:FUNCT) 映射到行为。
SR source node 通过选择使用所需行为通告的 SID (B:N:FUNCT) 来选择通告节点的所需行为。
作为示例:
-
网络运营者可以从其内部操作块为其 SRv6 基础设施分配 SRv6 SID block 2001:db8:bbbb::/48。
-
网络运营者可以将 SRv6 Locator 2001:db8:bbbb:3::/64 分配给其 SR Domain 中的一个特定路由器, 例如 Router 3。
-
在 Router 3, 在 locator 2001:db8:bbbb:3::/64 内, 网络运营者或路由器执行动态分配:
-
Function 0x0100 与 behavior End.X (Endpoint with L3 cross-connect, 具有 L3 交叉连接的端点) 关联, 在 router 3 和其连接的邻居路由器 (例如, Router 4) 之间。此 function 编码为 16 位值且没有参数 (F=16, A=0)。
此 SID 在控制平面中通告为 2001:db8:bbbb:3💯:, SRv6 Endpoint Behavior codepoint 值为 5。
-
Function 0x0101 与 behavior End.X (Endpoint with L3 cross-connect, 具有 L3 交叉连接的端点) 关联, 在 router 3 和其连接的邻居路由器 (例如, Router 2) 之间。此 function 编码为 16 位值且没有参数 (F=16, A=0)。
此 SID 在控制平面中通告为 2001:db8:bbbb:3:101::, SRv6 Endpoint Behavior codepoint 值为 5。
-
这些示例不排除任何其他 IPv6 addressing allocation scheme (地址分配方案)。
3.3. SID Reachability (SID 可达性)
通常, 节点 N 会通告与覆盖其 SID 的 LOC 部分匹配的 IPv6 prefix (前缀) 或更短掩码前缀。这些通告的分发和可达性计算特定于路由协议, 超出了本文档的范围。
如果 SRv6 SID 属于通过路由协议通告的 IPv6 前缀, 则称其为 routed (路由的)。不满足此条件的 SRv6 SID 是 non-routed (非路由的)。
让我们提供一个典型的示例:
节点 N 显式配置了两个 SID: 2001:db8🅱️1💯: 和 2001:db8🅱️2:101::。
网络通过 IGP 了解到 2001:db8🅱️1::/64 的路径; 因此, 目标为 2001:db8🅱️1💯: 的数据包将被路由到 N。网络没有通过 IGP 了解到 2001:db8🅱️2::/64 的路径; 因此, 目标为 2001:db8🅱️2:101:: 的数据包不会被路由到 N。
数据包可以通过使用 SID list (SID 列表) <...,2001:db8🅱️1💯:,2001:db8🅱️2:101::,...> 引导通过 non-routed SID 2001:db8🅱️2:101::, 其中 non-routed SID 前面是到同一节点的 routed SID。数据包也可以通过在 SID list 中在其前面加上到该节点的 Adj-SID 来引导到实例化 non-routed SID 的节点。Routed 和 non-routed SRv6 SID 分别是 global 和 local segments (全局和本地段) 的 SRv6 实例化 [RFC8402]。