第339篇:SRv6 TE 与现有 MPLS 网络的平滑演进
关键词:SRv6、SRv6 TE、MPLS、平滑演进、双栈、Service Function Chaining、华为NE/CE系列
一、案例背景
某省级运营商的骨干网已稳定运行MPLS TE(流量工程)多年,承载了包括MPLS L3VPN、IP-LAN、Carrier Ethernet等多种业务。随着5G、云计算等新兴业务的快速发展,现有MPLS TE网络面临以下挑战:
- 扩展性不足:MPLS TE的信令协议(RSVP-TE)配置复杂,大规模部署维护成本高。
- 功能受限:MPLS TE不支持灵活的服务链(Service Function Chaining),难以满足云服务编排需求。
- IPv6演进压力:监管要求支持IPv6,MPLS本身不原生支持IPv6。
- 控制器依赖:现有MPLS TE依赖外部控制器进行路径计算,缺乏设备内生的编程能力。
决策:启动SRv6 TE平滑演进项目,在保留现有MPLS TE业务的前提下,逐步引入SRv6 TE能力。
二、需求分析与方案设计
2.1 演进阶段规划
| 阶段 | 时间 | 目标 | 关键里程碑 |
|---|---|---|---|
| 阶段0:准备 | 第1-2月 | 环境准备、方案设计 | 方案评审通过 |
| 阶段1:Underlay升级 | 第3-4月 | IGP升级支持SRv6、设备SRv6能力激活 | IGP SRv6扩展完成 |
| 阶段2:双栈运行 | 第5-6月 | SRv6 TE与MPLS TE并存、新建业务走SRv6 TE | 双栈验证通过 |
| 阶段3:业务迁移 | 第7-9月 | 逐步迁移现有业务至SRv6 TE | 50%业务迁移 |
| 阶段4:MPLS TE下线 | 第10-12月 | 下线MPLS TE、纯SRv6 TE运行 | 项目验收 |
2.2 演进架构

2.3 SRv6 TE vs MPLS TE 对比
| 特性 | MPLS TE | SRv6 TE | 演进考量 |
|---|---|---|---|
| 信令协议 | RSVP-TE | 无信令(控制面编程) | 简化配置 |
| 转发平面 | MPLS Label栈 | SRv6 Header(IPv6扩展头) | 需IPv6 Underlay |
| 路径计算 | 控制器(PCE) | 控制器或设备内生 | 保留控制器 |
| 带宽预留 | RSVP-TE支持 | SR-TE Policy支持 | 等价替换 |
| 快速重路由 | FRR(LFA/TI-LFA) | FRR(LFA/TI-LFA) | 等价替换 |
| 业务支持 | L3VPN、IP-LAN | L3VPN、SFC、IPv6 | 扩展能力 |
| 运维复杂度 | 高 | 低 | 运维友好 |
2.4 SRv6 Header结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ IPv6 Destination Address +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 Source Address |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Segment Left | Traffic Class |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flow Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Segments (N-2) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...
| |
+ Segments (0) +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
SRv6 Header关键字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| Destination Address | 128bit | 当前活跃Segment的SID |
| Segment Left | 16bit | 剩余需要处理的Segment数量 |
| Segments List | N×128bit | SRH中的Segment列表,定义完整路径 |
SRv6 vs MPLS Header开销对比:
| 协议 | Header大小 | 每跳开销 | 典型路径(4跳)总开销 |
|---|---|---|---|
| MPLS | 4 bytes/Label | 4 bytes | 16 bytes (4标签) |
| SRv6 | 48 bytes (SRH) + 40 bytes (IPv6) | 0 (一跳解码) | 88 bytes (固定) |
2.5 SRv6 SID/Locator规划原则
SID规划是SRv6部署的核心,直接决定网络扩展性和运维效率。
| 规划项 | 原则 | 示例 |
|---|---|---|
| Locator前缀 | 每个设备分配唯一Locator | 2001:db8::3200:1:X::/112 |
| SID粒度 | /96或/112,/96扩展性更好 | /96支持2^64个SID |
| Function划分 | End/End.X/End.BMX/AD等 | End:0, End.X:1-100, End.BMX:101-200 |
| 冗余规划 | 预留50% SID空间 | 每设备规划1024个SID,使用512个 |
# SID规划表示例
# 设备 Locator前缀 Function范围 用途
# PE-01 2001:db8::3200:1:1:: 0-100 End/End.X
# PE-01 2001:db8::3200:1:100:: 0-100 End.BMX(BGP)
# P-01 2001:db8::3200:1:2:: 0-50 End/End.X
# P-02 2001:db8::3200:1:3:: 0-50 End/End.X
# PE-02 2001:db8::3200:1:4:: 0-100 End/End.X
# PE-02 2001:db8::3200:1:101:: 0-100 End.BMX(BGP)
三、技术细节与实施过程
3.1 Underlay升级:IGP扩展SRv6
SRv6依赖于IGP(IS-IS或OSPF)的扩展来分发SRv6 SID(Segment Identifier)。本次演进采用IS-IS Level-2作为IGP。
# IS-IS扩展SRv6配置
<Huawei> system-view
[Huawei] sysname NE40E-PE-01
[NE40E-PE-01] isis 1
[NE40E-PE-01-isis-1] sr-mp enable
[NE40E-PE-01-isis-1] sr-mp protocol-is-is enable
[NE40E-PE-01-isis-1] quit
# 配置SRv6 SID(Locator)
[NE40E-PE-01] srv6
[NE40E-PE-01-srv6] locator S16
[NE40E-PE-01-srv6-locator-S16] prefix 2001:db8::3200:1:0::/112
[NE40E-PE-01-srv6-locator-S16] end-function-flags b
[NE40E-PE-01-srv6-locator-S16] end-function behavior end
[NE40E-PE-01-srv6-locator-S16] end-function behavior end.x
[NE40E-PE-01-srv6-locator-S16] end-function behavior end.bmx
[NE40E-PE-01-srv6-locator-S16] quit
[NE40E-PE-01-srv6] quit
# 接口启用IS-IS和SRv6
[NE40E-PE-01] interface HundredGigE 1/0/1
[NE40E-PE-01-HundredGigE1/0/1] ipv6 enable
[NE40E-PE-01-HundredGigE1/0/1] ipv6 address 2001:db8::1/64
[NE40E-PE-01-HundredGigE1/0/1] isis enable 1
[NE40E-PE-01-HundredGigE1/0/1] quit
3.2 SRv6 TE Policy配置
# SRv6 TE Policy配置(替代MPLS TE Tunnel)
[NE40E-PE-01] srv6
[NE40E-PE-01-srv6] policy color 100 endpoint 2001:db8::3200:1:1::1
[NE40E-PE-01-srv6-policy-100] candidate-path 10
[NE40E-PE-01-srv6-policy-100-cp-10] type explicit
[NE40E-PE-01-srv6-policy-100-cp-10] segment 1 endpoint 2001:db8::3200:1:2::1 # P-01的SID
[NE40E-PE-01-srv6-policy-100-cp-10] segment 2 endpoint 2001:db8::3200:1:3::1 # P-02的SID
[NE40E-PE-01-srv6-policy-100-cp-10] segment 3 endpoint 2001:db8::3200:1:4::1 # PE-02的SID
[NE40E-PE-01-srv6-policy-100-cp-10] preference 10
[NE40E-PE-01-srv6-policy-100-cp-10] quit
[NE40E-PE-01-srv6-policy-100] candidate-path 20
[NE40E-PE-01-srv6-policy-100-cp-20] type auto # 自动计算路径
[NE40E-PE-01-srv6-policy-100-cp-20] preference 50 # 备用路径
[NE40E-PE-01-srv6-policy-100-cp-20] quit
[NE40E-PE-01-srv6-policy-100] quit
[NE40E-PE-01-srv6] quit
# 将SRv6 TE Policy应用到BGP VPNv4路由
[NE40E-PE-01] bgp 65001
[NE40E-PE-01-bgp-65001] address-family vpnv4
[NE40E-PE-01-bgp-65001-vpnv4] srv6 te policy 100
[NE40E-PE-01-bgp-65001-vpnv4] quit
[NE40E-PE-01-bgp-65001] quit
3.3 业务迁移策略
| 业务类型 | 迁移策略 | 迁移时间窗口 | 验证方式 |
|---|---|---|---|
| MPLS L3VPN | 新建VRF使用SRv6 TE,存量VRF保持不变 | 阶段3,逐VRF迁移 | 路由表验证+Ping测试 |
| IP-LAN | 新建IP-LAN使用SRv6,存量保持不变 | 阶段3 | 连通性测试 |
| Carrier Ethernet | 评估SRv6对EVC的支持情况 | 阶段4 | 业务验证 |
| 5G承载 | 新建5G承载直接使用SRv6 TE | 阶段2 | 端到端时延测试 |
3.4 实施过程中的问题与解决
问题1:MPLS与SRv6双栈运行时的路由冲突
双栈运行期间,同一目的地址同时存在MPLS TE和SRv6 TE路径,可能导致路由冲突。
解决方案:使用BGP选路规则控制,通过Local Preference区分新旧路径优先级。
# 提高SRv6 TE路径的Local Preference
[NE40E-PE-01] route-policy SRV6_PREFERRED permit node 10
[NE40E-PE-01-route-policy-SRV6_PREFERRED] if-match srv6-te-policy
[NE40E-PE-01-route-policy-SRV6_PREFERRED] apply local-preference 200
[NE40E-PE-01-route-policy-SRV6_PREFERRED] quit
[NE40E-PE-01] route-policy SRV6_PREFERRED permit node 20
[NE40E-PE-01-route-policy-SRV6_PREFERRED] quit
问题2:SRv6 SID规划不足
初期SID规划为/112,后期发现SID空间不足(单设备需要多个Locator)。
解决方案:重新规划SID空间,改为/96,并提供多个Locator。
# 新增Locator
[NE40E-PE-01] srv6
[NE40E-PE-01-srv6] locator S16_BGP
[NE40E-PE-01-srv6-locator-S16_BGP] prefix 2001:db8::3200:1:100::/96
[NE40E-PE-01-srv6-locator-S16_BGP] end-function-flags b
[NE40E-PE-01-srv6-locator-S16_BGP] end-function behavior end.bmx
[NE40E-PE-01-srv6-locator-S16_BGP] quit
[NE40E-PE-01-srv6] quit
问题3:MPLS与SRv6双栈路由冲突
双栈运行期间,IGP同时分发MPLS和SRv6的TE拓扑,PCE需要分别计算两套路径。
解决方案:启用BGP-LS分别采集两套拓扑,在控制器中隔离管理。
# 验证IS-IS SRv6扩展TLV
<NE40E-PE-01> display isis lsdb verbose
LSType: Indicated by L1/L2
LsId: SystemId: PsnP: SeqNum: RemLive: CheckSum
L2 192.168.1.1 1921681001 00 00 00 07 00:08:23 6A3F
Extended ISIS reachability:
Dest-IPv6: 2001:db8::2/128, Metric: 10
Sub-TLV SRv6 Capability:
Locator: 2001:db8::3200:1:2::/112
Flags: B(Capable)
3.5 双栈运行验证命令集
| 验证项 | 华为VRP命令 | 预期输出 |
|---|---|---|
| SRv6 Locator | display srv6 locator |
所有Locator及其SID范围 |
| SRv6 SID | display srv6 sid |
本地绑定的SID和行为 |
| SRv6 TE Policy | display srv6 te policy |
所有TE Policy及状态 |
| SRv6 Binding SID | display srv6 binding-sid |
绑定的BGP VPNv4路由 |
| IS-IS SRv6 | display isis sr-mp |
SR-MP扩展状态 |
| SRv6转发表 | display ipv6 routing-table srv6 |
SRv6路由条目 |
| MPLS TE Tunnel | display mpls te tunnel-interface |
MPLS TE隧道状态 |
| 双栈对比 | display srv6 te policy verbose |
TE Policy详细路径 |
# 验证SRv6 TE Policy状态
<NE40E-PE-01> display srv6 te policy verbose
Policy Name: policy-100
Color: 100
Endpoint: 2001:db8::3200:1:4::1
State: Active
Candidate Path:
Path ID: 10
Type: Explicit
State: Active <-- 当前活跃路径
Preference: 10
Segments:
1. 2001:db8::3200:1:2::1 (P-01 SID)
2. 2001:db8::3200:1:3::1 (P-02 SID)
3. 2001:db8::3200:1:4::1 (PE-02 SID)
Path MTU: 1280
3.6 迁移风险控制矩阵
| 风险项 | 概率 | 影响 | 应对措施 |
|---|---|---|---|
| SRv6 Header过大导致分片 | 中 | 中 | Underlay MTU调整至1500+88=1588 |
| 双栈路由选路不一致 | 高 | 高 | Route-Policy控制Local Preference |
| PCE控制器SRv6计算错误 | 低 | 高 | 先实验室验证PCE SRv6能力 |
| 存量MPLS业务受影响 | 中 | 高 | 迁移窗口选择在业务低峰,保留回退 |
| 运维人员不熟SRv6排错 | 高 | 中 | 提前培训+排错手册+华为TAC支持 |
| SRv6设备兼容性 | 低 | 高 | 现网设备提前验证SRv6版本 |
MTU调整示例:
# SRv6 Header增加约88字节(IPv6 40 + SRH 48),需调整接口MTU
[NE40E-PE-01] interface HundredGigE 1/0/1
[NE40E-PE-01-HundredGigE1/0/1] ipv6 mtu 1588
[NE40E-PE-01-HundredGigE1/0/1] quit
# 验证MTU
<NE40E-PE-01> display interface HundredGigE 1/0/1
IPv6 MTU: 1588 Bytes
四、实战配置/案例分析
4.1 SRv6 Service Function Chaining配置
SRv6支持服务链功能,可以在转发路径上插入安全、加速等中间件。
# 配置Service Function(安全网关)
[NE40E-PE-01] srv6
[NE40E-PE-01-srv6] locator SFC
[NE40E-PE-01-srv6-locator-SFC] prefix 2001:db8::sfc::/96
[NE40E-PE-01-srv6-locator-SFC] end-function-flags b
[NE40E-PE-01-srv6-locator-SFC] end-function behavior end
[NE40E-PE-01-srv6-locator-SFC] quit
# 配置Service Function Chain
[NE40E-PE-01-srv6] policy color 200 endpoint 2001:db8::3200:1:1::1
[NE40E-PE-01-srv6-policy-200] candidate-path 10
[NE40E-PE-01-srv6-policy-200-cp-10] type explicit
[NE40E-PE-01-srv6-policy-200-cp-10] segment 1 endpoint 2001:db8::sfc::firewall # 防火墙
[NE40E-PE-01-srv6-policy-200-cp-10] segment 2 endpoint 2001:db8::sfc::accelerator # 加速器
[NE40E-PE-01-srv6-policy-200-cp-10] segment 3 endpoint 2001:db8::3200:1:4::1 # 目的PE
[NE40E-PE-01-srv6-policy-200-cp-10] preference 10
[NE40E-PE-01-srv6-policy-200-cp-10] quit
[NE40E-PE-01-srv6-policy-200] quit
4.2 迁移进度跟踪

| 月份 | MPLS TE业务数 | SRv6 TE业务数 | 迁移进度 | 备注 |
|---|---|---|---|---|
| 第5月 | 200 | 20 | 10% | 5G承载首批上SRv6 |
| 第6月 | 200 | 50 | 20% | 新建L3VPN上SRv6 |
| 第7月 | 180 | 80 | 31% | 首批存量VRF迁移 |
| 第8月 | 150 | 120 | 44% | 第二批VRF迁移 |
| 第9月 | 120 | 160 | 57% | 第三批VRF迁移 |
| 第10月 | 80 | 200 | 71% | 大规模迁移 |
| 第11月 | 30 | 250 | 89% | 收尾迁移 |
| 第12月 | 0 | 280 | 100% | MPLS TE下线 |
4.3 性能对比测试
| 指标 | MPLS TE | SRv6 TE | 变化 |
|---|---|---|---|
| 端到端时延 | 2.5ms | 2.8ms | +12%(SRv6 Header开销) |
| 吞吐量 | 95Gbps | 88Gbps | -7%(SRv6处理开销) |
| 切换时间(FRR) | 50ms | 45ms | -10% |
| 配置复杂度 | 高(RSVP-TE信令) | 低(编程式) | 显著降低 |
| 运维人力 | 3人/月 | 1人/月 | -67% |
4.4 SRv6 TE业务迁移验证清单
每次迁移后必须逐项验证,确认无误后再继续下一批次。
| 序号 | 验证项 | 验证方法 | 通过标准 |
|---|---|---|---|
| 1 | SRv6 TE Policy状态 | display srv6 te policy |
State为Active |
| 2 | SRv6 Binding SID | display srv6 binding-sid |
绑定正确VRF |
| 3 | BGP VPNv4路由 | display bgp routing-table vpnv4 |
路由Next-Hop为SRv6 SID |
| 4 | 端到端连通性 | ping -a src -n dst |
丢包率为0 |
| 5 | 路径跟踪 | tracernet ipv6 |
路径经过指定Segment |
| 6 | FRR切换测试 | 模拟链路故障 | 切换时间<50ms |
| 7 | 吞吐量测试 | iPerf3 | 达到标称90%以上 |
| 8 | MTU验证 | ping -s 1492 -f |
不分片可达 |
| 9 | 回退验证 | 回退至MPLS TE | 业务恢复正常 |
4.5 SRv6 SID结构深度设计说明
SID(Segment Identifier)是SRv6的核心概念,其结构设计决定了网络的扩展性、运维效率和故障恢复能力。下面以本项目SID规划为例,详细说明SID分层结构:
| 层级 | 比特范围 | 长度 | 含义 | 示例值 |
|---|---|---|---|---|
| Locator(全局前缀) | 高48bit | 48bit | 运营商/骨干域标识 | 2001:db8::/48 |
| Locator(域ID) | 中间16bit | 16bit | 骨干域标识 | 0x3200(省级骨干) |
| Locator(Node ID) | 低16bit | 16bit | 设备唯一编号 | PE-01 = 0x0001 |
| Function Index | 后32bit(高8-0bit) | 8-32bit | 功能索引号 | 0=NodeSID, 1-50=AdjSID |
| Function Index | 后32bit(剩余) | 24bit | 扩展索引 | 用于更细粒度的SID分配 |
完整Locator示例:2001:db8::3200:1:0001(Global=2001:db8::/48, Domain=3200, Node=1, Function=:0001)
| SID层次 | 长度 | 取值范围 | 含义 | 示例 |
|---|---|---|---|---|
| Global Prefix | 48bit | 2001:db8::/48 | 运营商全局前缀 | 由IANA分配 |
| Domain ID | 16bit | 3200 | 骨干域标识 | 0x3200=省级骨干 |
| Node ID | 16bit | 1-65535 | 设备唯一编号 | PE-01=0x0001 |
| Function | 剩余bit | 0-65535 | 功能索引 | 0=NodeSID, 1-50=AdjSID |
SID Function分类表:
| Function范围 | 类型 | 行为(behavior) | 用途 | 示例 |
|---|---|---|---|---|
| 0 | Node SID | End | 终结到本地,查IPv6路由表 | 2001:db8::3200:1:1:0 |
| 1-50 | Adjacency SID | End.X | 指向特定出接口的直连邻居 | 2001:db8::3200:1:1:1 |
| 51-100 | Protected Adj-SID | End.X | 带FRR保护的Adj-SID | 2001:db8::3200:1:1:51 |
| 101-200 | BGP SID | End.BMX | BGP VPNv4/V6 转发表索引 | 2001:db8::3200:1:1:101 |
| 201-300 | SFC SID | End | 服务链函数终结 | 2001:db8::sfc::firewall |
| 301-500 | 预留 | - | 未来扩展 | - |
4.6 SRv6 Policy端到端完整配置模板
以下给出从Underlay到Overlay的完整SRv6 TE Policy配置模板,覆盖IGP扩展、SID分发、TE Policy创建、业务绑定全流程:
# ============================================================
# 完整SRv6 TE Policy配置模板(PE-01 → PE-02,经P-01、P-02)
# ============================================================
# ========== Step 1: 全局SRv6使能 ==========
[PE-01] srv6 enable
# ========== Step 2: 配置SRv6 Locator ==========
[PE-01] srv6
[PE-01-srv6] locator S16_NODE
[PE-01-srv6-locator-S16_NODE] prefix 2001:db8::3200:1:1::/96
[PE-01-srv6-locator-S16_NODE] end-function-flags b
[PE-01-srv6-locator-S16_NODE] end-function behavior end
[PE-01-srv6-locator-S16_NODE] end-function behavior end.x
[PE-01-srv6-locator-S16_NODE] end-function behavior end.bmx
[PE-01-srv6-locator-S16_NODE] end-function-flags x
[PE-01-srv6-locator-S16_NODE] range 1 50
[PE-01-srv6-locator-S16_NODE] adj-sid-behavior end.x
[PE-01-srv6-locator-S16_NODE] quit
# BGP SID专用Locator
[PE-01-srv6] locator S16_BGP
[PE-01-srv6-locator-S16_BGP] prefix 2001:db8::3200:1:100::/96
[PE-01-srv6-locator-S16_BGP] end-function-flags b
[PE-01-srv6-locator-S16_BGP] end-function behavior end.bmx
[PE-01-srv6-locator-S16_BGP] range 1 200
[PE-01-srv6-locator-S16_BGP] bmx-sid-behavior end.bmx.bgp.l3vpn
[PE-01-srv6-locator-S16_BGP] quit
[PE-01-srv6] quit
# ========== Step 3: IGP (IS-IS) SRv6扩展 ==========
[PE-01] isis 1
[PE-01-isis-1] network-entity 49.0001.192168010100.00
[PE-01-isis-1] is-level level-2
[PE-01-isis-1] sr-mp enable
[PE-01-isis-1] sr-mp protocol-is-is enable
[PE-01-isis-1] sr-mp local-block 100
[PE-01-isis-1] sr-mp locator S16_NODE
[PE-01-isis-1] quit
[PE-01] interface HundredGigE 1/0/1
[PE-01-HundredGigE1/0/1] ipv6 enable
[PE-01-HundredGigE1/0/1] ipv6 address 2001:db8::1:1/64
[PE-01-HundredGigE1/0/1] ipv6 mtu 1588
[PE-01-HundredGigE1/0/1] isis enable 1
[PE-01-HundredGigE1/0/1] isis circuit-level level-2
[PE-01-HundredGigE1/0/1] quit
# ========== Step 4: SRv6 TE Policy ==========
[PE-01] srv6
[PE-01-srv6] policy color 100 endpoint 2001:db8::3200:1:4::1
[PE-01-srv6-policy-100] candidate-path 10
[PE-01-srv6-policy-100-cp-10] type explicit
[PE-01-srv6-policy-100-cp-10] segment 1 endpoint 2001:db8::3200:1:2::1
[PE-01-srv6-policy-100-cp-10] segment 2 endpoint 2001:db8::3200:1:3::1
[PE-01-srv6-policy-100-cp-10] segment 3 endpoint 2001:db8::3200:1:4::1
[PE-01-srv6-policy-100-cp-10] preference 10
[PE-01-srv6-policy-100-cp-10] quit
# 自动计算备用路径(控制器下发或设备内生计算)
[PE-01-srv6-policy-100] candidate-path 20
[PE-01-srv6-policy-100-cp-20] type auto
[PE-01-srv6-policy-100-cp-20] preference 50
[PE-01-srv6-policy-100-cp-20] constraint bandwidth minimum 1000 # 最小带宽1Gbps
[PE-01-srv6-policy-100-cp-20] quit
[PE-01-srv6-policy-100] quit
[PE-01-srv6] quit
# ========== Step 5: BGP VPNv4绑定SRv6 TE ==========
[PE-01] bgp 65001
[PE-01-bgp-65001] router-id 10.1.1.1
[PE-01-bgp-65001] peer 10.2.2.2 as-number 65001
[PE-01-bgp-65001] peer 10.2.2.2 connect-interface LoopBack 0
[PE-01-bgp-65001] address-family ipv4
[PE-01-bgp-65001-ipv4] peer 10.2.2.2 enable
[PE-01-bgp-65001-ipv4] quit
[PE-01-bgp-65001] address-family vpnv4
[PE-01-bgp-65001-vpnv4] peer 10.2.2.2 enable
[PE-01-bgp-65001-vpnv4] srv6 te policy color 100 endpoint 2001:db8::3200:1:1::1
[PE-01-bgp-65001-vpnv4] quit
[PE-01-bgp-65001] quit
# ========== Step 6: VRF配置 ==========
[PE-01] vpn-instance CUSTOMER_A
[PE-01-vpnv4-CUSTOMER_A] vpn-instance-description "Customer A Production"
[PE-01-vpnv4-CUSTOMER_A] rd 10.1.1.1:100
[PE-01-vpnv4-CUSTOMER_A] ipv4-family
[PE-01-vpnv4-CUSTOMER_A-ipv4] route-target export 10.1.1.1:100
[PE-01-vpnv4-CUSTOMER_A-ipv4] route-target import 10.2.2.2:100
[PE-01-vpnv4-CUSTOMER_A-ipv4] quit
[PE-01-vpnv4-CUSTOMER_A] quit
# ========== Step 7: 验证命令 ==========
# display srv6 locator all
# display srv6 sid all
# display srv6 te policy all verbose
# display bgp vpnv4 routing-table vpn-instance CUSTOMER_A
# display isis peer
4.7 SRv6 TE Policy验证Python脚本
#!/usr/bin/env python3
"""
SRv6 TE Policy验证脚本 - 验证Policy状态、Segment路径、FRR切换
"""
import json
import re
from datetime import datetime
class SRv6PolicyVerifier:
def __init__(self):
self.policies = []
self.issues = []
def parse_policy_output(self, output):
"""解析display srv6 te policy verbose输出"""
policy = {}
# 提取Policy基本信息
color_match = re.search(r'Color:\s+(\d+)', output)
endpoint_match = re.search(r'Endpoint:\s+([\da-fA-F:]+)', output)
state_match = re.search(r'State:\s+(\w+)', output)
if color_match:
policy['color'] = int(color_match.group(1))
if endpoint_match:
policy['endpoint'] = endpoint_match.group(1)
if state_match:
policy['state'] = state_match.group(1)
# 提取Segment列表
segments = re.findall(r'Segment\s+(\d+):\s+([\da-fA-F:]+)', output)
policy['segments'] = [{'index': int(s[0]), 'sid': s[1]} for s in segments]
# 提取候选路径
cp_match = re.search(r'Candidate-Path-ID:\s+(\d+)', output)
if cp_match:
policy['active_candidate_path'] = int(cp_match.group(1))
self.policies.append(policy)
return policy
def verify_policy(self, policy):
"""验证单条Policy的配置正确性"""
checks = []
# 检查1:Policy状态
if policy.get('state') == 'Active':
checks.append({'check': 'Policy状态', 'result': 'PASS', 'detail': 'State=Active'})
else:
checks.append({'check': 'Policy状态', 'result': 'FAIL',
'detail': f"State={policy.get('state', 'Unknown')}, 期望Active"})
self.issues.append(f"Policy color={policy.get('color')} 非Active状态")
# 检查2:Segment数量(至少2个)
seg_count = len(policy.get('segments', []))
if seg_count >= 2:
checks.append({'check': 'Segment数量', 'result': 'PASS',
'detail': f'{seg_count}个Segment'})
else:
checks.append({'check': 'Segment数量', 'result': 'WARN',
'detail': f'仅{seg_count}个Segment,建议至少2个'})
# 检查3:最后一个Segment=Endpoint
if policy.get('segments'):
last_seg = policy['segments'][-1]['sid']
endpoint = policy.get('endpoint', '')
if last_seg == endpoint or endpoint in last_seg:
checks.append({'check': 'Endpoint匹配', 'result': 'PASS',
'detail': '最后一个Segment=Endpoint'})
else:
checks.append({'check': 'Endpoint匹配', 'result': 'FAIL',
'detail': f'最后Segment={last_seg}, Endpoint={endpoint}'})
# 检查4:SID格式合法(IPv6格式)
for seg in policy.get('segments', []):
sid = seg['sid']
if '::' in sid or re.match(r'^[0-9a-fA-F:]+$', sid):
pass # IPv6格式合法
else:
checks.append({'check': f"Segment {seg['index']} SID格式",
'result': 'FAIL', 'detail': f'SID={sid} 格式非法'})
return checks
def simulate_frr_switch(self, active_path, backup_path):
"""模拟FRR切换验证"""
return {
'scenario': '主路径Segment-1节点Down',
'active_path': active_path,
'backup_path': backup_path,
'expected_behavior': '切换至Candidate-Path 20(auto)',
'expected_switch_time': '<50ms (TI-LFA)',
'verification_command': 'display srv6 te policy verbose | include State'
}
def generate_report(self):
"""生成验证报告"""
all_checks = []
for policy in self.policies:
checks = self.verify_policy(policy)
all_checks.extend(checkes)
report = {
'timestamp': datetime.now().isoformat(),
'total_policies': len(self.policies),
'total_checks': len(all_checks),
'passed': sum(1 for c in all_checks if c['result'] == 'PASS'),
'failed': sum(1 for c in all_checks if c['result'] == 'FAIL'),
'warnings': sum(1 for c in all_checks if c['result'] == 'WARN'),
'issues': self.issues,
'policy_checks': all_checks
}
return report
# 使用示例:解析并验证
if __name__ == '__main__':
sample_output = """
Policy Name: policy-100
Color: 100
Endpoint: 2001:db8::3200:1:4::1
State: Active
Candidate Path:
Path ID: 10
Type: Explicit
State: Active
Segments:
1. 2001:db8::3200:1:2::1
2. 2001:db8::3200:1:3::1
3. 2001:db8::3200:1:4::1
"""
verifier = SRv6PolicyVerifier()
policy = verifier.parse_policy_output(sample_output)
report = verifier.generate_report()
print(f"验证报告: PASS={report['passed']}, FAIL={report['failed']}, WARN={report['warnings']}")
if report['issues']:
for issue in report['issues']:
print(f" ⚠ {issue}")
4.8 SRv6分阶段迁移策略Mermaid图

五、经验总结
| 序号 | 经验类别 | 经验内容 | 适用场景 |
|---|---|---|---|
| 1 | 演进策略 | SRv6演进必须采用双栈过渡,不可一刀切 | 协议演进 |
| 2 | SID规划 | SID空间规划需要预留充足,建议/96粒度 | SRv6规划 |
| 3 | 业务迁移 | 按业务类型分批迁移,新建业务优先走SRv6 | 业务迁移 |
| 4 | 性能影响 | SRv6 Header增加约40字节,需评估对MTU和吞吐量的影响 | 性能评估 |
| 5 | 控制器 | 保留原有PCE控制器,逐步过渡到SRv6控制器 | 控制面演进 |
| 6 | FRR保障 | SRv6 TE同样需要FRR保障,不可依赖IGP收敛 | 快速重路由 |
| 7 | 监控体系 | 建立SRv6专用的监控和告警体系 | 运维监控 |
| 8 | 人员培训 | 网工需要学习SRv6新知识和新技能 | 人员培训 |
| 9 | 回退方案 | 每个阶段的迁移都必须有回退方案 | 风险管理 |
| 10 | 文档更新 | SID规划、Policy映射等文档必须实时更新 | 文档管理 |
思考
- SRv6 TE的Header比MPLS大很多(约40字节vs 4字节Label),在带宽敏感的场景下如何优化?
- 如果现网设备不支持SRv6硬件加速,SRv6 TE的吞吐量瓶颈如何解决?
- SRv6与MPLS双栈运行时,BGP-LS(BGP Link-State)是否同时分发两套拓扑?如何管理?
下篇预告:第340篇:EVPN VXLAN 多活网关部署失败排错