SRv6
源路由如何把完整转发路径编码进 IPv6 报文头
核心要点:
- 入口节点写完整 SID list 进 IPv6 SRH,中间路由器只查"下一跳指针"
- 决策位置在入口 + 控制面,是 ECMP "每跳分布式哈希" 的相反极端
- SID 不仅编码位置,还可编码动作(VPN、跨连接、解封装)
- Microsoft Fairwater AI 集群用 static SRv6 + Multiplane + MRC 协同
SRv6(Segment Routing over IPv6,RFC 8754)是将"完整路径指令"编码进 IPv6 报文头的源路由方案[1]。入口节点把中间节点和操作打包成 SID(Segment Identifier)list 写入 IPv6 Segment Routing Header(SRH),中间路由器只读"下一跳指针"按 SID 转发。SRv6 是 3.8 KSP 中"源路由模型"的现代标准实现。
SRv6 与其它路由方案的决策位置差在哪?
与 ECMP / AR / DQPLB / PLB 的根本区别
| 路由方案 | 决策位置 | 路径完整性 | 控制粒度 |
|---|---|---|---|
| ECMP | 每跳哈希 | 入口选定,逐跳分布式确认 | 流级别 |
| AR | 每跳本地 | 每跳重选 | 报文 / flowlet |
| DQPLB | host 通信库 | 沿用 ECMP 的多路径 | QP / segment |
| PLB | host transport | 改 flow label 触发 ECMP 重哈希 | 连接 |
| SRv6 | 入口节点 + 控制面 | 完整路径在报文头中编码 | 任意(按 SID list 粒度) |
| TE-CCL | 离线控制面 | 完整路径离线求解 | chunk |
@tbl-route-srv6-decision-position SRv6 在路由方案决策位置中的定位
SRv6 的核心差异:中间路由器不做选路决策——它们只查"SRH 里指针指向哪个 SID",按 SID 转发。这把 ECMP 在每条链路上的"哈希分散"完全替换为入口编程的"显式指定"。
源路由能解决什么、不能解决什么
能解决:
- 明确指定流量走特定路径(绕开热点、走特定 trust domain、走专用低延迟链路)
- 提前编程故障保护备路(不依赖 IGP 收敛)
- 跨域路径拼接(先内部 IGP,再骨干 SR,再目的域 IGP)
- 网络切片 / VPN(每个 SID 编码租户/服务身份)
不能解决:
- 不能替代拥塞控制(SRv6 决定走哪条路,仍需要 BBR/DCQCN/Bolt 决定多快发)
- 不能替代实时拥塞均衡(静态编程的路径不响应运行时拥塞,需要与 PLB 等动态机制配合)
SRv6 数据平面如何编码完整路径?
Segment Routing Header (SRH)
SRH 是一种 IPv6 Routing Extension Header(Routing Type = 4),由入口节点插入 IPv6 报文头之后。其结构(简化):
+-----------------------------------+
| IPv6 Header |
| Destination = Active SID |
+-----------------------------------+
| SRH |
| Next Header / Hdr Ext Len |
| Routing Type = 4 |
| Segments Left | <- 剩余 SID 数(指针)
| Last Entry |
| Flags / Tag |
| Segment List[0] (最末跳) |
| Segment List[1] |
| ... |
| Segment List[N-1] (起点的下一跳) |
| (Optional TLVs) |
+-----------------------------------+
| Payload |
+-----------------------------------+
关键字段:
- IPv6 Destination Address:当前 active segment 的 SID
- Segments Left:指向 Segment List 中的下一个 SID(向 index 0 方向递减)
- Segment List[]:完整 SID list,逆序存储(List[0] 是终点,List[N-1] 是第一个中间跳)
Active Segment 推进机制
每经过一个 SR-aware 路由器,SID 切换流程:
当前节点 = SRH.Segment_List[Segments_Left]
= IPv6.Destination
1. SR-aware 路由器收到报文,识别 Destination 是自己的 SID
2. Segments_Left -= 1
3. 把 Segment_List[Segments_Left] 复制到 IPv6.Destination
4. 按新 Destination 转发(用普通 IPv6 路由表)
中间路由器不需要解析整个 SID list,只需要操作 Segments Left 指针和 Destination 字段——这是 SRv6 在数据平面保持高速的关键。
一个简单示例
假设入口节点 A 想让报文经过 R1 → R2 → R3 → 终点 B,则插入 SRH:
IPv6.Destination = SID(R1)
SRH.Segment_List = [ SID(B), SID(R3), SID(R2), SID(R1) ]
SRH.Segments_Left = 3
- A → R1:Destination=SID(R1),按普通 IPv6 路由送达 R1
- R1 处理:Segments_Left = 2,Destination=SID(R2)
- R1 → R2:按 IPv6 路由送达 R2
- R2 → R3 → B:同理
到达终点时 Segments_Left = 0,最终 Destination 是 SID(B) = B 的某个本地 SID(可能携带额外动作,例如解封装)。
SID 编码开销
每个 SID 是 128 bit IPv6 地址,加上 SRH 固定 8 字节 header,总开销:
$$\begin{equation} \text{SRH 开销} = 8 + 16 N_{\text{SID}} \text{ 字节} \label{eq:route-srv6-srh-overhead} \end{equation}$$例如 4 跳 SID list = 8 + 64 = 72 字节。对小 RDMA 报文(1.5 KB MTU)开销约 5%,对 jumbo frame(9 KB)开销 < 1%。
Compressed SID(C-SID,RFC 9800[2];工业语境中也称 uSID / microSID) 通过将多个 SID 打包进单个 128 bit container 缓解开销。典型 C-SID 长度 16 bit,单个 container 可容纳的 SID 数取决于 Locator-Block (LB) 长度(RFC 9800 §6.1 要求 LB > 0)——RFC 9800 §3 标定示例为 48-bit LB + 16-bit CSID,单 container 可装 5 个 SID;更短 LB 时上限可达 6 个。Microsoft / Cisco / Huawei 等主流厂商已支持。
SID 不只是地址,还能编码什么动作?
SRv6 的 SID 不只是"目的地址",还可以编码"到达此地后做什么"[3]。常见类型:
| SID 类型 | 含义 | 用途 |
|---|---|---|
| End | Endpoint:到达节点继续下一 SID | 基础转发 |
| End.X | Endpoint + L3 Cross-connect:从指定接口转发 | 链路保护、强制走特定链路 |
| End.T | Endpoint + Table lookup:在指定路由表查询 | 多 VRF 场景 |
| End.DT4 / End.DT6 | Decap + Table lookup:解封装后查 VPN 表 | L3 VPN endpoint |
| End.DX4 / End.DX6 | Decap + Cross-connect:解封装后向指定 nexthop | PE-CE 直连 |
| End.B6.Encaps(常简称 End.B6) | Endpoint + Binding SID:跳到另一个 SR policy(带封装),另有 End.B6.Encaps.Red 变体 | SR 策略嵌套 |
| H.Encaps | Headend Encapsulation:入口节点封装 SRv6 | 入口侧 SR policy 应用 |
@tbl-route-srv6-sid-types 常见 SRv6 SID 类型
End 系列是基础转发,DT/DX 系列实现 VPN endpoint,H 系列是入口侧动作。这套 SID functional taxonomy 让 SRv6 不仅是"路径编程",也是"网络功能编程"——一个 SID 可以同时编码身份、位置、动作。
SR-MPLS 与 SRv6 应该怎么选?
Segment Routing 有两种数据平面实现:SR-MPLS 和 SRv6。它们共享同一个控制面(PCEP / BGP-LS / IGP 扩展),但数据平面完全不同:
| 维度 | SR-MPLS | SRv6 |
|---|---|---|
| 数据平面 | MPLS label stack | IPv6 SRH |
| 单 SID 大小 | 20 bit (MPLS label) | 128 bit (IPv6) / 16 bit (C-SID) |
| 头部开销 | 4 bytes per label | 8 bytes SRH + 16 bytes per SID |
| 需要 MPLS data plane | 是 | 否(原生 IPv6) |
| 需要 IPv6 | 否 | 是 |
| SID functional 表达力 | 有限(仅路径) | 强(路径 + 动作) |
| 跨 AS 互通 | 需要 MPLS 互联 | 普通 IPv6 路由可达即可 |
| 部署门槛 | 已有 MPLS 网络平滑过渡 | 需要支持 SRv6 的 ASIC + IPv6 全栈 |
@tbl-route-srv6-vs-mpls SR-MPLS 与 SRv6 数据平面对比
选型逻辑:
- 已有 MPLS 网络(运营商骨干)+ 渐进升级:SR-MPLS
- 新建数据中心 + 全 IPv6:SRv6
- 跨域 / 跨 AS 场景:SRv6(无 MPLS 互联依赖)
- 需要丰富的 SID functional 编码(VPN、网络切片):SRv6
Microsoft Fairwater 如何用 static SRv6 撑起 AI 集群?
Microsoft 2025 年公开宣布 SRv6 作为 Fairwater AI 超级数据中心的网络主干技术[4][5]。Fairwater 是 Microsoft 在 Wisconsin / Atlanta 等地建设的多个相同结构的 AI 数据中心,通过 AI WAN 互联形成"分布式 AI 超级工厂"。
静态 SRv6 部署
Microsoft 采用 static SRv6——SID list 在控制面预先编程到入口节点,不在每条流到达时动态计算。这与传统 SRv6 用法(PCE 动态计算路径)的区别:
| 维度 | Dynamic SRv6 | Static SRv6(Microsoft Fairwater) |
|---|---|---|
| 路径计算时机 | 流建立时 / 拥塞触发 | 部署时 / 拓扑变更时 |
| 控制面负载 | 高(频繁求解) | 低(一次性下发) |
| 适用场景 | 通用 IP 流量 | AI 训练(流量矩阵规律) |
| 故障响应 | 重新计算 | 预编程备路 |
@tbl-route-srv6-static-vs-dynamic 静态 vs 动态 SRv6
静态 SRv6 对 AI 训练特别合适:训练流量矩阵高度规律,最优路径分配可以离线一次性求解——与 TE-CCL 的离线思路一脉相承,但 TE-CCL 是 collective comm chunk 级,静态 SRv6 是 IP 流级别。
MRC + Multiplane + Static SRv6 三层协同
Microsoft 公开的 Fairwater scale-out 网络 resilience strategy 由三层协同组成[6],static SRv6 只是其中一层:
| 层级 | 机制 | 解决问题 |
|---|---|---|
| Transport 层 | MRC(Multipath Reliable Connection) | 在多条并行路径上做可靠传输,单路径故障不中断 |
| 拓扑层 | Multiplane 拓扑 | 提供多条物理独立的并行路径(与 DQPLB §Rail-Optimized plane 类似) |
| Forwarding 层 | Static SRv6 | 为 MRC 提供确定性、预编程的路径基底 |
@tbl-route-srv6-fairwater-stack Fairwater 网络容错的三层协同
SRv6 在这个组合中的角色是为上层 MRC 提供"我可以指定走哪几条物理独立路径"的能力——而不是故障检测和重传本身。三者协同的目标是在网络故障条件下仍维持大规模同步训练的进度。
具体而言,static SRv6 提供的能力包括:
- 在每个 plane 内预编程"主路径 + 备路径"两组 SID list
- 跨 plane 用不同 SID list 实现物理路径分散
- 路径在控制面一次性下发,运行时不重新计算
AI WAN:连接多个 Fairwater
Fairwater 不是单数据中心,而是多个地理分布的相同结构数据中心,通过 AI WAN 互联。AI WAN 的核心特征:
- 跨 facility 的 SRv6 隧道
- 全局流量工程:训练 job 的不同 stage 可以跨 facility 编排
- 路径编程在控制面预先计算(与 TE-CCL 思路类似但作用于 IP 流量层)
SRv6 与其它路由方案如何协同?
| 层级 | 机制 | 角色 |
|---|---|---|
| 入口控制面 | SRv6 SID list 编程 | 决定流量的完整路径 |
| host transport | PLB / PRR | 拥塞 / 故障触发 IPv6 flow label 重哈希(仅在 SRv6 SID list 内的 ECMP 段生效) |
| host transport | Bolt / Swift / DCTCP | 调节发送速率 |
| 交换机 ASIC | ECMP(含 flow label) | 在 SRv6 SID 段间提供等价路径分散 |
@tbl-route-srv6-with-others SRv6 与其它路由方案的协同
关键点:SRv6 不取代 ECMP——SRv6 指定"经过哪些中间节点",但两个相邻 SID 之间仍可能存在多条等价 IP 路径,由 ECMP 哈希散列。这种"显式指定主路径 + 局部 ECMP 散列"是生产部署的常见组合。
SRv6 综合性能特性?
| 指标 | SRv6 | TE-CCL(对照) | DQPLB(对照) |
|---|---|---|---|
| 路径控制粒度 | 任意(SID list 编程) | chunk 级 | QP 级 |
| 拥塞响应 | 单独无(静态部署)或慢(PCE 重算);与 PLB 协同后获得 RTT 级响应 | 无 | 有 |
| 故障响应 | 快(预编程备路) | 无 | 弱 |
| 拓扑泛化 | 极强(任意 IPv6 网络) | 中(MILP 求解器限制) | 中(依赖 Rail-Optimized) |
| 报文开销 | 中(每跳 16 字节 SID) | 0 | 0 |
| 部署门槛 | 中(需 SRv6 ASIC + IPv6) | 高(求解器) | 低(仅通信库) |
@tbl-route-srv6-perf SRv6 性能特性对比
何时该用 SRv6,何时不该?
适用场景:
- 新建数据中心 + 全 IPv6 栈
- 多数据中心 WAN 互联(典型 Microsoft AI WAN)
- 大规模 AI 集群(流量矩阵规律 + 需要故障容量管理)
- 网络切片 / VPN(多租户 + 服务隔离)
- 跨 AS / 跨域路径编程(避免 MPLS 互联复杂度)
局限:
- 依赖 SRv6 数据平面:需要交换机 ASIC 支持 SRv6(现代 Broadcom Tomahawk / Trident / Cisco Silicon One / Nokia FP5 等已支持,但老旧设备无法升级)
- 报文开销显著:4 跳 SID list 增加 ~70 字节,对小报文影响明显(C-SID 缓解但未消除)
- 静态 SRv6 不响应运行时拥塞:需要与 PLB 等动态机制协同
- 控制面复杂度高:大规模生产部署需要 PCE / SDN 控制器 + IGP/BGP-LS 拓扑收集
- 故障切换不是无缝:备路切换仍需 host 检测故障(依赖 PLB/PRR)
选型建议:
- Microsoft / Cisco / Huawei 系生态 + 全 IPv6 + 高路径编程需求:SRv6 是当前最佳选择
- 已有 MPLS 网络且不计划全 IPv6:SR-MPLS 更平滑
- 流量矩阵高度规律的 AI 训练:静态 SRv6(Fairwater 模式)+ TE-CCL 协同
- 单纯解决 collective comm 散列:DQPLB + E-ECMP 已足够,无需 SRv6
- 需要快速故障恢复(不只是拥塞):SRv6 预编程备路 + PRR
Takeaway
| 知识点 | 核心结论 |
|---|---|
| 决策位置 | 入口节点 + 控制面写完整 SID list,中间路由器只查指针 |
| 数据平面 | SRH 携带 SID list(逆序),每跳推 Segments Left 指针 |
| SID 表达力 | End / End.X / End.DT / End.B6 等编码身份、位置、动作 |
| 报文开销 | $8 + 16 N_{\text{SID}}$ 字节;C-SID 把单 SID 压到 16 bit 缓解 |
| SR-MPLS vs SRv6 | MPLS label stack vs IPv6 SRH;前者过渡平滑,后者跨域 / 全 IPv6 强 |
| Microsoft Fairwater | static SRv6(预编程)+ Multiplane + MRC 三层协同支撑 AI 训练 |
| 协同 | 与 PLB/PRR 配合获得 RTT 级动态响应;本身不替代拥塞控制 |
参考资料
- Filsfils et al., IPv6 Segment Routing Header (SRH), RFC 8754, IETF 2020. https://www.rfc-editor.org/rfc/rfc8754
- Cheng et al., Compressed SRv6 Segment List Encoding, RFC 9800, IETF 2024. https://www.rfc-editor.org/rfc/rfc9800
- Filsfils et al., SRv6 Network Programming, RFC 8986, IETF 2021. https://www.rfc-editor.org/rfc/rfc8986
- Microsoft, Inside the world's most powerful AI datacenter, 2025-09. https://blogs.microsoft.com/blog/2025/09/18/inside-the-worlds-most-powerful-ai-datacenter/
- segment-routing.net, Microsoft: SRv6 powers the largest AI DC in the world, 2025-10. https://www.segment-routing.net/news/2025-10-13-Microsoft-SRv6-powers-the-largest-AI-DC-in-the-world/
- Microsoft Tech Community, Building resilient networks for AI supercomputers, 2026. https://techcommunity.microsoft.com/blog/azurehighperformancecomputingblog/building-resilient-networks-for-ai-supercomputers/4516919
延伸阅读
- RFC 9602: SRv6 SID and IPv6 Addressing Architecture, IETF 2024. https://www.ietf.org/rfc/rfc9602