第183篇:SR-MPLS 基本概念与 Segment List

关键词:Segment Routing、SR-MPLS、Segment List、Node-SID、Adj-SID、源路由、无状态转发

一、引言

Segment Routing(SR,分段路由)是 IETF 在 2013 年提出的新型源路由架构,旨在解决传统 MPLS 网络中 LDP 和 RSVP-TE 协议并存带来的运维复杂度。SR-MPLS 是 SR 在 MPLS 网络中的具体实现,它沿用 MPLS 标签作为 Segment 的编码方式,但彻底改变了路径控制和标签分配的方式。

SR-MPLS 的核心思想可以概括为:将路径表示为一系列有序的 Segment(分段),每个 Segment 用 MPLS 标签编码,入口路由器在报文首部压入完整的标签栈(即 Segment List),中间节点只需基于最外层标签做转发,无需维护每 LSP 的转发状态。这种"源路由 + 无状态转发"的模型,使 MPLS 网络从"每跳决策"变为"源头决策",大幅简化了控制面。

二、核心概念

2.1 逐跳转发 vs 源路由

对比维度 传统 LDP SR-MPLS
路径决策 每跳 LSR 独立查找 FIB Head-End 计算完整路径
标签栈 单层标签(逐跳替换) 多层标签(Segment List)
控制面协议 LDP 独立信令 IGP 扩展(OSPF/IS-IS TLV)
状态维护 每个 LSP 每 LSR 维护状态 无 LSP 状态,仅全局 SID 表
扩展性 LSP 数量 × LSR 数量 = 状态爆炸 仅 Node-SID 数量 = 线性扩展

逐跳转发 vs 源路由 - 图示

2.2 Segment 类型详解

Segment 类型 编码方式 范围 作用域
Node-SID 全局 MPLS 标签 16~240(默认) 全网唯一,标识特定节点
Adj-SID 本地 MPLS 标签 16000~16999(默认) 本地有效,标识特定出方向链路
PP-Adj-SID 本地 MPLS 标签 16000~16999 带保护属性的 Adj-SID(FRR)
BGP Prefix-SID 全局 MPLS 标签 自定义 BGP 路由携带的 SID

Segment 类型详解 - 图示

2.3 Segment List(分段列表)

Segment List 是 SR-MPLS 路径的核心表示,由有序的 Segment 序列构成。报文从 Head-End 发出时,Segment List 被逆序压入标签栈(第一个 Segment 在最外层标签):

位置 Segment 标签值 说明
第1跳 Node-SID=18(RouterC) 18 最外层标签,沿最短路径到 RouterC
第2跳 Adj-SID=16004(RouterC→D) 16004 强制从 RouterC 走特定链路到 RouterD
第3跳 Node-SID=19(RouterD) 19 到达 RouterD 后终结

Segment List(分段列表) - 图示

2.4 SID 地址空间规划

参数 默认值 说明
Global Block 16~240 Node-SID 全局范围,共 225 个可用
Local Block 16000~16999 Adj-SID 本地范围,每节点独立分配
SID 基值(Base) 16 Node-SID = Base + Index
最大 Node 数 225 默认 Global Block 可容纳的最大节点数

三、技术细节

3.1 IGP 扩展与 SID 通告

SR-MPLS 的 SID 信息通过 IGP TLV(Type-Length-Value)扩展进行分发,无需额外信令协议:

IGP 扩展 说明
OSPF SR-TE TLV Router Address TLV 扩展,携带 Node-SID 和 Adj-SID
IS-IS SR-TE TLV Router ID TLV(228/229)扩展,携带 SID 信息
BGP-LS BGP Link-State,将 IGP 拓扑和 SID 信息分发给控制器

3.2 标签栈操作详解

操作 说明 触发条件
Push 压入新标签 Head-End 封装 Segment List
Swap 替换标签 中间节点 LDP 场景(SR-MPLS 中少见)
Pop 弹出顶层标签 到达 Segment 终点,暴露下一个 Segment
Penultimate Pop 倒数第二跳 Pop 优化:减少最后一跳的标签操作

3.3 SR-MPLS 转发表结构

RouterB SR 转发表:

+-----------+---------+-----------+-----------+
| SID标签   | 类型    | 行为      | 出接口    |
+-----------+---------+-----------+-----------+
| 16        | Node    | 本地终结  | -         |
| 17        | Node    | IP短路径  | GE0/0/0   |
| 18        | Node    | IP短路径  | GE0/0/1   |
| 19        | Node    | IP短路径  | GE0/0/0   |
| 16001     | Adj     | 直接出向  | GE0/0/0   |
| 16002     | Adj     | 直接出向  | GE0/0/1   |
+-----------+---------+-----------+-----------+

四、实战配置/案例分析

4.1 SR-MPLS 基础配置(三节点)

# ========== RouterA (Head-End) ==========
< Huawei > system-view
[ Huawei ] sysname SR-RouterA

# --- 全局SR参数 ---
[ SR-RouterA ] segment-routing
[ SR-RouterA-segment-routing ] global-block 16 240
[ SR-RouterA-segment-routing ] local-block 16000 16999

# --- 分配Node-SID ---
[ SR-RouterA ] segment-routing node-locator
[ SR-RouterA-segment-routing-node-locator ] index 16
  # Node-SID = 基值16 + 偏移0 = 16

# --- 接口配置 ---
[ SR-RouterA ] interface LoopBack 0
[ SR-RouterA-LoopBack0 ] ip address 1.1.1.1 32

[ SR-RouterA ] interface 100ge 1/0/1
[ SR-RouterA-100GE1/0/1 ] ip address 10.0.0.1 30
[ SR-RouterA-100GE1/0/1 ] mpls
[ SR-RouterA-100GE1/0/1 ] segment-routing mpls
[ SR-RouterA-100GE1/0/1 ] segment-routing mpls adj-sid 16001

# --- IS-IS启用SR ---
[ SR-RouterA ] isis 1
[ SR-RouterA-isis1 ] network-entity 49.0001.0000.0000.0001.00
[ SR-RouterA-isis1 ] cost-style wide
[ SR-RouterA-isis1 ] segment-routing traffic-eng
[ SR-RouterA-isis1 ] sr-mpls

4.2 SR-MPLS BGP-LS 发布配置

# ========== 控制器侧: BGP-LS接收 ==========
[ Controller ] bgp 65000
[ Controller-bgp ] group ls-collector type route-reflector
[ Controller-bgp-group-ls-collector ] peer 1.1.1.1 as-number 65001
[ Controller-bgp-group-ls-collector ] peer 2.2.2.2 as-number 65001
[ Controller-bgp-group-ls-collector ] peer 3.3.3.3 as-number 65001

# === SR-TE Policy(控制器下发) ===
[ SR-RouterA ] segment-routing policy color 100
[ SR-RouterA-segment-routing-policy-100 ] color 100
[ SR-RouterA-segment-routing-policy-100 ] endpoint 4.4.4.4
  # 目的地: RouterD的LoopBack
[ SR-RouterA-segment-routing-policy-100 ] candidate-path 10
[ SR-RouterA-segment-routing-policy-100-cpath-10 ] explicit-path
[ SR-RouterA-segment-routing-policy-100-cpath-10-explicit-path ] nexthop 10.0.0.2
  # 经RouterB
[ SR-RouterA-segment-routing-policy-100-cpath-10-explicit-path ] nexthop 17
  # 到RouterC(Node-SID=17)
[ SR-RouterA-segment-routing-policy-100-cpath-10-explicit-path ] nexthop 19
  # 到RouterD(Node-SID=19)

4.3 故障排查:Adj-SID 通告缺失

故障场景:SR-MPLS 策略无法生效,排查发现部分 Adj-SID 未被 IGP 通告。

# Step 1: 检查Node-SID
<SR-RouterA> display segment-routing node-sid
  Node-SID: 16
  State: Active

# Step 2: 检查Adj-SID
<SR-RouterA> display segment-routing adj-sid
  # 显示为空! Adj-SID未被通告

# Step 3: 检查接口SR-MPLS状态
<SR-RouterA> display segment-routing mpls interface 100ge 1/0/1
  Interface: 100GE1/0/1
  SR-MPLS: Disabled
  # 根因: 接口未启用SR-MPLS

# Step 4: 修正
[SR-RouterA] interface 100ge 1/0/1
[SR-RouterA-100GE1/0/1] segment-routing mpls
[SR-RouterA-100GE1/0/1] segment-routing mpls adj-sid 16001

# Step 5: 验证IGP通告
<SR-RouterA> display isis topology
  # 确认SR-TE TLV已包含Adj-SID信息

# Step 6: 验证远端接收
<SR-RouterB> display segment-routing global-block
  SID: 16 → RouterA (1.1.1.1)
  SID: 17 → RouterB (2.2.2.2)
  SID: 18 → RouterC (3.3.3.3)

五、总结

项目 要点
SR 核心思想 源路由:Head-End 计算完整路径并压入 Segment List
Segment 类型 Node-SID(全局)、Adj-SID(本地)、BGP Prefix-SID
SID 编码 Node-SID 用全局标签(16~240),Adj-SID 用本地标签(16000~16999)
标签栈 Segment List 逆序压栈,第一个 Segment 在最外层
控制面 IGP TLV 扩展通告 SID,无需独立信令协议
无状态转发 中间节点无需维护 LSP 状态,仅查 SID 转发表

思考

  1. SR-MPLS 默认 Global Block 为 16~240,最多容纳 225 个 Node-SID。如果一个网络有 500 台路由器,如何扩展 SID 空间?
  2. Segment List 中为什么要把第一个 Segment 放在标签栈的最外层?如果顺序压入会发生什么?
  3. Adj-SID 是本地有效的。Head-End 如何获知远端节点的 Adj-SID 值来构建 Segment List?

下篇预告:第184篇:SR-MPLS 与 LDP 的区别与演进