3. SRv6 数据平面与 SRH 扩展头

SRv6 的核心思想是把 IPv6 地址直接当作 SID(Segment Identifier)使用,转发面不再依赖 MPLS 标签,而是依赖 IPv6 报头与路由扩展头完成路径编程。理解 SRv6 数据平面,关键要抓住三件事:SID 如何编码、SRH 如何组织 Segment List、节点收到报文后如何根据 SID 与 SRH 状态决定下一步转发行为。

一、IPv6 地址即 SID:定位与功能合一

在 SRv6 中,一个 128 位 IPv6 地址既承担传统“定位”语义,又承担“指令”语义。通常把 SID 划分为 Locator 与 Function 两部分:Locator 是路由可达前缀,用于把报文引导到执行该 SID 的节点;Function 是节点本地定义的指令,例如 End、End.X、End.DT4、End.DX6 等。节点收到目的地址属于本地 Locator 的报文后,会取出 Function 部分执行对应行为。

例如某节点 Locator 为 2001:db8:1:1::/64,则 2001:db8:1:1::100 可表示一个 End SID,2001:db8:1:1::101 可表示一个 End.X SID。这里的 ::100 与 ::101 是示例编码,实际工程中 Function 的位宽与取值由规划决定。需要强调的是:SID 不是“随便一个地址”,它必须与节点上的本地 SID 表项绑定,否则报文到达后无法触发预期行为。

二、SRH 扩展头:Segment List 的载体

当路径需要显式指定多个 SID 时,SRv6 使用 SRH(Segment Routing Header)承载 Segment List。SRH 是 IPv6 路由扩展头的一种,Next Header 值为 43。其关键字段包括:

  • Segments Left (SL):指向当前应处理的 Segment List 条目,初始值通常为 Segment List 长度减一,每经过一个 End 或 End.X 行为递减。
  • Last Entry:Segment List 最后一个条目的索引,用于界定有效范围。
  • Segment List[0..n]:按逆序排列的 SID 列表,报文实际转发时从 Segment List[SL] 开始取用。
  • Flags、Tag:用于标记与策略关联,通常不改变基本转发逻辑。
  • 可选 TLV:如 HMAC TLV 用于完整性校验,其他 TLV 可承载路径标识、OAM 信息等。

SRH 本身不改变 IPv6 逐跳转发的基本规则,它只是把“接下来该去哪个 SID”显式写在报文里。节点处理 SRH 时,会检查 IPv6 目的地址是否为本节点 SID,再结合 SL 决定是否更新目的地址并继续转发。

SRv6 报文结构与转发行为示意 IPv6 基本头 Next Header = 43 SRH 路由扩展头 SL / Last Entry / Flags / Tag / Segment List / 可选 TLV 有效载荷 Payload / 上层协议数据 Segment List 示例(逆序存放) Segment List[0] 2001:db8:3:3::100 Segment List[1] 2001:db8:2:2::100 Segment List[2] 2001:db8:1:1::100 SL 初始值 SL = 2 节点转发行为:以 End 行为为例 ① 收到报文 目的地址 = 本地 SID SL > 0 ② 更新目的地址 DA = Segment List[SL-1] SL = SL - 1 ③ 查表转发 按新 DA 查 IPv6 路由 发往下一跳 ④ 末端处理 SL = 0 时 弹出 SRH 或交付

三、解析 SRv6 报文:从字段到转发动作

实际解析一份 SRv6 报文时,可以按以下顺序定位转发行为。首先看 IPv6 基本头中的目的地址是否属于本节点 Locator;若是,则继续检查 Next Header 是否为 43。若为 43,则读取 SRH 中的 Segments Left 与 Segment List。若 SL 大于 0,节点执行 End 或 End.X 行为:把 IPv6 目的地址替换为 Segment List[SL-1],同时把 SL 减 1,然后按新目的地址查表转发。若 SL 等于 0,说明已到达路径末端,节点根据 SID 的 Function 执行 End.DT4、End.DX6 等末端行为,或弹出 SRH 后按普通 IPv6 转发。

下面给出一个简化的解析示例,假设节点 A 的 Locator 为 2001:db8:1:1::/64,收到报文目的地址为 2001:db8:1:1::100,SRH 中 Segment List 为 [2001:db8:3:3::100, 2001:db8:2:2::100, 2001:db8:1:1::100],SL 初始为 2。节点 A 判断目的地址属于本地 Locator,执行 End 行为:将目的地址改为 2001:db8:2:2::100,SL 减为 1,然后按新目的地址转发到节点 B。节点 B 重复同样逻辑,把目的地址改为 2001:db8:3:3::100,SL 减为 0,最终报文到达节点 C 并交付。

四、可选 TLV 与 HMAC:安全与扩展

SRH 允许携带可选 TLV,其中 HMAC TLV 用于对 SRH 及部分 IPv6 字段做完整性校验。HMAC TLV 包含 Key ID、HMAC 算法标识与 HMAC 值。启用后,节点在转发前可校验 HMAC,防止 Segment List 被篡改。需要注意的是,HMAC 校验会增加处理开销,通常只在安全要求较高的域内或跨域边界启用。其他 TLV 还可用于携带路径标识、OAM 探测信息或网络切片标识,但并非所有节点都必须支持,实际部署时要确认设备能力与互操作性。

解析 SRv6 报文时,建议先确认“目的地址是否为本节点 SID”,再看 SRH 的 SL 与 Segment List。很多转发异常并非 SRH 本身错误,而是 SID 未正确绑定或 Locator 路由不可达。

五、工程判断要点

在工程中定位 SRv6 转发行为,可以按以下检查项快速判断:

检查项预期值/现象异常提示
IPv6 目的地址属于本节点 Locator不属于则不会触发本地 SID 行为
Next Header43(SRH)非 43 则按普通 IPv6 处理
Segments Left初始为 Segment List 长度减一SL 异常会导致路径错乱
Segment List 顺序逆序存放,SL 指向当前条目顺序错误会导致转发到错误节点
HMAC TLV按需启用,校验通过校验失败则丢弃或告警

掌握以上结构后,SRv6 数据平面就不再神秘:IPv6 地址是 SID,SRH 是 Segment List 的容器,SL 是路径游标,节点根据 SID 与 SL 执行 End、End.X 或末端行为。解析报文时,先看目的地址,再看 SRH,最后看 SL 与 Segment List,即可定位当前转发动作与下一跳方向。