第186篇:SRv6 基础:IPv6 扩展头与 SID
关键词:SRv6、IPv6扩展头、Segment Routing Header、SID编码、Locator、Endpoint、Behavior
一、引言
SRv6(Segment Routing over IPv6)是 IETF 定义的 SR 在 IPv6 网络上的实现。与 SR-MPLS 使用 MPLS 标签编码 Segment 不同,SRv6 直接将 Segment 编码为 IPv6 地址,将路径信息封装在 IPv6 扩展头(Segment Routing Header, SRH)中。SRv6 不仅继承了 SR 的源路由和无状态转发特性,还利用 IPv6 庞大的地址空间实现了网络编程能力,为未来的服务链、策略编排和云网融合奠定了基础。
二、核心概念
2.1 SRv6 与 SR-MPLS 对比
| 维度 | SR-MPLS | SRv6 |
|---|---|---|
| 编码方式 | MPLS 标签(20 位) | IPv6 地址(128 位) |
| 封装头 | MPLS 标签栈 | IPv6 SRH 扩展头 |
| 底层协议 | IPv4 或 IPv6 | 纯 IPv6 |
| 表达能力 | 有限(标签仅做转发标识) | 强大(SID 可携带函数逻辑) |
| 运维可见性 | 标签需解译 | IPv6 地址可读可理解 |
| 网络编程 | 不支持 | 原生支持(SID = 函数+参数) |
2.2 SRv6 SID 编码结构
SRv6 SID 是一个 128 位的 IPv6 地址,通常按以下结构划分:
| 字段 | 长度 | 说明 |
|---|---|---|
| Function Argument | 可变 | 函数参数(如接口索引、VNI 等) |
| Function ID | 可变 | 函数标识(区分 Node-SID、Adj-SID 等) |
| Locator | 可变 | 节点标识(所属路由器的地址前缀) |
SRv6 SID (128 bits):
+--------+--------+--------+--------+
| Locator | Function ID | Function Argument |
| (路由器地址前缀) | (函数类型) | (函数参数) |
+--------+--------+--------+--------+
示例: 2001:DB8:1000:0:0:0:0:1
Locator: 2001:DB8:1000::/48 (RouterA的地址段)
Function ID: 1 (Node-SID)
Function Argument: 0 (无参数)
2.3 Locator 概念
Locator 是 SRv6 中每个节点(或节点组)分配的 IPv6 前缀,用于标识 SID 的归属:
| Locator 类型 | 说明 | 示例 |
|---|---|---|
| Node Locator | 每台路由器独立的 Locator | 2001:DB8:1000::/64 |
| Group Locator | 一组路由器共享的 Locator | 2001:DB8:1000::/48 |
| Endpoint Locator | 出口节点的 Locator | 2001:DB8:2000::/48 |

2.4 IPv6 SRH(Segment Routing Header)
SRH 是 IPv6 的 Routing Header Type 4,用于承载 SRv6 路径信息:
IPv6 SRH 结构:
+------+------+------+------+
| Next Header | Hdr Ext Len | Segments Left | First Segment |
+------+------+------+------+
| (24) | (1字节) | (1字节) | Flags(4)+Res(4) |
+------+------+------+------+
| Segment List[0] (128 bits) |
+---------------------------------------------------------------+
| Segment List[1] (128 bits) |
+---------------------------------------------------------------+
| ... |
+---------------------------------------------------------------+
| Segment List[N] (128 bits) |
+---------------------------------------------------------------+
关键字段:
- Segments Left: 当前待处理的Segment索引
- Segment List: 完整的Segment列表(从最后到第一个)
2.5 SRv6 SID 行为(Behavior)
每个 SRv6 SID 关联一个行为(Behavior),定义报文到达该 SID 所属节点时的处理方式:
| 行为 | 名称 | 说明 |
|---|---|---|
| End | IPv6 终结 | 执行标准 IPv6 路由转发 |
| End.X | 跨域转发 | 弹出 SRH,基于内层报文转发 |
| End.DT6 | SRv6 转发表查找 | 基于 SRv6 转发表转发 |
| End.DT4 | IPv4 SRv6 转发表查找 | 内层 IPv4 报文查 SRv6 转发表 |
| End.T | 翻译 | IPv6 到 IPv4 翻译 |
| End.B6 | 聚合 SID 查找 | 基于聚合 SID 查找具体路径 |
三、技术细节
3.1 SRv6 SID 类型与编码
| SID 类型 | SID 编码示例 | Function ID 范围 | Behavior |
|---|---|---|---|
| Node-SID | 2001:DB8:1000::1 | 0~255 | End |
| Adj-SID | 2001:DB8:1000::8001 | 2048~4095 | End |
| SID with Arg | 2001:DB8:1000::100:1 | 256~1023 | End/End.X |
| BGP SID | 2001:DB8:1000::4001 | 1024~2047 | End.X |
3.2 SRH 与 IPv6 报文封装

3.3 SRv6 转发信息库
| 表项 | 内容 |
|---|---|
| SID 绑定表 | SID → Locator → Behavior → Function |
| SR 转发表 | SID → 下一跳 IPv6 地址(IGP 最短路径) |
| SRH 表 | Segments Left 索引 → 当前活跃 Segment |
3.4 SRv6 与 SR-MPLS 的 SID 映射
| 概念 | SR-MPLS | SRv6 |
|---|---|---|
| Node-SID | 全局标签(如 16) | IPv6 地址(如 2001:DB8:1000::1) |
| Adj-SID | 本地标签(如 16001) | IPv6 地址(如 2001:DB8:1000::8001) |
| Segment List | [标签栈: 19, 16004, 18] | [SID List: SID_D, Adj_SID, SID_C] |
| 标签操作 | Push / Pop / Swap | SRH 操作 / 目的地址更新 |
四、实战配置/案例分析
4.1 SRv6 基础配置
# ========== RouterA SRv6配置 ==========
< Huawei > system-view
[ Huawei ] sysname SRv6-RouterA
# --- 全局SRv6使能 ---
[ SRv6-RouterA ] ipv6
[ SRv6-RouterA ] srv6
# --- 配置Locator ---
[ SRv6-RouterA ] srv6 locator NODE-A
[ SRv6-RouterA-srv6-locator-NODE-A ] prefix 2001:DB8:1000::/48
[ SRv6-RouterA-srv6-locator-NODE-A ] length 128
# SID长度为128位(精确匹配)
# --- 分配Node-SID ---
[ SRv6-RouterA ] srv6 sid 2001:DB8:1000::1
[ SRv6-RouterA-srv6-sid-2001:DB8:1000::1 ] behavior End
# Node-SID, End行为
[ SRv6-RouterA-srv6-sid-2001:DB8:1000::1 ] locator NODE-A
[ SRv6-RouterA-srv6-sid-2001:DB8:1000::1 ] commit
# --- 接口配置 ---
[ SRv6-RouterA ] interface LoopBack 0
[ SRv6-RouterA-LoopBack0 ] ipv6 address 2001:DB8::1 128
[ SRv6-RouterA ] interface 100ge 1/0/1
[ SRv6-RouterA-100GE1/0/1 ] ipv6 enable
[ SRv6-RouterA-100GE1/0/1 ] ipv6 address 2001:DB8:FEED::1 126
[ SRv6-RouterA-100GE1/0/1 ] srv6
# 接口使能SRv6
# --- BGP-LS通告SID ---
[ SRv6-RouterA ] bgp 65001
[ SRv6-RouterA-bgp ] ipv6 unicast-ui
[ SRv6-RouterA-bgp-af ] srv6 ls
# BGP-LS发布SRv6 SID信息
4.2 SRv6 SID 通告配置
# ========== IS-IS通告SRv6 SID ==========
[ SRv6-RouterA ] isis 1
[ SRv6-RouterA-isis1 ] network-entity 49.0001.0000.0000.0001.00
[ SRv6-RouterA-isis1 ] cost-style wide
[ SRv6-RouterA-isis1 ] ipv6 enable
[ SRv6-RouterA-isis1 ] srv6
[ SRv6-RouterA-isis1 ] srv6 locator NODE-A
# IS-IS通告SRv6 Locator信息
[ SRv6-RouterA ] interface 100ge 1/0/1
[ SRv6-RouterA-100GE1/0/1 ] isis enable 1
[ SRv6-RouterA-100GE1/0/1 ] isis ipv6 enable
[ SRv6-RouterA-100GE1/0/1 ] isis srv6
# 接口启用IS-IS SRv6通告
4.3 故障排查:SRv6 SID 无法路由
故障场景:配置 SRv6 SID 后,其他节点无法通过 SID 路由到本节点。
# Step 1: 检查SID配置
<SRv6-RouterA> display srv6 sid
SID: 2001:DB8:1000::1
Behavior: End
Locator: NODE-A
State: Active
# SID配置正常
# Step 2: 检查Locator
<SRv6-RouterA> display srv6 locator
Locator: NODE-A
Prefix: 2001:DB8:1000::/48
State: Active
# Locator正常
# Step 3: 检查IGP路由
<SRv6-RouterB> display ipv6 routing-table 2001:DB8:1000::1
Destination: 2001:DB8:1000::1/128
Protocol: Static
# 问题: SID路由是Static,不是IGP!
# 根因: SID前缀未通过IGP通告
# Step 4: 检查IS-IS通告
<SRv6-RouterA> display isis lsdb
# 检查SID前缀是否在IS-IS LSP中
# 发现缺少SRv6 SID前缀通告
# Step 5: 修正-将SID前缀引入IS-IS
[SRv6-RouterA] isis 1
[SRv6-RouterA-isis1] import-route static
[SRv6-RouterA-isis1] srv6 locator NODE-A advertise
# 通告SRv6 Locator前缀
# 或使用BGP-LS
[SRv6-RouterA] bgp 65001
[SRv6-RouterA-bgp] srv6 ls locator NODE-A
# BGP-LS发布Locator信息
# Step 6: 验证
<SRv6-RouterB> display ipv6 routing-table 2001:DB8:1000::1
Destination: 2001:DB8:1000::1/128
Protocol: IS-IS
NextHop: 2001:DB8:FEED::1
# 路由正常,可通过SID到达RouterA
五、总结
| 项目 | 要点 |
|---|---|
| SRv6 编码 | SID = 128 位 IPv6 地址,结构为 Locator + Function ID + Function Argument |
| SRH | IPv6 Routing Header Type 4,承载 Segment List 和 Segments Left |
| Locator | 节点或节点组的 IPv6 前缀,标识 SID 归属 |
| Behavior | SID 关联的行为,如 End(终结)、End.X(跨域转发) |
| 与 SR-MPLS 对比 | SRv6 具有更强的表达能力和网络编程能力 |
| SID 通告 | 通过 IS-IS/BGP-LS 通告 Locator 和 SID 信息 |
思考
- SRv6 SID 使用 128 位 IPv6 地址,相比 SR-MPLS 的 20 位标签,为什么不需要担心地址空间不足?
- SRH 中的 Segment List 是从最后一个 Segment 到第一个 Segment 排列的(逆序)。为什么 IETF 选择这种顺序?
- SRv6 Locator 的前缀需要通过 IGP 或 BGP 通告。如果 Locator 前缀未通告,远端节点是否还能通过 SID 路由到本节点?
下篇预告:第187篇:SRv6 转发流程与 End/End.X SID