MPLS 那一篇讲的是「标签怎么走」。这一篇讲标签的下一步——把整条路径直接写进报文里。
先看问题:MPLS TE 哪里不够用
MPLS 本身只解决「怎么转发」,不解决「走哪条路」。要做流量工程(TE),传统做法是 RSVP-TE:沿着路径逐跳发信令、逐跳预留带宽、每台设备都维护一条 LSP 的状态。
| 问题 | 具体表现 |
|---|---|
| 状态爆炸 | N 台设备的网状组网,要建 N² 量级的 LSP,每台设备都要记一大堆状态 |
| 信令开销 | 路径一变就要重新跑一遍 RSVP 信令,收敛慢 |
| 只能逐跳算 | 路径是逐跳协商出来的,源节点无法一次性掌握全局 |
| 不够灵活 | 想按应用、按时段调路径,配置复杂度很高 |
核心矛盾是:「让中间设备记住状态」这件事本身不可扩展。Segment Routing 的解法很干脆——状态别放在中间,放在报文头里。
SR 的核心:源路由 + 段列表
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-MPLS | SRv6 | |
|---|---|---|
| SID 是什么 | MPLS 标签,20 bit | IPv6 地址,128 bit |
| 路径怎么带 | MPLS 标签栈 | IPv6 扩展头 SRH 里的段列表 |
| 转发面 | 沿用 MPLS(要求设备支持 MPLS) | 纯 IPv6 转发,不依赖 MPLS |
| 标签空间 | SRGB(Segment Routing Global Block),全局统一 | Locator 段,按需分配,空间几乎无限 |
| 可编程性 | 受限于标签含义 | 地址里的 Function 段可以自定义行为 |
| 演进路径 | 现网改造小,主流过渡方案 | 面向未来,天然支持网络切片、服务链 |
SR-MPLS 的两个 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 = 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:段列表装在哪
┌──────────────────────────────────────┐
│ 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 | 策略的终点 |
| BSID | Binding SID,策略的对外标识。别的路径想复用它,只要指向 BSID |
| Candidate Path | 候选路径,可以配多条、按优先级选,天然支持主备和调优 |
这个模型的好处是解耦:业务侧只说「我要低时延」,控制器负责算出具体走哪些 SID。路径变了,业务配置不用改。
华为配置片段
# ① 全局开启 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
# ① 配置 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-TE | SR / 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 原样。