MPLS 那一篇讲的是「标签怎么走」。这一篇讲标签的下一步——把整条路径直接写进报文里。

先看问题:MPLS TE 哪里不够用

MPLS 本身只解决「怎么转发」,不解决「走哪条路」。要做流量工程(TE),传统做法是 RSVP-TE:沿着路径逐跳发信令、逐跳预留带宽、每台设备都维护一条 LSP 的状态。

问题具体表现
状态爆炸N 台设备的网状组网,要建 N² 量级的 LSP,每台设备都要记一大堆状态
信令开销路径一变就要重新跑一遍 RSVP 信令,收敛慢
只能逐跳算路径是逐跳协商出来的,源节点无法一次性掌握全局
不够灵活想按应用、按时段调路径,配置复杂度很高

核心矛盾是:「让中间设备记住状态」这件事本身不可扩展。Segment Routing 的解法很干脆——状态别放在中间,放在报文头里。

SR 的核心:源路由 + 段列表

Segment Routing 的源路由思想,以及 SR-MPLS 与 SRv6 两种实现
▲ 路径写在报文头,中间节点只负责弹出栈顶的 SID

SR 只引入两个概念,就把 TE 做完了:

概念含义
Segment(段)一条指令的抽象。可以是「走到某台设备」也可以是「走某条链路」「转到某个 VPN」
SID段的标识符。在 SR-MPLS 里是 MPLS 标签,在 SRv6 里是一个 IPv6 地址
Segment List一串有序的 SID,就是一条完整路径
源路由路径由源节点算好压进报文,中间设备不参与决策
一次转发长什么样
源节点 R1 算出路径:R1 → R2 → R3 → R4
把 SID 列表压进报文:  [SID(R4), SID(R3), SID(R2)]
                          ↑ 栈顶在左,先进后出

R1 发出 → 看栈顶 SID(R2) → 转发给 R2
R2 收到 → 弹出栈顶 SID(R2) → 看新的栈顶 SID(R3) → 转发给 R3
R3 收到 → 弹出 SID(R3) → 看栈顶 SID(R4) → 转发给 R4
R4 收到 → 弹出 SID(R4) → 栈空 → 按目的地址正常转发

★ 关键:R2 和 R3 完全不知道「这条路径是谁要的、要去哪」
  它们只做「弹栈 + 按栈顶转发」这一个动作
  状态只存在于 R1 的报文头里 —— 这就是可扩展性的来源

两种 SID:SR-MPLS 与 SRv6

SR-MPLSSRv6
SID 是什么MPLS 标签,20 bitIPv6 地址,128 bit
路径怎么带MPLS 标签栈IPv6 扩展头 SRH 里的段列表
转发面沿用 MPLS(要求设备支持 MPLS)纯 IPv6 转发,不依赖 MPLS
标签空间SRGB(Segment Routing Global Block),全局统一Locator 段,按需分配,空间几乎无限
可编程性受限于标签含义地址里的 Function 段可以自定义行为
演进路径现网改造小,主流过渡方案面向未来,天然支持网络切片、服务链

SR-MPLS 的两个 SID 类型

Prefix-SID 与 Adjacency-SID
Prefix-SID(前缀段)—— 绑定在一个前缀上
  R2 宣告 LoopBack0: 2.2.2.2/32,同时给它分配 SID 16002
  任何设备只要往「16002」压栈转发,就会走到 R2
  ★ 全局唯一,靠 IGP(OSPF/IS-IS)扩展分发

Adjacency-SID(邻接段)—— 绑定在一条具体链路上
  只在本地有效,用来强制走「某条特定链路」
  ★ 构建显式路径时用它,能精确控制走哪根线

典型组合:
  需要「必须经过 R2 且必须走 R2-R3 的 2 号链路」
  → Segment List = [ Prefix-SID(R2), Adjacency-SID(R2→R3 2号链路), Prefix-SID(R4) ]

SRv6 的 SID:Locator + Function

SRv6 的 SID 是一个 128 位的 IPv6 地址,但它的结构是刻意设计的:

SRv6 SID 结构
一个 SRv6 SID = Locator + Function + (Argument)

  2001:db8:1::1  ── 拆开看 ──►  Locator   = 2001:db8:1::/48
                                 Function  = 0x0001

Locator(定位段)
  ★ 就是一条普通 IPv6 路由,靠 IGP 在域内传播
  ★ 保证报文能路由到这台设备 —— 不需要额外的信令协议

Function(功能段)
  ★ 定义了「到达这台设备后做什么」
  ★ 标准行为举例:
      End       —— 简单弹栈,继续转发
      End.X     —— 弹栈并从指定链路发出(对应 Adjacency-SID)
      End.DT4   —— 弹栈并查 IPv4 VPN 表(对应 MPLS VPN 的标签行为)
      End.DX4   —— 弹栈并从指定接口发出 IPv4 报文
  ★ 因为 Function 可自定义,SRv6 才能做网络切片、服务链

Argument(参数段,可选)
  给 Function 传参,比如给某个业务实例指定标识

为什么这个设计重要?因为「寻址」和「行为」被拆开了。Locator 让它能被普通 IPv6 网络路由,Function 让它能做除了转发以外的事——这就是 SRv6 可编程性的根源。

SRH:段列表装在哪

SRv6 报文结构
┌──────────────────────────────────────┐
│  IPv6 头                              │
│    Src = 本机地址                     │
│    Dst = Segment List 里的当前 SID    │  ★ 靠改目的地址实现逐跳
│    Next Header = 43 (Routing Header)  │
├──────────────────────────────────────┤
│  SRH(Segment Routing Header)        │
│    Segments Left = 还剩几个段没走     │  ★ 类似 MPLS 的栈顶指针
│    Segment List[0..n] = 完整路径      │
│    (倒序排列,SL 从后往前移动)      │
├──────────────────────────────────────┤
│  载荷                                 │
└──────────────────────────────────────┘

★ 逐跳过程:
  节点收到包 → 看 Dst 是不是自己 → 是 → 查 SRH
  → Segments Left 减 1 → 把 Dst 改成下一个 SID → 转发
  → Segments Left 归零 → 剥掉 SRH,按内层目的地址转发

SR Policy:怎么用 SR

有了 SR 的转发能力,还需要一个「策略层」来描述「什么样的流量走什么样的路径」。这就是 SR Policy:

要素含义
Headend策略的起点(哪个节点负责压栈)
Color业务意图标签(比如「低时延」「大带宽」),由 BGP 扩展团体携带
Endpoint策略的终点
BSIDBinding SID,策略的对外标识。别的路径想复用它,只要指向 BSID
Candidate Path候选路径,可以配多条、按优先级选,天然支持主备和调优

这个模型的好处是解耦:业务侧只说「我要低时延」,控制器负责算出具体走哪些 SID。路径变了,业务配置不用改。

华为配置片段

huawei · SR-MPLS 基础
# ① 全局开启 SR,指定 SRGB(全局标签块)
segment-routing
 global-block 16000 23999

# ② IS-IS 里携带 SR 扩展,给 LoopBack 分配 Prefix-SID
isis 1
 cost-style wide
 segment-routing mpls
 #
 interface LoopBack0
  isis enable 1
  isis prefix-sid index 2          # SID = 16000 + 2 = 16002

# ③ 查看
display segment-routing prefix-sid-map
display isis segment-routing prefix-sid-map
huawei · SRv6 基础
# ① 配置 Locator(必须先在 IGP 里宣告出去)
segment-routing ipv6
 locator LOC1 ipv6-prefix 2001:db8:1:: 64 static 32
  opcode ::1 end                    # End 行为

# ② IS-IS 携带 SRv6 扩展
isis 1
 ipv6 enable topology standard
 segment-routing ipv6 locator LOC1

# ③ 查看
display segment-routing ipv6 local-sid end forwarding
display segment-routing ipv6 locator

# ★ 排错要点
#   Locator 必须在 IGP 里可达 —— 否则报文根本到不了这台设备
#   opcode 长度 + locator 长度 不能超过 128 位
#   SRv6 要求整条路径的设备都支持,混合组网要做 SRv6 → SR-MPLS 的映射

SR 到底解决了什么

维度RSVP-TESR / SRv6
中间设备状态每条 LSP 都要存零状态(状态在报文头)
路径计算逐跳协商源节点一次算完
需要什么协议IGP + RSVP-TE + LDP只要 IGP(SR-MPLS 也可只跑 SR)
收敛速度慢,要重跑信令快,跟着 IGP 走
扩展性N² 量级状态,大规模吃不消与路径数量无关
业务能力只能做转发Function 可编程,支持切片 / 服务链

一句话总结:MPLS 解决「标签怎么转」,SR 解决「路径谁来定」——答案是让源节点定,把状态写进报文头。SR-MPLS 是当下能落地的过渡方案,SRv6 因为把网络能力编码进了 IPv6 地址,成为长期演进方向。记住那个拆解就够了:Locator 管「能找到我」,Function 管「到了之后做什么」。

📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)

合并了原始笔记中「SRV6 / SR」两页。
原笔记以截图为主,SRv6 SID 的 Locator / Function 划分和 SRH 报文字段是重点但写得很零散,本文按「问题 → 核心思想 → 两种实现 → SID 结构 → 报文字段 → SR Policy → 配置」重新组织。
其中「一次转发长什么样」的逐跳弹栈过程和 SRv6 报文结构图,是按标准行为补画的;配置命令保留华为 VRP 原样。