第339篇:SRv6 TE 与现有 MPLS 网络的平滑演进

关键词:SRv6、SRv6 TE、MPLS、平滑演进、双栈、Service Function Chaining、华为NE/CE系列


一、案例背景

某省级运营商的骨干网已稳定运行MPLS TE(流量工程)多年,承载了包括MPLS L3VPN、IP-LAN、Carrier Ethernet等多种业务。随着5G、云计算等新兴业务的快速发展,现有MPLS TE网络面临以下挑战:

  1. 扩展性不足:MPLS TE的信令协议(RSVP-TE)配置复杂,大规模部署维护成本高。
  2. 功能受限:MPLS TE不支持灵活的服务链(Service Function Chaining),难以满足云服务编排需求。
  3. IPv6演进压力:监管要求支持IPv6,MPLS本身不原生支持IPv6。
  4. 控制器依赖:现有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图

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映射等文档必须实时更新 文档管理

思考

  1. SRv6 TE的Header比MPLS大很多(约40字节vs 4字节Label),在带宽敏感的场景下如何优化?
  2. 如果现网设备不支持SRv6硬件加速,SRv6 TE的吞吐量瓶颈如何解决?
  3. SRv6与MPLS双栈运行时,BGP-LS(BGP Link-State)是否同时分发两套拓扑?如何管理?

下篇预告:第340篇:EVPN VXLAN 多活网关部署失败排错