一份用苏格拉底提问法+ 第一性原理解剖 SRv6 的硬核手册。 从状态机灾难、ASIC 微架构到 uSID 压缩魔术,我们拒绝浅尝辄止——直达底层。
在你了解 SRv6 的任何细节之前,我们必须先回答一个最根本的问题: 为什么人类需要在 IPv6 已经"够用"的情况下,再造一个 SRv6? 这不是一次平庸的协议升级,而是一次对网络架构哲学的彻底反叛。
请暂停 30 秒,认真思考这个问题。如果你的答案是"是"——那是因为你被 30 年的 Internet 训练出了一种思维定势。 如果你的答案是"不一定"——那么恭喜,你已经站在了源路由(Source Routing)哲学的门槛上。
让我们抛开一切既有协议,回到最朴素的问题:"把数据从 A 送到 Z,本质上需要什么?"
答案只有一个——路径决策(Path Decision)。 决策可以发生在两个地方:
这两种范式没有谁绝对优劣——但在不同的时代、面对不同的需求,最优解是不同的。 SRv6 的诞生,正是因为时代变了。
逐跳路由,就像你在 1990 年代打出租车——你只告诉司机"我要去机场",至于走哪条路,每个路口该左转还是右转,全凭司机的经验和当时的路况判断。每个司机的决策都是局部最优,但你没法保证全局是最快的。
源路由,则像今天你打开 Google Maps:导航 APP 在出发前就为你算好了最佳路径,"前 200 米左转,第二个路口右转,再走 1 公里上高架……",司机(以及所有路过的红绿灯)只需要按部就班执行。决策者只有一个,路径是全局最优。
提示:去翻一下 RFC 791(1981 年的 IPv4 标准),它本来就支持 Loose Source Route 和 Strict Source Route 选项。 那为什么今天没人用?这背后藏着一个深刻的工程教训。
IPv4 的源路由失败有三个致命原因,每一个都是用第一性原理就能推出来的:
drop ip option source-route。一项被全网封禁的功能,等于死亡。
所以——IPv4 源路由不是输在哲学,是输在工程实现。这个教训直接塑造了 SRv6 的所有设计决策。
这是反对者最常用的论据。要回答这个问题,你必须先回答另一个更深刻的问题: "MPLS 流量工程的痛苦根源,到底是什么?"
让我用一个词概括 MPLS TE 的原罪:状态机灾难(State Machine Hell)。 我们逐层拆解这个灾难是怎么发生的。
想象你是一个运营商网络架构师,你想从 PE1 到 PE2 建一条低时延 + 绕开核心节点 P3的隧道。MPLS RSVP-TE 是怎么实现的?
问题来了:假设你有 1000 个 PE 节点,做 PE-to-PE 全互联(典型 L3VPN 场景):
这就是网络工程师的"RSVP 之夜"——一次小小的链路 Flap,整个网络的控制面 CPU 飙到 100%,运维彻夜不眠。
网络工程有一条铁律:"状态是有成本的"。状态越多,控制面越脆弱、扩展性越差、收敛越慢。
那么,对于"用户想走特定路径"这件事,状态最少应该放在哪里?有三个选项:
第三个选项就是 Segment Routing(SR)的核心哲学: "把状态从网络中赶出去,塞进数据包的头里。"
MPLS RSVP-TE 像是跟团旅游——旅行社在每个景点都要预订位置、维护订单、保留状态,任何一个环节出问题整团都得改行程。
Segment Routing 像是自由行——你手里拿着一份自己写好的"路线攻略"(SID List),到每个景点(节点)只需要按攻略上的下一项执行就行。景点不需要记住"你来过",路线全部状态都在你的攻略本里。
这是 SRv6 故事中最关键、也最容易被误解的一步。许多工程师会说:"SRv6 就是把标签换成了 IPv6 地址而已嘛,何必多此一举?" 但如果你这么想,你就完全错过了 SRv6 的革命性所在。
要理解 SRv6 为什么必须存在,我们要看一眼一个典型 SR-MPLS 网络的真实协议栈:
"如无必要,勿增实体"——奥卡姆剃刀原理。 如果 IPv6 地址(128 比特)本身就足以编码一个"指令"(Locator + Function + Args), 那么 MPLS 标签层就是历史负担,应该被剃掉。 SRv6 的本质,是把 IPv6 地址重新定义为"指令操作码"——这就是它被称为"网络编程(Network Programming)"的原因。
SR-MPLS 在同一个 MPLS 域内表现优秀,但一旦跨越多个域(运营商边界、数据中心 underlay 与 fabric 边界、5G 移动网与传输网),就会暴露三大软肋:
| 维度 | SR-MPLS(标签数据面) | SRv6(IPv6 数据面) |
|---|---|---|
| 跨域能力 | MPLS 标签是本地有效,跨域需要 BGP-LU、Inter-AS Option B/C 等"胶水"协议。复杂、易错。 | IPv6 地址全球可路由,跨域天然可达。一个 SID 就是一个 IPv6 地址,不需要任何"翻译"。 |
| 主机参与 | 主机不懂 MPLS,无法直接生成或处理 SID。隧道只能在 PE 上终结。 | 主机原生支持 IPv6,可以直接生成 SRH。Linux Kernel 4.10+ 已原生支持。 |
| 云原生融合 | 公有云不跑 MPLS。SR-MPLS 永远走不出运营商核心网。 | AWS、Azure 都基于 IPv6。SRv6 可以从主机一直贯穿到云,实现 End-to-End 网络编程。 |
| 安全模型 | MPLS 没有 IP 层的安全机制(IPsec、ACL 等)。 | IPv6 自带 IPsec、ACL、uRPF——SRv6 直接继承全部安全工具链。 |
| 运维工具 | 需要专用 MPLS OAM(LSP Ping/Traceroute)。 | Ping、Traceroute、tcpdump 全部原生可用。运维心智负担降到最低。 |
想清楚这一点,你就抓住了 SRv6 的"道"。其余所有的细节——SRH 头、End/End.X 指令、uSID 压缩——都只是"术"。
SRv6 = 把网络变成一台"分布式可编程计算机",IPv6 地址是它的"指令操作码",源节点是它的"程序员",沿途路由器是它的"CPU"。
传统网络像是一群独立思考的快递员——你交给他们一个包裹,他们各自决定怎么送。 你能干预的,最多就是说"请走 EMS"或"请走顺丰"。
SRv6 像是给网络写一段汇编代码——你(源节点)在数据包里写下:
"到东京(End)→ 走第三条线缆(End.X)→ 进入 VPN-A(End.DT4)→ 出到客户网"。
整个网络变成了你的"可编程 CPU",每个 IPv6 地址都是一条机器指令。这种范式转换,不是协议升级,是架构革命。
由思科 Clarence Filsfils 主导提出 Segment Routing 概念,目标:消除 MPLS RSVP-TE 的状态地狱。最初基于 MPLS 数据面(SR-MPLS)。
Routing Header Type 4(SRH)被正式定义,IPv6 路由扩展头获得 SRv6 专属类型。从此,IPv6 地址不再只是"标识",而成为"指令"。
SRH(RFC 8754)与网络编程(RFC 8986)正式成为 IETF 标准。End、End.X、End.DT4/6、End.DX2 等全套指令集尘埃落定。
SRH 头过长导致芯片处理瓶颈和 MTU 问题。Cisco 提出 uSID(128bit 容器中嵌入 8 个 16bit 微指令),单个 IPv6 地址可承载完整 SID 列表,彻底解决 SRH 膨胀。
中国移动、Softbank、Telefonica 等头部运营商规模商用。AWS、Azure 在 backbone 试水 SRv6。AI 数据中心使用 SRv6 实现 GPU-to-GPU 流量工程。SRv6 从"未来"成为"现在"。
状态是有成本的。SRv6 的伟大,不在于它发明了什么新东西,
而在于它把状态从网络中赶出去,塞进了数据包的 IP 头里。
从此,IP 地址不再只是"标识",而成为可编程的"指令"。
我们会带你深入 SRH(Segment Routing Header)的每一个比特位:
上一模块我们建立了"为什么"的认知——网络编程范式。本模块我们要回答"怎么实现"—— 当一个 SRv6 报文出现在网线上时,它到底是什么样子?路由器/ASIC 又是如何精确处理它的每一个比特的? 这一章是后续所有内容的"物理基础",请不要跳过任何一个字段。
如果你的回答是"因为 IPv6 地址够多,能编码 SID"——那只是表面原因。 真正的根本,藏在 IPv6 头部一个被大多数人忽略的设计里:扩展头机制(Extension Headers)。
让我们对比一下 IPv4 和 IPv6 的头部哲学。这个对比不只是历史考古,它直接决定了 SRv6 为什么必须诞生在 IPv6 上:
IPv4 的 Options 是"内嵌的负担"——它强制每一台路由器在转发任何 IPv4 包时都要检查"我是不是有 Options"。 即使 99.99% 的包没有 Options,硬件的 IHL(IP Header Length)字段也必须被解析。这种"悲观假设"的代价是巨大的。
IPv6 的扩展头是"乐观分离"——主头永远 40 字节,硬件按固定偏移取字段;只有当 Next Header 字段指向扩展头时,
硬件才进入"深度处理"模式。这种设计让"绝大多数普通包跑得飞快,少数特殊包享受丰富功能"成为可能。
SRv6 正是优雅地利用了这一机制,把整条路径指令封装进 Routing Header Type 4。
IPv4 像是"散装货船"——每件货物形状各异,装卸时必须逐一称量。
IPv6 像是"标准集装箱"——主体永远是 40 英尺标准箱(固定头),如果你需要冷藏、危险品、超长货等特殊需求,
就外挂一个"特种附加箱"(扩展头)。普通船只看主箱即可装卸(硬件快路径),特种箱由专门设备处理(SRv6 引擎),效率最大化。
这是一个绝佳的问题,能区分"读过文档"和"理解设计"的工程师。我们一起解剖。
这两个字段的设计,是 SRv6 数据面最精妙的细节,也是最容易被误读的地方。它们的关系如下:
Segment List[SL],并且这个值同时被复制到 IPv6 主头的 Destination Address 字段。为什么要这样设计? 因为 IPv6 的全局路由查找永远是基于 Destination Address。SRv6 巧妙地把"当前应该去的下一个段端点"放到 DA 字段, 这样整个 IPv6 网络都不需要修改——普通路由器只看 DA 转发,根本不需要知道 SRH 的存在。 只有 DA 命中本地 SID 的"段端点路由器",才会去解析 SRH,做 SL 减 1、更新 DA、然后继续转发。
想象一场接力赛:教练(源节点)在出发前给运动员(数据包)一份完整的"交接棒名单"(Segment List),名单从最后一棒往前写。
Last Entry = 名单总人数 - 1 = "这场比赛总共要交几次棒",是固定的;
Segments Left = "还剩几次棒没交",每完成一次交接就减 1;
运动员手里的"下一棒选手胸牌"(IPv6 DA)= 名单中第 SL 项,每次交棒后更新。
沿途的观众(普通路由器)只需要看胸牌指向哪——不需要懂整个名单。这就是 SRv6 优雅之处。
这是 SRv6 哲学层最关键的一跃——SID 不是地址,而是一条"机器指令"。 我们来看看一个 128 比特如何被切分成"指令操作码 + 操作数"。
如果你写过汇编,一定见过这样的指令:MOV [0x1000], EAX。
— 0x1000(操作地址) = 类似 Locator——"对哪个内存位置操作"
— MOV(操作码) = 类似 Function——"做什么操作"
— EAX(操作数) = 类似 Arguments——"用什么数据"
所以 SRv6 的 128 bit SID,本质是一条"分布式机器指令"。整个网络是 CPU,IPv6 地址就是机器码。
如果你能把这个过程逐字段地讲清楚,你就真正"看见"了 SRv6 数据面。
假设拓扑:R1 (源) → R2 → R3 → R4 → R5 (目的),源节点 R1 想强制路径走 R2、R3、R4 终结于 R5。 源节点构造的 SRH 路径列表(注意栈底→栈顶):
Segment List[0] = R5::SID ← 终点(栈底)
Segment List[1] = R4::SID
Segment List[2] = R3::SID
Segment List[3] = R2::SID ← 第一站(栈顶)
Last Entry = 3
Segments Left = 3 (初始)
这是大多数工程师从未深入的领域,但对于真正掌握 SRv6 至关重要—— 因为 SRH 的处理深度直接决定了 SRv6 的工程可行性。
现代高性能路由器(如 Cisco Silicon One、ASR 9000 系列的 NPU)使用流水线式包处理。 一个 SRv6 报文进入芯片后,会经历以下精密阶段:
这就是为什么 SRv6 早期被很多人质疑"性能不行"——他们用的是不带专用 SRv6 引擎的老芯片。
现代 NPU(如 Cisco Silicon One、Broadcom Jericho 2C+、Marvell Teralynx 等)已经在硬件层专门设计了 SRv6 加速单元——SRH 解析、SL 减一、DA 替换全部在单 cycle 完成,性能与原生 IPv6 几乎无差异。但对于运营商存量设备而言,SRH 长度仍然是落地的核心约束,这直接催生了 uSID 微指令架构。
理论说了再多,不如看一眼真实抓包。下面是一段在 Cisco IOS-XR 设备上抓到的 SRv6 报文 hex dump,逐字段拆解:
0000 60 00 00 00 00 5c 2b 40 fc bb bb 00 00 01 00 00 ← IPv6 主头:NextHdr = 0x2b (43 = Routing)
0010 00 00 00 00 00 00 00 01 fc bb bb 00 00 02 e0 00 ← Source / Destination = R2 的 SID
0020 00 00 00 00 00 00 00 00 2b 06 04 02 00 00 00 00 ← SRH 起点:NH=43, HdrExtLen=6, RT=4, SL=2
← (Last Entry 隐含在 HdrExtLen 中)
0030 fc bb bb 00 00 04 e0 00 00 00 00 00 00 00 00 00 ← SegList[0] = R4::SID (终点)
0040 fc bb bb 00 00 03 e0 00 00 00 00 00 00 00 00 00 ← SegList[1] = R3::SID
0050 fc bb bb 00 00 02 e0 00 00 00 00 00 00 00 00 00 ← SegList[2] = R2::SID (当前活跃)
0060 04 00 00 00 ... ← 内层 IPv4 payload
SRH 末尾的 Optional TLV(Type-Length-Value)字段为 SRv6 提供了极强的可扩展性。当前 RFC 8754 定义了三类常见 TLV:
| TLV 类型 | Type 值 | 用途与本质 |
|---|---|---|
| Padding TLV | 0x04 |
对齐到 8 字节边界,硬件解析效率优化。无功能含义。 |
| HMAC TLV | 0x05 |
基于密钥的消息认证码,防止 SRH 被中间节点伪造或篡改。这是 SRv6 安全模型的基石。 |
| NSH TLV | Draft | 承载 SFC(Service Function Chain)元数据,用于服务链编排。 |
SRv6 的优雅,在于它从不强迫世界改变——
它让普通 IPv6 路由器只需要看 DA 转发,让段端点路由器才执行指令。
这就是分层抽象的极致艺术:每一层只看自己该看的事。
数据面再优雅,也需要控制面的"大脑"。模块 3 我们将深入:
数据平面是"被动的执行单元",控制平面是"主动的决策大脑"。 如果说 SRH 是机器码,那么控制面就是编译器 + 链接器 + 操作系统。 一个 SRv6 网络的真正威力,不在于一个孤立的 SRH 包能跑多快, 而在于整个网络的拓扑、SID、策略、约束能否被快速、准确、自动地分发到每一个角落。
这个问题看起来简单,但答案揭示了 IGP 与 EGP 在设计哲学层面的根本差异—— 它直接决定了 SRv6 控制面为什么必须是"IGP 主导 + BGP 辅助"的双层架构。
让我们抛开协议细节,回到最朴素的问题:"什么场景适合什么协议?"
| 维度 | IGP(IS-IS / OSPFv3) | BGP(边界网关协议) |
|---|---|---|
| 设计初衷 | 同一管理域内的拓扑同步。所有节点必须看到一致的网络全貌。 | 不同管理域之间的策略交换。每个 AS 只暴露自己愿意暴露的部分。 |
| 收敛速度 | 毫秒级(基于 LSP/LSA 洪泛 + Dijkstra) | 秒级(基于 Best Path 选举 + 增量更新) |
| 状态模型 | Link-State:每个节点知道全网的链路图(LSDB) | Path-Vector:节点只知道"经过哪些 AS 可达某前缀" |
| 适合分发什么 | 拓扑、链路属性、Locator 前缀、SR 算法、邻接 SID | 服务前缀(VPN 路由)、跨域可达性、策略 |
所以 SRv6 的设计选择是必然的: 底层 Locator/拓扑由 IGP 分发(域内同步), 顶层 Service SID 由 BGP 分发(跨域可达)。 这是"用对工具做对的事"的典范。
IGP 像是公司内部的钉钉/企微——所有员工都要看到完整的部门架构、座位地图、办公电话。信息必须同步、必须一致。
BGP 像是公司之间的商务对接邮件——你只把"对方需要知道的"信息发出去,绝不暴露内部细节。
两者绝不能混用——你不会把公司架构图群发给所有合作伙伴,也不会让员工通过"商务邮件"才能看到自己的座位号。
这是个有意思的"历史选择题"。如果你只看协议规范,OSPFv3 完全可以承载 SRv6。但实际世界中——尤其是 Tier-1 运营商和超大规模数据中心——几乎全部押注 IS-IS。为什么?
IS-IS 在三个维度上"天生"就比 OSPF 更适合 SRv6:
简而言之:IS-IS 是"可扩展协议工程"的胜利。它不是因为"先到",而是因为"基因更好"。
当一台路由器配置了 SRv6 Locator 后,IS-IS 会通过以下 TLV 把"我有哪些 SID、能力如何"通告给全网:
| TLV 名称 | Type | 含义与作用 |
|---|---|---|
| Router Capability TLV | 242 |
通告本节点的SRv6 能力:是否支持 SRv6、最大 SRH 长度(MSD)、支持的 Function 类型。下游节点据此判断"能不能给它推 SID 列表"。 |
| SRv6 Locator TLV | 27 |
通告本节点的 Locator 前缀(如 fcbb:bb00:0001::/48)。其他节点据此可以"路由到这个 Locator"——这是 SRv6 数据面的根基。 |
| SRv6 End SID Sub-TLV | Sub-TLV | 挂在 Locator TLV 下,通告具体的 End SID(即 Function 段),包括 PSP/USP/USD Flavor。 |
| SRv6 End.X SID Sub-TLV | Sub-TLV | 挂在 Extended IS Reachability TLV (#22) 下,通告邻接 SID。这是 TE 的关键——可以指定"必须走某条具体的物理链路"。 |
| SR Algorithm TLV | Sub-TLV | 通告本节点支持的路径计算算法。0 = 默认 SPF;128~255 = Flex-Algo(用户自定义算法,如低时延 SPF、避开特定区域等)。 |
segment-routing srv6
locators
locator MAIN
prefix fcbb:bb00:0001::/48
!
!
!
router isis CORE
address-family ipv6 unicast
segment-routing srv6
locator MAIN
收敛后,R1 的 LSDB 中 会同时拥有: ① 全网拓扑图(Dijkstra 算最短路); ② 全网每台路由器的 Locator 前缀; ③ 每条链路的 End.X SID。 这就是为什么 R1 可以"独立、本地、无须询问任何人"地构造出一条 SRH——所有的"原料"都已经通过 IGP 同步到了它的本地数据库。 这也是为什么 SR-MPLS 能淘汰 LDP——IGP 已经做了 LDP 的活。
这是底层"地图"和上层"服务"之间的关键桥梁。答案是:BGP SRv6 Service SID。
BGP 在 SRv6 网络中扮演两个完全不同的角色,理解这一点至关重要:
本质:传统 BGP 的 EVPN/VPNv4/VPNv6/L3VPN 等 Address-Family, 现在在 NLRI 或 Attribute 中携带SRv6 Service SID。
典型用法:PE2 通告"VPN-A 的 192.168.1.0/24"路由时,附带"用我的 End.DT4 SID = fcbb:bb00:0002:e002::"。 PE1 收到后,就知道"给 192.168.1.0/24 的包要封装 SRH,外层 DA = 这个 SID"。
RFC 9252:BGP Services over SRv6 Core,定义了 Service SID 的 BGP 传输机制。
本质:BGP-LS 是"反向"用法——把 IGP 的 Link State Database 导出到外部控制器(如 SDN PCE)。
典型用法:每台 ABR 路由器把本域的 IGP 拓扑(节点、链路、Locator、SID、TE 属性)通过 BGP-LS 推送给 Cisco Crosswork / SR-PCE。 控制器据此构建跨域全网拓扑数据库,进行算路。
RFC 7752 + 9552:BGP-LS 与 SRv6 扩展。
想象一个城市的房产生态:
— IGP = 城市政府的"街道地图与门牌号系统",所有人都看得到(每条街、每栋楼)。
— BGP(服务路由) = "房屋买卖与租赁广告"——"我家在 XX 路 88 号,卖房,联系门牌 XX"。
— BGP-LS = "城市规划局的统计上报"——把城市完整地图导出给国务院做宏观决策。
三者协同:地图(IGP)告诉你"路怎么走",广告(BGP 服务)告诉你"哪有房",规划上报(BGP-LS)让上层做"全城统筹"。
让我们用最经典的 L3VPN 场景,展示 IGP 与 BGP 如何协同:
容易混淆的细节:
IGP 的"同一管理域内"特性此时反而成了限制——它看不到其他域的拓扑。这正是集中式控制器(PCE)+ BGP-LS 登场的舞台。
分布式 IGP 在三个场景下力不从心,必须靠集中式控制器解决:
Cisco SR-PCE(基于 IOS-XR 软件实例)就是为解决这三个问题而生。
集中式算路不是简单的 Dijkstra。SR-PCE 内部维护着一个约束最短路径优先(CSPF, Constrained SPF)引擎,能处理:
基于 IS-IS 通告的链路时延(RFC 8570),找出"端到端时延 ≤ 5ms"的路径。
结合 SNMP/Telemetry 实时利用率,避开"已被使用 ≥ 80%"的链路。
"必须经过"或"必须避开"特定 Color 的链路(如绕开海底光缆)。
为主备双隧道找出节点/链路/SRLG 完全不相交的两条路径。
用户自定义算法(如"最低成本 + 避开 AS65001"),SID 列表自动嵌入算法编号。
SR-PCE 监控路径状态,故障时毫秒级下发新 SID 列表。
这是一个非常容易陷入"非此即彼"思维的问题。真正的工程智慧,是知道在什么时候用什么。
SRv6 的控制面是"分层职责模型",每一层解决一类问题:
| 层级 | 协议 | 解决什么问题 | 响应速度 |
|---|---|---|---|
| L0 · 拓扑层 | IS-IS / OSPFv3 | 域内拓扑同步、Locator 扩散、最短路径计算 | 毫秒级(故障切换 50ms) |
| L1 · 服务层 | BGP(VPNv4/v6, EVPN, …) | VPN 服务前缀分发、Service SID 携带 | 秒级 |
| L2 · TE 算路层 | SR-PCE / PCEP | 跨域算路、多约束优化、集中式策略 | 秒级 ~ 分钟级 |
| L3 · 编排层 | NETCONF / gRPC / Crosswork | 意图驱动配置、自动化部署、闭环验证 | 分钟级 |
这是一个"金字塔"——底层快、上层慢;底层确定性、上层灵活性。 分布式 IGP 永远不会被淘汰——它是 SRv6 的"反射神经",故障毫秒切换靠它,永远不能依赖远程控制器。 SR-PCE 是"大脑"——做需要全局视野的决策。两者协同才完美。
IGP 像是脊髓反射——你被针扎到,反射弧在脊髓就完成了缩手动作,不需要等大脑决策(毫秒级)。
SR-PCE 像是大脑皮层——决定"今天要不要出门、走哪条路"等需要全局信息和复杂判断的决策(秒级)。
如果你的所有决策都靠大脑,被针扎到的瞬间你已经被烫伤了。但如果只靠脊髓反射,你永远不会进步、不会规划。
SRv6 的控制面正是这种"反射 + 大脑"的双层架构智慧。
控制面的伟大,不在于谁更聪明,而在于分层职责的智慧——
让 IGP 做反射神经,让 BGP 做服务广告,让 PCE 做大脑皮层。
每一层只解决自己擅长的事,整个系统才能既稳如磐石,又灵活如水。
模块 4 我们将进入 SRv6 的"汇编语言手册"——RFC 8986 网络编程指令集:
前四章描绘的 SRv6 是一个近乎完美的理论模型——但任何工程系统,理论的优雅都要在物理世界里"交税"。 这一章我们直面 SRv6 最痛的两道伤疤:SRH 头膨胀与ASIC 解析深度墙。 然后我们将看到 Cisco 是如何用一段精妙的位操作魔术——uSID(Micro-SID)——把这两个看似无解的问题彻底化解的。
数学不会骗人。让我们用一个典型 5G 跨域承载的实际场景,算清楚 SRH 到底有多"胖"。
考虑一个 5G 跨域 SR-TE 路径,需要经过 6 个段端点: RAN-PE → Aggregation-1 → ABR-1 → P-Core → ABR-2 → Aggregation-2 → DC-PE。 源节点需要在 SRH 里塞下 7 个 SID。让我们逐字节计算:
这还不是最糟的。让我们考虑更极端的场景:
这是个看似合理但致命错误的提议。理解为什么"分片不是解药",能让你看清 IPv6 设计哲学的另一面。
IPv6 与 IPv4 在分片处理上有一个巨大差异:
为什么 IPv6 这样设计?因为分片在路由器上是性能噩梦——需要做 IP 重组、维护状态、处理乱序。 IPv6 把"路径 MTU 发现(PMTUD)"作为强制机制,让源节点动态学习最小 MTU 并主动适配。
但这套机制在 SRv6 场景下成了大坑:
IPv4 像是有人工分拣员的机场——你的行李超重了,机场会帮你分成两个包托运。
IPv6 像是全自动 RFID 通道——超重了直接扔回来,让你自己重新打包。
SRv6 在 IPv6 之上又加了 160 byte 行李——如果用户不知道这个事实,就会被"扔回来"。
所以分片不是解药,"让 SID 列表本身变短"才是唯一出路——这就是 uSID 诞生的根本动机。
答案:是物理限制,是芯片设计的根本约束。理解这一点,需要我们短暂深入芯片微架构。
现代网络芯片(NPU/ASIC)使用流水线(Pipeline)处理报文,每个 cycle 推进一步。 Parser 单元的设计核心是"在固定时间内取多少 byte"。
超过这个深度怎么办?芯片就必须做 Recirculation——把包重新回送到 Parser 入口,再来一次。 这就是 SRv6 早期最痛的"暗坑"——每多一次 Recirculation,转发性能腰斩 50%。
这就是为什么 SRv6 早期落地遭遇"性能不行"的污名—— 不是协议本身有问题,而是SID 列表太长,触发了硬件 Recirculation。 业界共识是:SRH 中 SID 数量 ≤ 6 才能保证线速转发。 但跨域 TE 经常需要 8~10 SID——这就是矛盾的根源。
这正是 Cisco 工程师在 2020 年灵光一闪的问题。答案就是改变 SRv6 战局的——uSID(Micro-SID)架构。
Clarence Filsfils 的关键洞察——"我们其实不需要每个段都用整个 128 bit":
fcbb:bb00::/32),那么这部分前缀只需要写一次!于是诞生了 uSID 的核心思想: "把多个 16-bit 微指令打包进一个 IPv6 地址容器,让一个 IPv6 地址承载一段路径"。 这是信息论意义上的完美压缩——剔除冗余、保留语义。
想象你要把一个包裹送到"北京 → 上海 → 杭州 → 萧山区"4 个站点。
— 传统 SRv6:每个站点写一张完整地址("中国北京"、"中国上海"...),4 张完整地址
— uSID:因为都在中国,把"中国"前缀只写一次,然后是简短的城市代码序列:CN-BJ-SH-HZ-XS——一行表达整条路径
这就是信息论中的"共同前缀压缩"——uSID 把网络的 Locator Block 当成"国家代码",把节点 ID 当成"城市代码",自然地实现了极致压缩。
答案是 uSID 设计中最精妙的——位移操作(Bit Shift)。这是一段优雅的位运算魔术。
传统 SRv6:用 Segments Left(指针)来定位"当前活跃 SID",每跳 SL 减 1。
uSID:用左移操作把消费完的 uSID 直接"挤出去"。
具体步骤(以 4 个 uSID 为例):
0x0000 End-of-Container 标记
uSID 的 Shift 操作,就像编程里的字符串左移:
"BJ-SH-HZ-XS" → 处理完 BJ → "SH-HZ-XS-" → 处理完 SH → "HZ-XS--"
每一步都是简单的内存左移操作,不需要维护任何"指针变量"。
这就是为什么 uSID 在硬件上如此高效——它把"状态变量"(SL 指针)融化进了数据本身的位置。
这是 uSID 设计中真正的"工程艺术"——它不是替代 RFC 8986,而是优雅地兼容。
Cisco 在 SRv6 SID 空间里巧妙划分了两类区域:
关键设计:路由器查 SID 表时,根据 IPv6 DA 自动判断"这是 GIB SID 还是 uSID Container",分别走不同处理路径。 两套机制在同一台路由器上无缝共存——运营商可以"新业务用 uSID,旧业务保留传统 SID",逐步迁移。
| 字段 | 长度 | 取值 | 含义 |
|---|---|---|---|
| uSID Block | 32 bit | fcbb:bb00::/32 |
全网共享前缀(运营商 ULA 或 GUA 段) |
| uSID #1~5 | 每段 16 bit | 0x0001~0xDFFF |
节点 uSID:标识网络中具体节点(最多 65535 个,远超大多数运营商规模) |
| Behavior uSID | 16 bit | 0xE001~0xEFFF |
功能 uSID:如 0xE001=End.X-Link1, 0xE002=End.DT4-VRF-A |
| End-of-Container | 16 bit | 0x0000 |
终结标记,路由器看到 0x0000 知道容器消费完毕 |
uSID 不是完全消灭 SRH——而是把"信息密度"提升数倍。当路径超过 5~6 跳时,依然可以用多个 uSID Container 串联组成 SID List:
理论再美也要有数据支撑。以下是 Cisco 在 Silicon One Q200 NPU 上的实测对比:
| 维度 | 传统 SRv6(RFC 8986) | uSID(Cisco Micro-SID) |
|---|---|---|
| SID 编码长度 | 每个 SID 128 bit | 每个 uSID 仅 16 bit |
| 5 跳路径开销 | SRH + 5×16 = 88 byte | 仅 IPv6 DA = 0 byte 额外 |
| 12 跳路径开销 | SRH + 12×16 = 200 byte | SRH + 2×16 = 40 byte |
| 硬件操作 | SL-1 + DA 替换(多 cycle) | 单 cycle 左移 |
| Recirculation 风险 | SID > 6 时高频触发 | 几乎不触发(容器内 6 跳 = 1 个 IPv6 地址) |
| MTU 友好度 | 长路径吃掉 10%+ 净荷 | 几乎零开销 |
| 与传统 IPv6 兼容 | 需要 SRH 解析支持 | 完全 IPv6 LPM 路由兼容 |
这是工程师必须有的批判性思维——任何"过于完美"的方案都隐藏代价。
uSID 的工程代价:
uSID 的故事完美诠释了工程的本质——在多个约束之间找到帕累托最优: 用"标准化复杂度"换"硬件性能与 MTU 友好"。 对于 5G/云/AI 这种"性能压倒一切"的场景,这是绝对划算的交易。 这也告诉我们一个真理——没有银弹,只有权衡。优秀工程师的能力,是知道在什么场景下做什么权衡。
理论上,理论与实践没有差别;
实践上,它们的差别巨大。
uSID 的伟大,在于它不是推翻 SRv6,而是用一段位运算魔术让 SRv6 真正落地。
最终一章,我们要看 SRv6 在三个最具代表性的场景中的杀手级应用:
请回复"继续",我会先用苏格拉底问题检验你对模块 5 的理解,然后进入终章模块 6。
协议的优雅是写给程序员看的;业务的革命才是写给世界看的。 前五章我们解构了 SRv6 的"骨骼与神经",本章我们看它如何"改变行业"—— 5G 切片、跨域 TE、服务链、AI 数据中心、SD-WAN。每一个场景都是 SRv6 真正发挥威力的舞台。
这个问题揭示了 5G 的本质需求——不只是"区分对待",而是"硬隔离"。
| 业务类型 | 典型应用 | 时延要求 | 带宽要求 | 可靠性 |
|---|---|---|---|---|
| eMBB 增强移动宽带 |
4K/8K 直播、VR、云游戏 | ~20ms | 极高(10 Gbps+) | 99.99% |
| URLLC 超可靠低时延 |
工业控制、自动驾驶、远程手术 | ≤ 1ms | 低 | 99.9999%(六个 9) |
| mMTC 海量物联 |
智慧城市、表计、传感网 | ~100ms(不敏感) | 极低 | 99% |
问题:传统 QoS(DiffServ)只能"软优先级"——拥塞时高优先级先走。 但 URLLC 不是"更优先",而是"必须 1ms 内到达"—— 它需要独立的物理路径、独立的带宽、独立的转发资源。 这是 SLA 的"硬隔离",不是"软优先"。
SRv6 的 Flex-Algo 让"每个切片用独立的算法走独立的路径"成为可能:
5G 切片 = "多个虚拟网络共享物理基础设施 + SLA 强隔离"。 SRv6 实现切片的精妙之处: 同一台路由器、同一根光纤,仅靠"不同的 Flex-Algo SID"就让数据自动走独立的路径、享受独立的带宽资源。 而且切片定义可以秒级动态调整——这是传统 MPLS 切片需要预先规划隧道完全做不到的。 这就是为什么中国移动、中国电信、Softbank、Telefonica 等头部运营商5G 承载网全面采用 SRv6。
这是 SRv6 + uSID + SR-PCE 三剑合璧的舞台。我们走一遍完整的工程实现。
传统方式叫"Service Chaining via Topology"——靠物理拓扑硬连接。SRv6 让它进化为"Service Chaining via Programming"——按 SID 列表自由编排。
把每个网络服务(防火墙、DPI、LB...)当成"网络函数(Network Function, NF)", 每个 NF 在控制器注册一个 SRv6 SID。流量按SID List 顺序逐个穿过 NF—— 这就是 SFC(Service Function Chaining)。
关键创新:NF 不需要懂路由! 它只需在收到包后处理完业务(比如防火墙过滤),然后把包送回到默认网关—— 网关就是 SRv6-aware 路由器,会根据 SRH 自动找到下一个 NF 的 SID 转发。
传统 SFC 像是"焊死的流水线"——产品必须按预设物理路径走过每个工位,调整顺序要重新布置传送带。
SRv6 SFC 像是"无人车自动调度"——每个工位有 RFID 标识(SID),无人车(数据包)按"工位列表"自主导航。
增加一个工位 = 改个列表。软件定义服务编排,正是 SRv6 SFC 的核心革命。
这是 2024-2026 年 SRv6 最热门的新战场。理解这个场景,能让你看清 SRv6 在"性能+可编程"双维度的天然优势。
典型 LLM 训练场景(如 GPT-4 级模型):
AllReduce 流量经常出现"大象流"——多条 ECMP 路径中只走一条,导致拥塞。 SRv6 + Flex-Algo 让控制器精确分配每条流走不同路径,实现真正的等价多路径。
控制器实时监控每条链路 BW 利用率。检测到拥塞时, 毫秒级下发新 SID List,让流量绕开热点链路。比传统 ECMP 哈希更智能。
SRv6 TI-LFA(Topology Independent Loop-Free Alternate)实现 ≤ 50ms 故障切换。 NCCL 通信几乎无感知——不会触发 TCP 重连或集合通信重启。
这是企业网架构师在 2025-2026 年面对的关键问题。答案藏在"隧道叠加"的深层成本里。
传统 SD-WAN 在 N 个分支机构之间建立 N×(N-1) 的全互联 IPsec 隧道:
SRv6 让 SD-WAN 演进为"无隧道隧道":分支用 SRv6 SID 直接编程路径, 路径状态在数据包里,不需要预建隧道。这就是 Cisco Catalyst SD-WAN(前 Viptela)正在融合 SRv6 的方向。
| 维度 | 传统 SD-WAN(IPsec 隧道) | SRv6 SD-WAN |
|---|---|---|
| 隧道数量 | N² 全互联,控制面爆炸 | 无需预建,路径在包里 |
| 路径选择 | 隧道粒度(粗) | SID 粒度(极细,可应用级) |
| 跨运营商 | 叠加 MPLS,双层封装 | 原生 IPv6 全球可达 |
| 新分支接入 | 配置 N 条新隧道 | 分配 Locator 即可加入 |
| 故障切换 | 秒级(隧道重建) | 毫秒级(TI-LFA) |
走过六大模块,我们终于可以回到最初的问题——SRv6 到底改变了什么?
SRv6 不只是更优秀的 MPLS。
它是把网络从"管道"升维为"分布式可编程计算机"的范式跃迁。
每一个 IPv6 地址都是一条指令,每一段 SID 列表都是一段程序——
从此,网络不再是被使用的基础设施,而是可以被编程的计算引擎。
一份精心编纂的术语速查手册,按"协议数据面 / 控制面 / 工程优化 / 业务场景"四类组织。 遇到不熟悉的概念时,可随时回查。
| 术语 | 英文全称 | 定义 |
|---|---|---|
| SRv6 | Segment Routing over IPv6 | 基于 IPv6 数据面的 Segment Routing 实现,将路径指令编码为 IPv6 地址 |
| SRH | Segment Routing Header | IPv6 Routing Header Type 4,承载 SID 列表与转发状态(RFC 8754) |
| SID | Segment Identifier | 128-bit IPv6 地址,由 Locator + Function + Arguments 组成 |
| Locator | Locator | SID 中的可路由前缀(通常 32-64 bit),定义"指令在哪台节点执行" |
| Function | Function Code | SID 中的指令操作码(16-32 bit),定义"做什么操作" |
| Arguments | Arguments | SID 中的指令参数(剩余 bit),如 Flow ID、Bridge Domain 等 |
| SL | Segments Left | SRH 字段,剩余未消费的 SID 数量。每经过一个段端点减 1 |
| Last Entry | Last Entry | SRH 字段,SID 列表的最大下标(数组长度 - 1) |
| End | Endpoint Function | 基础节点指令,按 IGP 最短路径到达节点。类似 SR-MPLS 的 Node SID |
| End.X | Endpoint w/ Cross-Connect | 邻接指令,强制经特定接口出。类似 SR-MPLS 的 Adjacency SID |
| End.DT4/6 | End w/ Decap & Table Lookup | VPN 解封装指令,剥外层 SRv6 后查 IPv4/IPv6 VRF 表 |
| End.DX2 | End w/ Decap & L2 X-Connect | L2VPN 直连指令,剥外层后 L2 帧送特定接口 |
| End.DT2U/M | L2 Unicast/Multicast Table | EVPN 桥接指令,单播查 MAC 表 / 多播 BUM 洪泛 |
| H.Encaps | Headend Encapsulation | 源节点封装指令,把原始包整体封进 IPv6+SRH 隧道 |
| H.Insert | Headend Insert | 已废弃:直接在原 IPv6 包插入 SRH(违反 RFC 8200) |
| BSID | Binding SID | "宏指令"SID,绑定一段 SR Policy。被命中时自动展开为子 SID 列表 |
| PSP | Penultimate Segment Pop | Flavor 修饰符:在倒数第二跳(SL=1)弹出 SRH |
| USP | Ultimate Segment Pop | Flavor 修饰符:在最后一跳(SL=0)弹出 SRH |
| USD | Ultimate Segment Decapsulation | Flavor 修饰符:最后一跳整体剥掉外层 IPv6+SRH,送内层包 |
| uSID | Micro Segment Identifier | Cisco 提出的 16-bit 微指令,多个 uSID 打包进单个 IPv6 地址 |
| uSID Block | uSID Common Block | 32-bit 全网共享前缀,多个 uSID 容器共用 |
| uSID Container | uSID Container | 一个 IPv6 地址容器,承载 4-6 个 16-bit uSID + End-of-Container 标记 |
| GIB / LIB | Global / Local ID Block | GIB = 传统 SRv6 SID 区域;LIB = uSID 区域。两者可同节点共存 |
| 术语 | 英文全称 | 定义 |
|---|---|---|
| IGP | Interior Gateway Protocol | 域内路由协议(IS-IS / OSPFv3),负责拓扑同步与 Locator 扩散 |
| IS-IS | Intermediate System to IS | 基于 OSI L2 的链路状态协议,SRv6 主流承载协议(RFC 9352) |
| LSP | Link State PDU | IS-IS 的链路状态报文。承载 SRv6 Locator TLV、SID Sub-TLV 等 |
| BGP | Border Gateway Protocol | 跨域路由协议,在 SRv6 中分发 Service SID(RFC 9252) |
| BGP-LS | BGP Link-State | "反向"BGP,把 IGP 拓扑导出给外部 SDN 控制器(RFC 9552) |
| PCE | Path Computation Element | 集中式路径计算实体,运行 CSPF 算法解决跨域 TE 问题 |
| SR-PCE | Cisco Segment Routing PCE | Cisco 基于 IOS-XR 的 PCE 实现,支持 SR-MPLS 与 SRv6 |
| PCEP | PCE Communication Protocol | 头节点与 PCE 之间的通信协议,传递路径请求与响应 |
| CSPF | Constrained SPF | 带约束的最短路径优先算法,支持带宽、时延、亲和性等多约束 |
| SR Policy | SR Policy | 由 (头节点, Color, 终点) 唯一标识的流量工程策略,含多条候选路径 |
| Color | Color (32-bit) | BGP Extended Community,标识"意图"(如低时延 = Color 100) |
| ODN | On-Demand Next-Hop | 头节点根据收到的彩色 BGP 路由自动实例化 SR Policy |
| Automated Steering | Automated Steering (AS) | BGP 服务路由自动按 (Color + Endpoint) 匹配的 SR Policy 转发 |
| Flex-Algo | Flexible Algorithm | 用户自定义算法(128-255),每个算法独立 SPF + 独立 SID(RFC 9350) |
| Crosswork | Cisco Crosswork Network Controller | 思科端到端网络控制器,集成 SR-PCE + 服务编排 + AI 闭环 |
| 术语 | 英文全称 | 定义 |
|---|---|---|
| NPU | Network Processing Unit | 专用网络处理芯片(如 Cisco Silicon One) |
| Parser | Packet Parser | NPU 流水线第一阶段,解析包头字段 |
| Parser Depth | Parser Depth Wall | 解析器一次能读取的最大 byte 数,超过则触发 Recirculation |
| Recirculation | Pipeline Recirculation | 包头过长时,包被丢回 Parser 重新解析,性能减半 |
| MSD | Maximum SID Depth | 节点能处理的最大 SID 列表深度(IGP 通告) |
| PMTUD | Path MTU Discovery | 路径 MTU 发现机制,IPv6 强制要求源节点处理 MTU 适配 |
| TI-LFA | Topology Independent LFA | 拓扑无关的快速重路由,≤ 50ms 故障切换 |
| LFA | Loop-Free Alternate | 无环替代路径,故障时本地切换的备份路径 |
| SRLG | Shared Risk Link Group | 共享风险链路组,主备路径必须避免落入同一 SRLG |
| HMAC TLV | HMAC Authentication TLV | SRH 中的密钥认证 TLV,防止 SRH 被篡改 |
| SR-PM | SR Performance Measurement | 基于 STAMP/TWAMP 的性能测量工具集,测时延/丢包/活性 |
| STAMP | Simple Two-Way AMP | RFC 8762 简单双向主动测量协议 |
| 术语 | 英文全称 | 定义 |
|---|---|---|
| L3VPN | Layer-3 VPN | IP 层 VPN 服务,每个 VRF 用一个 End.DT4/6 SID 表示 |
| EVPN | Ethernet VPN | 基于 BGP 的 L2/L3 VPN 控制平面,配合 SRv6 数据面 |
| VPWS | Virtual Private Wire Service | 点到点 L2 VPN,用 End.DX2 实现 |
| VPLS | Virtual Private LAN Service | 多点 L2 VPN,用 End.DT2U/M 实现 |
| SFC | Service Function Chaining | 服务功能链,按 SID 列表顺序串接多个网络功能 |
| NF | Network Function | 网络功能(防火墙、DPI、LB),每个 NF 注册一个 SID |
| 5G Slicing | 5G Network Slicing | 5G 网络切片,基于 Flex-Algo 实现 eMBB/URLLC/mMTC 硬隔离 |
| eMBB | enhanced Mobile Broadband | 5G 增强移动宽带切片,高带宽场景 |
| URLLC | Ultra-Reliable Low-Latency | 5G 超可靠低时延切片,要求 ≤ 1ms 时延 + 6 个 9 可靠性 |
| mMTC | massive Machine-Type Comm. | 5G 海量物联切片,连接密度优先 |
| RoCEv2 | RDMA over Converged Ethernet v2 | 以太网上的 RDMA,AI 数据中心的关键传输协议 |
| NCCL | NVIDIA Collective Comm. Library | NVIDIA GPU 集合通信库,AllReduce / All-to-All 等原语 |
| Mo6 | MPLS over SRv6 | MPLS 业务承载在 SRv6 underlay 上的过渡方案 |
| 6PE/6vPE | IPv6 Provider Edge | IPv6 业务承载在 MPLS 之上的传统方案,可与 SRv6 网关互联 |
重读模块 1(起源)+ 模块 4 的 End / End.X / End.DT4 三条核心指令。 在实验室 IOS-XR 上配置一个 L3VPN over SRv6 实例。
深入模块 2(数据面)+ 模块 3(IS-IS / BGP-LS)。 用 Wireshark 抓包分析 SRH,理解 PSP/USD Flavor 的实际效果。
精读模块 5(uSID)+ 模块 6(应用)。 部署 SR-PCE + Crosswork,在跨域场景中实施 Flex-Algo 切片与 TI-LFA 保护。
从模块 1 我们提出"为什么 IP 网络不一定是逐跳路由"开始,
到模块 6 我们看到 SRv6 在 5G、AI、SD-WAN 中的革命应用——
我们走过了一段完整的"第一性原理 + 苏格拉底追问"的认知旅程。
真正的技术理解,从来不是"记住了多少 RFC 编号",
而是"能用第一性原理推导出每一个设计决策"。
希望这份白皮书让你不只是"知道 SRv6"——而是"看懂 SRv6"。
Cisco Technical Deep-Dive · 2026
"The network is not a tube. It's a distributed programmable computer."