第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

Locator 概念 - 图示

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 报文封装

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 信息

思考

  1. SRv6 SID 使用 128 位 IPv6 地址,相比 SR-MPLS 的 20 位标签,为什么不需要担心地址空间不足?
  2. SRH 中的 Segment List 是从最后一个 Segment 到第一个 Segment 排列的(逆序)。为什么 IETF 选择这种顺序?
  3. SRv6 Locator 的前缀需要通过 IGP 或 BGP 通告。如果 Locator 前缀未通告,远端节点是否还能通过 SID 路由到本节点?

下篇预告:第187篇:SRv6 转发流程与 End/End.X SID