SRv6用IPv6地址形态的SID将路径和行为编程进网络,源节点封装SID列表,中间节点按指令转发。

摘要
这篇文章基于新华三《SRv6 技术白皮书》整理,面向已经具备 IP 路由、IGP、BGP、MPLS 或 VPN 基础的初级网络工程师。读完以后,你应该能回答三个问题:SRv6 报文到底怎样把路径带进网络,设备收到一个 SID 后为什么知道该做什么,以及控制器如何从网络里收集 SID 信息再编排一条端到端路径。
白皮书本身偏协议说明和字段解释,适合查阅,但初学者第一次阅读时容易被大量 TLV、SID 类型和英文缩写打断。本文会把原文中的关键插图放在对应段落附近,并用更接近工程排障和方案设计的语言解释每张图背后的含义。为了补足标准背景,文章还参考了 IETF 关于 Segment Routing 架构、SRH、SRv6 网络编程、SRv6 服务、IS-IS 扩展和 BGP-LS 扩展的公开 RFC 页面。
目录
为什么 SRv6 会出现 先把 SRv6 放进三层转发的坐标系 SRH:SRv6 把路径写在哪里 SID:看起来是 IPv6 地址,本质是网络指令 节点角色与完整转发过程 IS-IS 如何把 SRv6 能力发布出去 G-SRv6:为什么要压缩 SID BGP-EPE:把跨域出口也纳入路径工程 BGP-LS for SRv6:控制器如何看见全网 初级工程师应怎样学习和落地 SRv6 总结 参考资料
为什么 SRv6 会出现
如果把传统网络转发想象成“每台路由器只看目的地址,然后各自决定下一跳”,那么流量工程要解决的问题就是:当业务不希望完全听从最短路径,而是希望走一条更符合带宽、时延、拥塞、保护或策略要求的路径时,网络怎样表达这条路径。MPLS TE 和 RSVP-TE 曾经很好地回答过这个问题,它们可以建立显式路径,也可以为关键业务预留资源。但在大规模 WAN、云专线、SD-WAN 和多域网络里,传统 TE 的协议状态、标签分发、隧道维护和跨域协同成本会越来越重。
在开篇把背景落在云计算和广域网变革上。云业务要求网络交付更快、路径调整更灵活、运维可视化更强;SD-WAN 又希望控制器能根据应用质量、链路状态和业务优先级做智能调度。换句话说,网络不只是把包送到目的地,还要让“业务意图”更容易被转化为“转发路径”。Segment Routing 的核心思路就是把路径状态尽量放到源节点,网络中间节点只执行本地指令,不必为每一条业务路径保存复杂状态。
SR 可以有不同的数据平面。基于 MPLS 标签的数据平面通常称为 SR-MPLS,基于 IPv6 转发平面的就是 SRv6。SRv6 的关键变化是:它不再依赖 MPLS 标签,而是把 IPv6 地址形态的 Segment Identifier,也就是 SID,作为路径和指令的载体。源节点把一组 SID 放进 IPv6 扩展头,报文经过 SRv6 节点时,节点按照当前目的地址对应的 SID 执行本地行为,再把报文推进到下一个 SID。
从工程价值看,SRv6 有几个特别吸引人的点。第一,它天然运行在 IPv6 转发平面上,适合网络 IPv6 化的大趋势。第二,它的路径控制集中在源节点或控制器,减少了中间节点维护业务路径状态的负担。第三,SID 不只是“去某个节点”,还可以表达“从某条链路走”“解封装后查某个 VPN 表”“执行某个 OAM 动作”等行为,因此它比单纯的地址或标签更像一个网络程序指令。第四,它能和 IGP、BGP、BGP-LS、SDN 控制器结合,形成从拓扑发现到路径下发的闭环。
当然,SRv6 不是“把 IPv6 打开就自动拥有流量工程”。它仍然需要规划 SID Space、Locator、Function 长度,需要路由协议发布 SRv6 能力,需要设备支持 SRH 处理能力,也需要理解芯片对 SID 深度、SRH 处理和封装开销的限制。初学者学习 SRv6 时,最重要的不是一口气记住所有 TLV,而是先抓住一条主线:SRv6 把“路径”和“动作”编码成 SID List,源节点封装,Endpoint 节点执行,中间普通 IPv6 节点只负责把包送向当前目的地址。
先把 SRv6 放进三层转发的坐标系
普通 IPv6 转发里,报文头的 Destination Address 通常就是最终目的地址。路由器查 FIB,找下一跳,转发出去;下一台路由器继续看同一个目的地址。SRv6 则让 IPv6 目的地址在路径中发生变化:当前目的地址不是最终业务目的地,而是“当前要处理的 SID”。当一个 SRv6 Endpoint 节点处理完当前 SID,它会根据 SRH 中的 Segment List 和 Segments Left 字段找出下一个 SID,并把 IPv6 目的地址更新为这个下一个 SID。
这个变化看似小,实质上改变了路径表达方式。传统逐跳路由是“每台设备各自决定下一跳”;SRv6 是“源节点把关键路径点写进报文,Endpoint 节点按顺序执行”。中间不支持 SRv6 的普通 IPv6 路由器也可以参与转发,只要它能根据 IPv6 目的地址把报文送到当前 SID 所在的 SRv6 节点即可。这也是白皮书强调 SRv6 部署简单的原因之一:在某些场景下,不一定要求每一台中间设备都理解 SRH,核心要求是边界设备和特定 SRv6 节点具备封装、处理和 SID 行为能力。
对初级工程师来说,可以把 SRv6 网络拆成三个平面来理解。数据平面负责封装 SRH、更新 DA、查表转发和解封装;控制平面负责发布 Locator、SID、MSD、Endpoint Behavior 等能力;管理或控制器平面负责收集网络信息、计算路径、把策略下发给源节点。白皮书后面的 IS-IS 扩展、BGP-EPE 和 BGP-LS for SRv6,其实都服务于后两个平面。
还有一个容易混淆的点:SRv6 SID 采用 IPv6 地址形式,但它通常不等同于接口地址。它更像一个可路由的“功能地址”。Locator 部分让网络把报文送到拥有该 SID 的节点,Function 部分告诉这个节点要执行什么动作,Arguments 部分可以携带业务或流相关信息。也就是说,SID 既能被路由,又能触发行为,这正是 SRv6 网络编程模型的核心。
SRH:SRv6 把路径写在哪里
SRv6 使用 IPv6 Segment Routing Header,也就是 SRH,来携带 SID List。图 1 展示了典型封装:在原始报文前加一个新的 IPv6 基本头和 SRH,SRH 后面再跟原始报文。在另一类场景里,如果原始报文本来就是 IPv6,也可能是在原 IPv6 头中插入 SRH 扩展头。无论哪种方式,理解重点都是:外层 IPv6 头负责把报文送到当前 SID,SRH 负责保存剩余路径信息。

图 1:SRv6 的报文封装示意图。
图 1 里有两个字段需要特别记住。第一个是 IPv6 基本头里的 Next Header。当它取值为 43 时,表示后面跟着路由扩展头;SRH 是 Routing Type 取值为 4 的路由扩展头。第二个是 SRH 里的 Segments Left,简称 SL。SL 是一个指针,表示当前还剩多少个未处理的 SID。源节点刚封装时,SL 的初始值通常是 SID 数量减 1。每经过一个需要处理 SRH 的 Endpoint 节点,SL 会递减,并据此定位下一个 SID。
Segment List 的排列顺序也非常重要。Segment List 按照路径上节点“从远到近”的顺序排列,也就是 Segment List[0] 是路径最后一个 SID,Segment List[n-1] 是路径第一个要访问的 SID。初学者常会问:为什么不按从近到远排列?原因是 SRH 使用 SL 作为数组下标。初始 SL=n-1,因此第一个目的 SID 是 Segment List[n-1];处理一次后 SL 变成 n-2,目的地址变成 Segment List[n-2],直到 SL=0 时处理 Segment List[0]。
图 2 用一个简化报文帮助理解这个指针关系。IPv6 DA 等于当前要访问的 SID,SRH 里保存整个 SID List。你可以把它想象成一本路线册:封面上写着“下一站是谁”,内页里保留着完整站点列表和当前位置索引。每到一个 SRv6 站点,设备翻一下路线册,把封面上的下一站改掉,然后继续转发。

图 2:SRv6 报文简化示意图。
图 3 则把这个过程放到网络路径上。报文先以 SID[n-1] 作为 IPv6 DA,经过第一个 Endpoint 后,SL 减少,DA 被替换为 SID[1] 或其他对应位置的 SID;最后 SL=0,DA 变成 SID[0]。这就是 SRv6 的逐段转发,英文常称为 Segment by Segment。它和普通 IPv6 转发并不冲突,因为每一段之间仍然依赖普通 IPv6 路由把包送到当前 DA 所代表的节点。

图 3:SRH 处理过程示意图。
学习 SRH 时还要注意报文开销。一个普通 IPv6 地址是 128 bit,也就是 16 字节。SID List 里每多一个 128-bit SID,SRH 就会变大。路径越长,封装开销越明显,设备需要解析的头部也越长。这是后文 G-SRv6 要解决的问题:在很多网络里,SID 具有共同前缀,重复携带完整 128-bit SID 会浪费空间,因此可以压缩可变部分。
SID:看起来是 IPv6 地址,本质是网络指令
SRv6 的 SID 是整套机制里最值得反复琢磨的概念。 SID 用来定义某种网络功能、代表某种网络指令。这句话非常关键:SID 不是普通意义上的主机地址,也不是单纯的路由前缀;它是可以被网络路由到某个节点,并在该节点触发特定处理动作的 IPv6 地址形态标识。

图 4:SRv6 SID。
图 4 把 SID 切成四段:Locator、Function、Arguments 和 MBZ。Locator 标识 SID 所属的网段,通常由 IGP 或 BGP 发布,让其他设备能把报文转发到拥有该 SID 的节点。Function 是本地操作指令,节点收到目的地址匹配本地 Local SID 表的报文后,会根据 Function 找到对应行为。Arguments 是可选参数,可以携带服务、流或其他上下文信息。MBZ 表示 Must Be Zero,当前三段长度不足 128 bit 时,低位用 0 补齐。
用一个更工程化的类比来说,Locator 像“把包送到哪个站点”,Function 像“到了站点以后办什么业务”,Arguments 像“办理业务所需的参数”。例如一个 SID 的 Locator 把报文送到 PE 节点,Function 指示执行 End.DT4,节点就会解封装并查某个 IPv4 VPN 路由表;另一个 SID 的 Function 指示 End.X,节点就会把报文从某条指定链路发出去。两者都长得像 IPv6 地址,但行为完全不同。
白皮书列举了大量 Endpoint Behavior。初学者不必一次记住所有名字,但应该先掌握几类高频行为。End SID 表示节点或目的前缀,典型动作是推进到下一个 SID;End.X SID 表示某条链路,典型动作是从绑定的三层接口或下一跳转发;End.DT4、End.DT6、End.DT46 常用于三层 VPN 解封装后查表;End.DX4、End.DX6 常用于解封装后把报文发给特定下一跳;End.DX2、End.DT2U、End.DT2M 与 EVPN 二层业务有关;End.OP 与 OAM 有关;End.M 可用于保护指定 Locator 段内的远端 SID。
这些行为的共同点是:Endpoint 节点必须有本地 Local SID 表。Local SID 表记录本节点生成或配置的 SID,以及每个 SID 绑定的动作、出接口、VPN 实例或下一跳等信息。当报文的 IPv6 DA 命中本地 SID 时,设备不是简单地查普通路由转发,而是先执行 SID 对应的 Endpoint Behavior。这个本地行为执行完后,报文可能继续沿 SRH 推进,也可能被解封装并进入 VPN 表,或者触发 OAM 响应。
SID 还有附加行为,也就是 Flavors。白皮书提到 PSP、USP、USD 和 COC。PSP 是 Penultimate Segment Pop,倒数第二个 Endpoint 节点提前移除 SRH,减轻尾节点处理负担;USP 是最后一个 Endpoint 节点移除 SRH;USD 是最后一个 Endpoint 节点移除外层 IPv6 头,常与保护或修复场景相关;COC 是 Continue of Compression,用于 G-SRv6,表示本 SID 后面继续跟压缩 SID。Flavors 并不是另一个独立协议,而是对 SID 行为的细化。
这里有一个实战提醒:排查 SRv6 时,不要只盯路由表。普通 IPv6 路由能说明报文能否到达某个 Locator,但不能说明本节点收到 SID 后会做什么。你还需要看 Local SID 表、SID 对应的 Endpoint Behavior、VPN 实例绑定、出接口、下一跳、MSD 能力以及 SRH 是否被正确处理。很多“路由可达但业务不通”的问题,真正原因可能在 SID 行为或本地表项,而不在普通 IGP 可达性。
节点角色与完整转发过程
SRv6 节点按功能分为源节点、中转节点和 Endpoint 节点。源节点负责生成 SRv6 报文,它可能是一台主机,也可能是 SRv6 域边界设备。中转节点位于 SRv6 路径上,但不参与 SRv6 处理,只按普通 IPv6 报文转发。Endpoint 节点会处理当前 SID,执行 SRv6 相关动作,并更新 SRH 或解封装。
同一台设备在不同路径里可以扮演不同角色。PE1 在一条从 CE1 到 CE2 的 VPN 流里可能是源节点;同一个 PE1 在另一条路径里也可能只是 Endpoint 或中转节点。这一点很像 MPLS 网络中的 PE/P/ASBR 角色,但 SRv6 的角色更依赖“当前报文的 SID 是否命中本地行为”。因此看一台设备是不是 Endpoint,不能只看它型号或位置,而要看当前报文的 IPv6 DA 是否是它的 Local SID。

图 5:SRv6 报文详细转发示意图。
图 5 是理解 SRv6 转发的核心案例。路径上有 Device A 到 Device E 五台设备,其中 A 是源节点,C 和 E 是 Endpoint 节点,B 和 D 是普通中转节点。A 收到需要走 SRv6 路径的原始 IPv6 报文后,封装外层 IPv6 头和 SRH。因为路径需要经过 C 和 E 两个 Endpoint,所以 SID List 可以理解为 Segment List[0]=E、Segment List[1]=C,初始 SL=1,外层 IPv6 DA=C。
报文从 A 发出后,B 不需要理解 SRH。它只看到一个目的地址为 C 的 IPv6 报文,于是按普通 IPv6 路由把包转发给 C。C 收到报文后发现 IPv6 DA 命中自己的 Local SID,于是执行当前 SID 的行为:检查 SRH,发现 SL 大于 0,便把 SL 减 1,从 Segment List[0] 取出 E,并把外层 IPv6 DA 改为 E。此后 C 再查 IPv6 路由,把报文转发给下一跳 D。
D 也只是普通中转节点,它按目的地址 E 转发。E 收到报文后,IPv6 DA 命中自己的 Local SID,此时 SL=0,说明这是 SID List 里的最后一个 Endpoint。E 根据 SID 行为决定后续动作:如果是 End,就可能移除 SRH 或继续处理;如果是 End.DT4/End.DT6,就会解封装并查对应 VPN 表;如果是 End.DX4/End.DX6,就可能把内层报文发往特定下一跳。图 5 的价值就在于它清楚展示了:只有 C 和 E 真正处理 SRH,B 和 D 只做普通 IPv6 转发。
把这个过程放到排障里,可以形成一个简单检查顺序。第一,看源节点有没有匹配业务流并封装正确 SID List。第二,看初始 IPv6 DA 是否等于第一个要访问的 SID。第三,看到达第一个 Endpoint 的普通 IPv6 路由是否可达。第四,看 Endpoint 的 Local SID 表是否存在匹配项,行为是否正确。第五,看 SL 是否递减、DA 是否替换为下一个 SID。第六,看尾节点是否按预期解封装并进入正确业务表。
SRv6 的优雅之处在于,中间节点不需要保存每条 TE 路径的状态。它们只要能把报文送到当前 DA 所代表的 Locator 即可。代价是源节点和控制器要承担更多路径编排责任,报文头也会携带更多路径信息。因此 SRv6 的设计取舍不是“状态消失了”,而是“路径状态从网络中间节点转移到了源节点、控制器和报文头”。理解这个取舍,才能理解为什么后来会出现 G-SRv6、MSD 能力通告、BGP-LS 拓扑收集等机制。
IS-IS 如何把 SRv6 能力发布出去
只有数据平面能够处理 SRH 还不够,网络里的其他节点还要知道某台设备支持 SRv6、它有哪些 Locator、SID、Endpoint Behavior,以及它能处理多深的 SID List。第 2.6 节讲的 IS-IS SRv6 扩展,就是为了解决这些控制平面通告问题。
IS-IS 对 SRv6 的扩展可以分成几类。第一类是节点能力,比如 SRv6 Capabilities sub-TLV,用于说明节点支持 SRv6,能够处理 SRH。第二类是能力上限,比如 Node MSD sub-TLV,MSD 是 Maximum SID Depth,表示节点能够处理的 SID 数量或特定 SRH 操作上限。第三类是 Locator 和 SID 发布,比如 SRv6 Locator TLV、SRv6 End SID sub-TLV、SRv6 End.X SID sub-TLV、SRv6 LAN End.X SID sub-TLV。第四类是 SID 结构和行为,比如 SRv6 SID Structure Sub-Sub-TLV、SRv6 Endpoint Function。
为什么 Locator 要通过 IGP 发布?因为 Locator 负责把报文送到拥有某个 SID 的节点。如果一个节点有 Locator 2001:db8:1::/48,其他节点需要在 IGP 里学到这个前缀,才能把目的地址落在该 Locator 内的 SRv6 报文送过去。Function 则通常是 Locator 之后的字段,只有拥有该 SID 的节点本地理解它的具体行为。换句话说,IGP 首先保证“能送达”,再通过 SID sub-TLV 让网络或控制器知道“送达后做什么”。
MSD 对工程落地非常重要。假设控制器计算了一条很长的路径,需要在 SRH 里放入十几个 SID,但源节点或中间 Endpoint 节点的芯片只支持较小的 SID 深度,路径就可能无法下发或转发异常。Node MSD、Link MSD 等字段就是告诉控制器和其他节点:我的硬件或软件能力边界在哪里。初级工程师常把协议字段看成考试内容,但 MSD 是非常现实的设备能力约束,规划 SRv6 TE 时必须关注。
End SID、End.X SID 和 LAN End.X SID 的区别也值得掌握。End SID 更偏节点或前缀行为;End.X SID 绑定一条具体链路或邻接,适合表达“从这条链路出去”;LAN End.X SID 面向广播网络里的邻接场景。对于流量工程来说,节点 SID 可以让流量经过某个节点,邻接 SID 可以让流量经过某条链路。路径控制粒度越细,SID List 可能越长,报文开销和设备处理压力也越大。
IS-IS 发布 SRv6 Endpoint Function 的意义在于,控制平面不只是告诉别人“我有一个 SID”,还要告诉别人“这个 SID 是什么类型”。例如一个 SID 是 End 还是 End.X,是不是带 PSP、USP、COC,决定了控制器能否把它正确编排进路径。若控制器把一个只能做解封装的 SID 当成普通路径 SID 使用,业务显然会出问题。因此,SID 的语义必须被发布和理解。
从学习角度看,IS-IS SRv6 扩展可以先按“能力、范围、行为、限制”四个词记忆。能力是节点是否支持 SRv6;范围是 Locator 覆盖哪些 SID;行为是 SID 对应什么 Endpoint Function;限制是 MSD 等设备处理上限。后面读具体 TLV 格式时,就不会迷失在 Type、Length、Flags 和 Sub-TLV 的细节里。
G-SRv6:为什么要压缩 SID
SRv6 的一个天然挑战是头部开销。每个完整 SID 是 128 bit,路径越长,SRH 越大。在跨域、长路径或精细链路工程场景里,如果每个节点或邻接都要放一个完整 SID,报文头会明显膨胀。第 3 章介绍的 Generalized SRv6,也就是 G-SRv6,目标就是减少 SRH 中 SID List 的开销。
G-SRv6 的基本观察很朴素:在一个 SRv6 域里,运营者通常会规划一个专门的 SID Space,很多 SID 共享相同公共前缀 Common Prefix。既然公共前缀在多个 SID 中重复出现,就没有必要每次都完整携带。G-SRv6 把 128-bit SRv6 SID 的公共前缀移除,只在 Segment List 中携带可变部分,也就是压缩 SID,简称 G-SID。白皮书中认为 32 bit 是当前比较理想的压缩后 SID 长度。


图 6:支持压缩的 SRv6 SID 格式和 G-SID 部署示例。
图 12 和图 13 展示了压缩关系。一个完整 SID 可以拆成 Common Prefix、Node ID、Function、Args 和 MBZ。G-SID 通常由 Node ID 和 Function 组成,压缩后的 32-bit G-SID 与 Common Prefix 拼接,再补 0,就能还原出一个可用于转发的 128-bit 目的地址。图中的示例使用 Common Prefix 10:20:30::/48,Locator 长度 64,Args 长度 16,最终把 Node ID 和 Function 合成 32-bit G-SID。
G-SRv6 报文格式并不是完全推翻 SRH,而是在原本 128-bit SID 的位置里封装多个 32-bit G-SID。一个 128-bit 槽位可以放 4 个 32-bit G-SID,不足 4 个时用 0 补齐。这样,在同样的 SRH 空间里可以携带更多路径段,或者在同样路径长度下降低头部开销。

图 7:G-SRv6 报文格式示意图。
图 14 里有一个关键标记 COC,即 Continue of Compression。它标识本 SID 之后是 G-SID。需要注意,白皮书说明报文中不会真正携带 COC 标记;COC 是 SRv6 SID 本身的转发行为,图里标出来是为了方便理解。也就是说,设备处理到某个带 COC 行为的 SID 时,知道后面应该按压缩 SID 的方式继续解释。
G-SID 的目的地址计算依赖 Common Prefix、G-SID 和 SI。SI 是 SID Index,用于在一组 4 个 G-SID 中定位当前 G-SID,通常使用目的地址最低两位,取值 0 到 3。每经过一个压缩 SID 节点,SI 值会递减;如果 SI 为 0,则需要推进到下一组 G-SID,也就是让 SL 减 1。

图 8:G-SID 组成示意图。
图 15 给出一个很直观的例子:Common Prefix 为 A:0:0:0::/64,当前 G-SID 为 1:1,SI 为 3,那么拼接出来的目的地址就是 A:0:0:0:1:1::3。这个地址仍然是 IPv6 DA,网络仍然按 IPv6 路由把它送到对应节点。区别在于,Segment List 里没有重复携带完整 128-bit SID,而是通过公共前缀和压缩段动态计算。
对初学者来说,G-SRv6 可以先理解成“把很多相似的 SID 做前缀压缩”。它的收益是降低 SRH 开销,提高长路径或跨域路径的编码效率;它的代价是规划和实现更复杂,需要公共前缀、G-SID 长度、COC 行为、SI 处理和设备能力共同配合。部署时不能只看协议是否支持,还要看芯片能否高效解析压缩 SID,控制器是否能正确混合编排 128-bit SID 和 G-SID。
BGP-EPE:把跨域出口也纳入路径工程
到目前为止,我们主要讨论的是一个 SRv6 域内如何表达路径。现实网络往往跨越多个 AS,尤其是运营商骨干、云骨干和多数据中心互联场景。IGP 只负责一个自治系统内部的拓扑和 SID 发布,跨 AS 的出口选择通常由 BGP 控制。如果希望控制器把“从哪个 ASBR 出去、经过哪个 EBGP 对等体、走哪条物理链路”也纳入路径工程,就需要 BGP-EPE。
BGP-EPE 是 BGP Egress Peer Engineering,白皮书把它解释为一种 BGP for SRv6 扩展,用来为 BGP 对等体和对等体的域间路径分配 BGP Peer SID。Peer SID 可以通过 BGP-LS 收集并传递给 SDN 控制器,控制器再把域内 IGP SID 和域间 Peer SID 组合起来,生成跨域路径。
白皮书列出几类 BGP Peer SID。PeerNode SID 标识一个 BGP-EPE 对等体,如果到该邻居有多条物理链路,基于 PeerNode SID 转发时可能在多链路间负载分担。PeerAdj SID 标识到达 BGP-EPE 对等体的一条邻接链路,粒度更细,只能通过指定出接口转发。PeerNode-Adj SID 既可标识对等体节点,也可标识一条或多条邻接。PeerSet SID 标识一组对等体,转发时可在多个邻居间负载分担。

图 9:BGP-EPE 组网图。
图 18 展示了一个跨域路径。PE1 到 PE2 的路径被拆成三段:PE1 到 ASBR1 的域内路径,对应 SRv6 SID A;ASBR1 到 ASBR2 的域间路径,对应 BGP-EPE 分配的 PeerNode SID B;ASBR2 到 PE2 的域内路径,对应 SRv6 SID C。控制器把 A、B、C 编排成 SID List 下发给源节点 PE1,流量就能沿 PE1 -> ASBR1 -> ASBR2 -> PE2 的路径转发。
这张图的重点不是“有一个控制器”,而是“跨域出口也被抽象成可编排 SID”。没有 BGP-EPE 时,控制器可能知道域内拓扑,却很难精确控制从哪个 EBGP 出口离开本 AS。引入 Peer SID 后,跨域出口从 BGP 的策略结果变成了 SRv6 路径里的一个显式段。这样就可以根据链路质量、商业策略、带宽利用率或业务等级,把不同业务流引导到不同跨域出口。
工程上要注意,BGP-EPE 不是替代 BGP 选路,而是把 BGP 对等体和出口链路暴露为可工程化的资源。基础的邻居建立、路由可达、策略过滤和路由反射仍然属于 BGP 范畴;EPE 关注的是如何把这些出口资源以 SID 形式提供给控制器。初学者可以把它理解为“把 BGP 出口变成 SRv6 可调用的路径段”。
BGP-LS for SRv6:控制器如何看见全网
如果 SRv6 路径由控制器计算,控制器首先要知道网络里有哪些节点、链路、Locator、SID、Peer SID、MSD 和候选路径。BGP-LS 就是常见的信息收集通道。它把 IGP 学到的链路状态信息、TE 信息以及 SRv6 相关属性以 BGP 路由形式传递给控制器。第 5 章讲的 BGP-LS for SRv6,就是在 BGP-LS 中增加 SRv6 相关 NLRI 和 TLV。

图 10:BGP LS for SRv6 典型组网。
图 19 中,网络节点通过 BGP-LS 把信息上报给控制器,控制器计算路径后再把 SRv6 路径下发给源节点,最终业务报文按下发路径转发。图里的紫色虚线表示 BGP-LS 上报信息,蓝色虚线表示下发 SRv6 路径,橙色虚线表示实际报文转发路径。这个闭环很重要:没有上报,控制器看不见网络;没有计算,路径无法优化;没有下发,数据平面不会按策略走。
为了支持 SRv6,BGP-LS 新定义 SRv6 SID NLRI,用于通告和收集 SRv6 SID 的网络层可达信息。白皮书还列出了 BGP-LS 针对 Node NLRI、Link NLRI、Prefix NLRI 和 SRv6 SID NLRI 的多种扩展。例如 SRv6 Capabilities TLV 通告节点是否支持 SRv6;SRv6 Node MSD Types 通告节点 SID 深度能力;SRv6 End.X SID TLV 和 LAN End.X SID TLV 通告链路或广播网络邻接 SID;SRv6 Locator TLV 通告 Locator;SRv6 SID Information TLV 通告具体 SID;SRv6 Endpoint Behavior TLV 通告 SID 类型;SRv6 SID Structure TLV 描述 SID 各字段长度。
读到这些 TLV 时,初学者容易产生“字段太多,记不住”的挫败感。更好的方法是按控制器需要回答的问题来理解。控制器要知道“谁支持 SRv6”,所以需要 Capabilities;要知道“能塞多少 SID”,所以需要 MSD;要知道“怎么到达某节点”,所以需要 Locator;要知道“有哪些可用动作”,所以需要 Endpoint Behavior;要知道“这个 SID 怎么拆分字段”,所以需要 SID Structure;要知道“跨域出口在哪里”,所以需要 BGP Peer Node SID 相关 TLV。
BGP-LS 还有一个现实意义:它把多种底层协议的信息汇聚成控制器可消费的数据。域内拓扑可能来自 IS-IS,域间出口来自 BGP-EPE,SID 行为来自 SRv6 扩展,控制器不可能靠人工配置一条条路径长期维护。通过 BGP-LS,网络自己把可编排资源上报出来,控制器再结合 SLA、策略和业务需求计算路径。SRv6 的“应用驱动网络”能力,很大程度上依赖这类信息闭环。
不过,BGP-LS 也不是越多越好。它会把大量拓扑和 SID 信息送到控制器,控制器和 BGP-LS 发言者需要承受路由规模、更新频率和策略过滤压力。实际部署时要规划哪些节点作为 BGP-LS speaker,哪些信息需要上报,控制器如何去重和建模,BGP-LS 会话如何保护,故障时路径是否有本地保护或降级策略。协议字段只是第一步,稳定运行才是工程价值所在。
初级工程师应怎样学习和落地 SRv6
学习 SRv6 最怕从字段表开始。字段表当然重要,但如果一开始就陷入 TLV 编号、Flags 位和子 TLV 嵌套,很容易只记住名字,无法理解数据平面发生了什么。建议先按四层路径学习:第一层是普通 IPv6 可达性,保证 Locator 能被路由;第二层是 SRH 和 SID List,理解 DA、SL、Segment List 的关系;第三层是 Endpoint Behavior,理解当前 SID 命中 Local SID 后执行什么动作;第四层是控制器和 BGP-LS,理解路径如何被计算和下发。
在实验环境里,可以先做一个最小拓扑:A-B-C-D-E 五台设备或虚拟节点,A 和 C/E 支持 SRv6,B/D 只做普通 IPv6 转发。先验证 A 到 C、C 到 E 的 IPv6 可达,再配置 C 和 E 的 Local SID,最后在 A 上封装一个包含 C、E 的 SID List。抓包时重点看外层 IPv6 DA 初始是否为 C,C 处理后 DA 是否变成 E,SL 是否从 1 变为 0。这个实验能把图 5 变成真实感知。
第二个实验可以加入 VPN 行为。让尾节点 E 的 SID 使用 End.DT4 或 End.DT6,绑定到某个 VPN 实例。此时 E 收到最后一个 SID 后不只是推进路径,而是解封装并查 VPN 表。你会发现 SRv6 不只是 TE 隧道,也能承载 VPN 业务;SID 行为决定了尾节点如何把外层路径和内层业务连接起来。
第三个实验可以看 IS-IS 发布。观察 Locator 是否进入 IGP,SRv6 Capabilities 是否发布,End SID 和 End.X SID 是否被正确携带,MSD 是否符合设备能力。这个阶段的目标不是背每个 TLV 的二进制格式,而是建立控制平面和数据平面的映射:IGP 里看到的 Locator 和 SID,最后会如何影响源节点封装和 Endpoint 本地行为。
第四个实验再引入控制器或模拟控制器。通过 BGP-LS 收集拓扑与 SID,再计算一条不同于 IGP 最短路的路径下发给源节点。如果没有真实控制器,也可以人工配置 TE Policy 或等价策略,重点观察“路径由谁决定”。这能帮助你理解 SRv6 从单设备功能走向全网流量工程的关键差别。
落地规划时,首先要做地址和 SID 结构设计。SID Space、Locator 长度、Function 长度、Arguments 长度会影响路由规模、可读性、压缩能力和未来扩展。规划太粗,可能浪费地址或难以表达业务;规划太细,可能增加运维复杂度。G-SRv6 场景还要考虑 Common Prefix 和 G-SID 长度,保证压缩规则和设备能力一致。
其次要评估硬件能力。SRv6 对芯片解析深度、SRH 处理、封装解封装、SID 深度和压缩 SID 支持都有要求。白皮书反复出现 MSD,就是因为设备能力会约束路径长度和行为组合。上线前要确认源节点能封装多少 SID,Endpoint 能弹出或解封装多少 SID,是否支持 PSP/USP/USD/COC,是否支持需要的 VPN 或 EVPN 行为。
再次要设计可观测性。SRv6 报文路径被写进 SRH,但生产网络不能只靠理论推断。你需要能查看 Local SID 表、SRv6 Policy、SID List、SRH 统计、丢包计数、OAM 探测结果、BGP-LS 上报状态和控制器路径计算结果。遇到问题时,按“业务分类 -> 源节点封装 -> 当前 DA 可达 -> Endpoint 行为 -> 下一个 SID -> 尾节点解封装”的顺序定位,会比盲目查全网路由更高效。
最后要处理好与现网的过渡。白皮书提到,在 DC 和 WAN 中,只需网络边界设备及特定网络节点支持 SRv6,其他设备支持 IPv6 即可。这给渐进部署提供了空间。可以先在边界 PE、关键 ASBR、控制器和部分核心节点启用 SRv6 能力,把 SRv6 路径作为特定业务或特定切片的承载方式,再逐步扩大范围。不要把 SRv6 当成一次性替换所有现网技术的工程,而应把它当成一个可渐进引入的路径编排能力。
从知识体系上看,SRv6 横跨 IPv6、IGP、BGP、MPLS VPN、EVPN、SDN 控制器和芯片转发。初级工程师不必一开始就掌握全部边角协议,但要建立正确的主干模型。只要你能解释“SRH 里有什么、SL 怎样变化、SID 怎样拆成 Locator 和 Function、Endpoint 为什么知道要做什么、IGP/BGP-LS 怎样把这些信息交给控制器”,再去读各种 TLV 表和 RFC,就会顺很多。
总结
SRv6 的核心不是“IPv6 加一个扩展头”这么简单,而是把路径和行为用 IPv6 地址形态的 SID 编程进网络。源节点把 SID List 放入 SRH,普通中转节点按 IPv6 DA 转发,Endpoint 节点根据 Local SID 表执行行为并推进到下一个 SID。Locator 解决可达,Function 解决动作,Arguments 解决参数,SRH 解决路径携带,IGP/BGP-LS 解决信息发布和控制器可见性。
新华三白皮书的主线可以概括为五层。第一层是基础封装:SRv6 报文、SRH、Segments Left 和 Segment List。第二层是 SID 语义:Locator、Function、Arguments、Endpoint Behavior 和 Flavors。第三层是域内控制平面:IS-IS 发布 SRv6 能力、Locator、SID、MSD 和 Endpoint Function。第四层是头部优化:G-SRv6 通过 Common Prefix 和 32-bit G-SID 降低长路径开销。第五层是跨域和控制器:BGP-EPE 把域间出口变成 Peer SID,BGP-LS for SRv6 把全网拓扑和 SID 信息上报给控制器。
对初级工程师而言,最好的学习方式是围绕报文生命周期建立直觉:源节点为什么封装、当前目的地址是谁、哪台设备处理 SRH、SL 如何变化、尾节点如何解封装。只要这条线清楚,后面的 G-SRv6、BGP-EPE 和 BGP-LS 都可以看成围绕同一个目标展开的增强能力:让路径表达更高效,让跨域资源可编排,让控制器更准确地理解和驱动网络。
参考资料
https://datatracker.ietf.org/doc/html/rfc8402
https://datatracker.ietf.org/doc/html/rfc8754
https://datatracker.ietf.org/doc/html/rfc8986
https://datatracker.ietf.org/doc/html/rfc9252
https://datatracker.ietf.org/doc/html/rfc9352
https://datatracker.ietf.org/doc/html/rfc9514
https://datatracker.ietf.org/doc/html/rfc8667


