Segment Routing TI-LFA FRR保护技术
简介
段路由SR(Segment Routing)是基于源路由理念而设计的在网络上转发数据包的一种协议,基于MPLS转发平面的SR称为SR-MPLS,基于IPv6转发平面的SR称为SRv6。Segment Routing的一大优势就是高效的TI-LFA(Topology-Independent Loop-free Alternate,拓扑无关无环路备份) FRR保护技术,TI-LFA FRR理论上支持任意拓扑的节点和链路保护,能够弥补传统隧道保护技术的不足。
在TI-LFA FRR技术之前,还有两个比较重要的技术:LFA(Loop-Free Alternate,无环路备份)和RLFA(Remote Loop-Free Alternate,远端无环路备份),我们一起来进行介绍。
LFA
LFA的原理是找到一个非主下一跳(即不是最短转发路径上的下一跳)的邻居节点,如果这个邻居节点到目的节点的最短路径不经过源节点,则这个邻居节点为无环备份下一跳。
LFA保护分为链路保护和节点保护两种场景。
链路保护
链路保护场景可用如下公式计算无环下一跳:
公式一:Distance_opt(N, D) < Distance_opt(N, S) + Distance_opt(S, D)
其中,N为邻居节点,D为目的节点,S为运行LFA计算的源节点。我们使用Distance_opt(X, Y) 来表示从节点X到节点Y的最短路径的距离(通常以开销来度量),例如,Distance_opt(N, D) 就表示从邻居节点N到目的节点D的最短路径距离。
以上公式的意思为:从邻居节点N到目的节点D的距离比从邻居节点N到S然后再从S到目的节点D的距离短,也即从邻居节点N到目的节点D的最短路径不会经过S。如果邻居节点满足上述公式,则该邻居满足链路保护条件,即流量不会从LFA节点重新回到S节点。
以图1-1为例,套用公式一进行计算。
Distance_opt(N, D) = 3 + 4 = 7 < Distance_opt(N, S) + Distance_opt(S, D) = 8 + 5 = 13(注:已经忽略掉P4-PE2这段公共链路。)
则邻居节点P2满足上述公式,P2可以作为P1-P4之间链路的保护节点。但是受限于拓扑,如果P4节点发生故障,P2无法提供保护。
节点保护
当发生节点故障时,流量需要从最短路径上S的下一跳节点绕行。所以如果邻居节点同时满足下述公式,则该邻居满足节点保护条件。
公式二:Distance_opt(N, D) < Distance_opt(N, E) + Distance_opt(E, D)
其中,N为邻居节点,D为目的节点,E为主下一跳节点。
以上公式的意思为:从邻居节点N到达目的节点D的距离比先到主下一跳节点E然后再从E到目的节点D的距离短,也即从邻居节点N到目的节点D的最短路径不会经过故障节点E。这种情况下,邻居节点N可以作为节点故障时的LFA节点。
以图1-2为例,套用公式一和公式二进行计算。
Distance_opt(N, D) = 1 + 1 + 1 = 3 < Distance_opt(N, S) + Distance_opt(S, D) = 2 + 2 = 4
Distance_opt(N, D) = 1 + 1 + 1 = 3 < Distance_opt(N, E) + Distance_opt(E, D) = 3 + 1 = 4
则邻居节点PE2满足上述两个公式,PE2可以作为P1的保护节点。
由于链路保护只需要遵循公式一,而节点保护需要同时遵循公式一和公式二,所以满足节点保护的LFA节点均能成为链路故障保护LFA节点,但链路故障保护LFA节点不一定能成为节点保护LFA节点。
RLFA
虽然LFA在网格状拓扑中通常能够获得较好的覆盖范围,但是针对环网,LFA的覆盖范围很低。为了提升保护范围,产生了RLFA技术,用于提升FRR保护范围。RLFA将LFA节点的计算范围扩大到了远端节点,而不仅限于邻居节点,从而提高了LFA计算的成功概率。
RLFA的基本原理是在远端找到一个LFA节点(通常称为PQ节点),这个PQ节点需要满足两个条件:
- PQ节点从RLFA计算源节点(也即受保护链路的源端节点)通过故障收敛前的最短路径(Pre-convergence Shortest Path)可达,且路径(包括ECMP路径)不经过受保护链路。
- 从该节点可以通过最短路径到达受保护链路的对端节点,且路径不经过受保护链路。
RLFA保护也分为链路保护和节点保护两种场景。
相关概念
为了计算PQ节点,需要引入一些相关概念,具体如表1-1所示。
概念 |
解释 |
---|---|
P空间 |
以保护链路源端为根节点建立SPF树,所有从根节点不经过保护链路可达的节点集合称为P空间。 |
扩展P空间 |
以保护链路源端的所有邻居为根节点分别建立SPF树,所有从根节点不经过保护链路可达的节点集合称为扩展P空间。 说明:
华为设备在计算RLFA FRR备份路径时,默认计算扩展P空间。 |
Q空间 |
以保护链路末端为根节点建立反向SPF树,所有从根节点不经过保护链路可达的节点集合称为Q空间。 |
P节点 |
P空间或者扩展P空间的节点称为P节点。 |
Q节点 |
Q空间的节点称为Q节点。 |
PQ节点 |
PQ节点是指既在(扩展)P空间又在Q空间的节点,PQ节点会作为保护隧道的目的端。 |
链路保护
为了方便理解,使用上面LFA链路保护失效的拓扑来介绍这个PQ节点的计算过程,如图1-5所示。
P节点的计算公式如下:
公式三:Distance_opt(N, P) < Distance_opt(N, S) + Distance_opt(S, P)
其中,N为邻居节点,S为运行RLFA计算的源节点,即从N到P的最短路径不会绕回S然后继续通过保护链路到达P节点。
在图1-5中,P1是RLFA计算的源节点(S),它有三个邻居节点,分别是PE1、P2和P4,其中P4需要经过故障链路,所以首先排除。
- 以邻居节点PE1为根(N),计算其不经过故障链路可达的节点,为{PE1}。详细计算过程如下:
- 首先假设PE1为P,由于PE1本身也是N,所以Distance_opt(N, P)等于0,肯定满足条件;
- 然后假设P1为P,由于P1本身也是S,所以Distance_opt(N, P)等于Distance_opt(N, S),而Distance_opt(S, P)等于0,不满足条件;
- 然后假设P2为P,则Distance_opt(N, P)= 1 + 8 = 9;Distance_opt(N, S) + Distance_opt(S, P)= 1 + 8 = 9,也不满足条件;
- P3、P4和PE2的情况与P2类似,均不满足条件。
- 以邻居节点P2为根(N),计算其不经过故障链路可达的节点,为{P2,P3}。详细计算过程如下:
- 首先假设PE1为P,则Distance_opt(N, P)= 8 + 1 = 9,Distance_opt(N, S) + Distance_opt(S, P)= 8 + 1 = 9,不满足条件。
- 然后假设P1为P,由于P1本身也是S,所以Distance_opt(S, P)等于0。Distance_opt(N, P)=8,Distance_opt(N, S) + Distance_opt(S, P)=8,不满足条件。
- 然后假设P2为P,由于P2本身也是N,所以Distance_opt(N, P)等于0,肯定满足条件。
- 然后假设P3为P,则Distance_opt(N, P)= 3,Distance_opt(N, S) + Distance_opt(S, P)=8 + 11 = 19,满足条件。
- 然后假设P4为P,则Distance_opt(N, P)= 3 + 12 = 15,Distance_opt(N, S) + Distance_opt(S, P)=8 + 5 = 13,不满足条件。
- PE2的情况与P4类似,也不满足条件。
综合以上所有邻居的计算结果,得到扩展P空间为{PE1,P2,P3}。
通过以上分析,可以得知,邻居节点一定是P节点。
RLFA计算的源节点S(图1-5中的P1)做不了P节点。因为S已经感知到S-E的链路故障,计算P节点是帮助S把数据包转到目的节点D,如果S是P节点,则数据包在本节点循环,无法发送出去。另外由于邻居节点一定是P节点,且RLFA选择P节点时会选择离S最远的节点,所以即便S本身是P节点,也肯定不会使用。综合以上,公式三就限定了源节点S做不了P节点。
Q节点的计算公式如下:
公式四:Distance_opt(Q, D) < Distance_opt(Q, S) + Distance_opt(S, D)
其中,D为最短生成树算法中的目的节点,S为运行RLFA计算的源节点,即从节点Q到节点D的最短路径不会绕回节点S然后再从节点S到达节点D。
此处需要注意,考虑到为每一个目的节点计算Q空间的可扩展性问题,此处计算Q空间时对应的目的节点是受保护链路的对端节点E(P4)而非原始业务真正的目的节点PE2。
在图1-6中,以P4为根,进行计算其不经过故障链路可达的节点,得到Q空间为{P3,P4,PE2}。详细计算过程如下:
- 首先假设PE2为Q,Distance_opt(Q, D)=1,Distance_opt(Q, S) + Distance_opt(S, D)= 6 + 5 = 11,满足条件。
- 然后假设P4为Q,由于P4本身也是D,所以Distance_opt(Q, D)=0,Distance_opt(Q, S) + Distance_opt(S, D)= 5 + 5 = 10,满足条件。
- 然后假设P3为Q,Distance_opt(Q, D)=12,Distance_opt(Q, S) + Distance_opt(S, D)= 11 + 5 = 16,满足条件。
- 然后假设P2为Q,Distance_opt(Q, D)=12 + 3 = 15,Distance_opt(Q, S) + Distance_opt(S, D)= 8 + 5 = 13,不满足条件。
- PE1和P1的情况与P2类似,也不满足条件。
既在扩展P空间又在Q空间的节点,只有P3,所以PQ节点是P3。
PQ节点P3满足从P2(源节点的邻居节点)到P3不经过故障点和从P3到目的节点P4不经过故障点的两个条件。所以计算出PQ节点后,RLFA在P1与PQ节点P3之间建立一条隧道(例如LDP隧道),同时指定该隧道的下一跳为P2。这条隧道作为虚拟的RLFA备份下一跳预安装在FIB表,当主下一跳故障的时候,P1快速切换到备份下一跳,从而实现FRR保护。
RLFA作为LFA的一种增强,补齐了一些LFA无法满足的场景,但是该技术依然受限于拓扑。因为RLFA算法要求网络中必须存在PQ节点,算法才能计算成功。还是上面的这个拓扑,如果再改一下Cost,将P2到P3的链路Cost调整为30,如图1-7所示。此时Distance_opt(N, P)= 30,Distance_opt(N, S) + Distance_opt(S, P)=8 + 5 + 12 = 25,不满足公式三,所以P2到P3需要经过故障链路,P3不再是P节点,也不再是PQ节点,此时RLFA就失效了。
节点保护
使用上面LFA节点保护失效的拓扑来介绍这个PQ节点的计算过程,如图1-8所示。
P节点的计算公式如下:
公式五:Distance_opt(N, P) < Distance_opt(N, E) + Distance_opt(E, P)
其中,N为邻居节点,E为主下一跳节点P1,也是被保护节点,即从N到P的最短路径不会绕回主下一跳节点然后继续通过保护节点到达P节点。
在图1-8中,PE1是RLFA计算的源节点(S),它有2个邻居节点,分别是P1和PE2,其中P1是被保护节点,所以首先排除。
- 首先假设PE2为P,由于PE2本身也是N,所以Distance_opt(N, P)等于0,肯定满足条件;
- 然后假设P4为P,则Distance_opt(N, P)= 1,Distance_opt(N, E) + Distance_opt(E, P)= 3 + 4 = 7,满足条件;
- 然后假设P3为P,则Distance_opt(N, P)= 1 + 1 = 2;Distance_opt(N, E) + Distance_opt(E, P)= 3 + 5 = 8,满足条件;
- 然后假设P2为P,则Distance_opt(N, P)= 2 + 1 + 1 = 4;Distance_opt(N, E) + Distance_opt(E, P)= 3 + 1 = 4,不满足条件;
- P1是故障节点,不满足条件;
- PE1是源节点S,虽然Distance_opt(N, P)= 2;Distance_opt(N, E) + Distance_opt(E, P)= 3 + 1 = 4,可以满足公式五,但是源节点作为P节点无意义,所以不考虑。
Q节点的计算公式如下:
公式六:Distance_opt(Q, D) < Distance_opt(Q, E) + Distance_opt(E, D)
其中,D为最短生成树算法中的目的节点,E为主下一跳节点P1,也是被保护节点,即从节点Q到节点D的最短路径不会绕回主下一跳节点E然后再从E到达节点D。
在图1-9中,以P4为根,进行计算其不经过故障链路可达的节点,得到Q空间为{P3,P4,PE2}。详细计算过程如下:
- 首先假设PE1为Q,Distance_opt(Q, D)=2 + 1 + 1 + 4 = 8,Distance_opt(Q, E) + Distance_opt(E, D)= 1 + 1 = 2,不满足条件。
- P1是故障节点,不满足条件;
- 然后假设P2为Q,P2本身也是目的节点D,所以Distance_opt(Q, D)=0,肯定满足条件。
- 然后假设P3为Q,Distance_opt(Q, D)=3,Distance_opt(Q, E) + Distance_opt(E, D)= 5 + 1 = 6,满足条件。
- 然后假设P4为Q,Distance_opt(Q, D)=1 + 4 = 5,Distance_opt(Q, E) + Distance_opt(E, D)= 4 + 1 = 5,不满足条件。
- 然后假设PE2为Q,Distance_opt(Q, D)=1 + 1 + 4 = 6,Distance_opt(Q, E) + Distance_opt(E, D)= 3 + 1 = 4,不满足条件。
既在扩展P空间又在Q空间的节点,只有P3,所以PQ节点是P3。
PQ节点P3满足从PE2(源节点的邻居节点)到P3不经过故障点和从P3到目的节点P2不经过故障点的两个条件。所以计算出PQ节点后,RLFA在PE1与PQ节点P3之间建立一条隧道(例如LDP隧道),同时指定该隧道的下一跳为PE2。这条隧道作为虚拟的RLFA备份下一跳预安装在FIB表,当主下一跳故障的时候,PE1快速切换到备份下一跳,从而实现FRR保护。
RLFA节点保护也有失效场景,如图1-10所示,如果将P2到P3之间的开销改为10。此时以P3作为Q进行计算,Distance_opt(Q, D)= 10,Distance_opt(Q, E) + Distance_opt(E, D)= 5 + 1 = 6,不满足公式六,所以P3到P2需要经过故障链路,P3不再是Q节点,也不再是PQ节点,此时RLFA就失效了。
除了无法找到PQ节点的问题,RLFA在应用时还需要创建LDP隧道,这引入了大量的保护隧道状态。此外,无论LFA还是RLFA,都是基于故障发生之前的IGP LSDB(Link State Database,链路状态数据库)计算最短路径,但这个备份路径可能并不是IGP收敛之后重路由的最短路径,因此可能还需要再次将流量从备份路径切换回重路由收敛路径。
TI-LFA
为了解决上述RLFA的问题,出现了基于Segment Routing的TI-LFA FRR技术,TI-LFA FRR可以在网络拓扑中不存在PQ节点的情况下,实现任意拓扑的保护。TI-LFA FRR完全继承了RLFA FRR计算扩展P空间和Q空间的算法,上文的公式三到公式六完全适用于TI-LFA FRR场景。华为设备在计算TI-LFA FRR备份路径时,也默认计算扩展P空间。
TI-LFA FRR的解决思路
如图1-12所示的SRv6场景,TI-LFA FRR也可以为SRv6提供链路及节点的保护。
TI-LFA FRR的详细原理
如图1-13所示的SR-MPLS场景,PE1为源节点,PE3为目的节点,链路中间的数字表示cost值。假设P1节点为故障点。
TI-LFA流量保护也分为链路保护和节点保护。
链路保护:当需要保护的对象是经过特定链路的流量时,流量保护类型为链路保护。
节点保护:当需要保护的对象是经过特定设备的流量时,流量保护类型为节点保护。节点保护优先级高于链路保护。
下面以节点保护为例介绍TI-LFA的实现过程。如图1-13所示,假设流量路径为:PE1→P1→P3→PE3,为避免P1节点故障导致流量丢失,TI-LFA会计算出扩展P空间,Q空间,P1故障收敛后(Post-convergence)最短路径树,以及备份出接口和Repair List,最终生成备份转发表项。
计算扩展P空间:以PE1的邻居PE2为根计算,得到{PE2,P2}。
计算Q空间:以P3为根计算,得到{P3,P4,PE3,PE4}。
计算收敛后最短路径树:计算主下一跳故障收敛后的最短路径树,排除主下一跳计算最短路径树。
- 计算备份出接口和Repair List。
备份出接口:在某些场景下,扩展P空间和Q空间既没有交集,也没有直连的邻居。这种情况下备份出接口为收敛后下一跳出接口。
Repair List:Repair List是一个约束路径,用来指示如何到达Q节点,Repair List由“P节点标签+P到Q路径上的邻接标签”组成。
在图1-13中,Repair List为P2的节点标签100,加上P2到P4的邻接标签9204。
虽然理论上所有的P节点和所有的Q节点都可以在Repair List中使用,但是实际上,设备为了减少Repair List标签栈中标签的数量,一般会选择离源节点最远的P节点和离源节点最近的Q节点。
另外在SRv6场景,由于P到Q路径上的End.X SID是全局可见且唯一的,所以为了进一步减少Repair List标签栈中标签的数量,Repair List中也可以不带P节点SID,仅使用P到Q路径上的End.X SID即可,具体如图1-12所示。
- 优选Repair节点发布的Node SID。
- 优选Repair节点发布的Prefix SID,SID越小越优先。
- 不支持SR的节点不能作为Repair节点,不发布Prefix SID/Node SID的节点不能作为Repair节点。
TI-LFA FRR的转发流程
TI-LFA备份路径计算完成之后,如果主路径发生故障,就可以根据备份路径进行转发,避免流量丢失。
如图1-14所示,PE1为源节点,PE3为目的节点,流量路径为PE1→P1→P3→PE3,报文携带PE3的Prefix SID 16100。主下一跳P1故障,触发TI-LFA FRR切换到备路径。
TI-LFA FRR备份路径详细转发流程描述如下:
- PE1根据Repair List封装标签栈,最外层封装P2的节点标签100,然后就封装P2到P4的邻接标签9204。
- PE2收到报文后,根据最外层标签100查找标签转发表,将报文转发给P2。
- P2收到报文后,根据最外层标签查找标签转发表,由于P2是该标签的Egress节点,弹出标签100以后,露出标签9204。9204是P2自己分配的邻接SID,P2根据标签9204找到对应出接口,将标签9204弹出,然后将剩余报文转发到P4。
- P4收到报文后,根据最外层标签16100查找标签转发表,将报文转发给P3。
- P3收到报文后,根据最外层标签16100查找标签转发表,将报文转发给PE3。
- PE3收到报文后,根据最外层标签查找标签转发表,确定16100是本机标签,所以PE3将标签弹出。16100是栈底标签,标签弹出后,PE3根据IP报文头信息对报文做下一步处理。
TI-LFA FRR的配置验证
下面以图1-15的拓扑为例,介绍TI-LFA的配置过程。该网络使能IS-IS,同时按照图中标示调整IS-IS链路Cost。本例使用Node SID,利用静态显式路径建立从PE1到PE2的SR-MPLS TE隧道,隧道路径是:PE1->P1->P4->PE2。
SR-MPLS TE隧道使用Node SID时,是松散形式,这种形式可以支持TI-LFA FRR功能。通过在P1上配置TI-LFA FRR局部保护功能,在P1和P4之间链路故障时,数据流量可以快速切换到备份路径:PE1->P1->P2->P3->P4->PE2。
本例中interface1、interface2、interface3分别代表GE0/1/0、GE0/2/0、GE0/3/0。
其中,P1上的配置如下:
# sysname P1 # mpls lsr-id 2.2.2.9 # mpls mpls te # segment-routing # isis 1 is-level level-1 cost-style wide network-entity 10.0000.0000.0002.00 avoid-microloop frr-protected avoid-microloop frr-protected rib-update-delay 5000 segment-routing mpls segment-routing global-block 16000 23999 avoid-microloop segment-routing avoid-microloop segment-routing rib-update-delay 10000 frr loop-free-alternate level-1 ti-lfa level-1 # interface GigabitEthernet0/1/0 undo shutdown ip address 10.1.1.2 255.255.255.0 isis enable 1 # interface GigabitEthernet0/2/0 undo shutdown ip address 10.2.1.1 255.255.255.0 isis enable 1 # interface GigabitEthernet0/3/0 undo shutdown ip address 10.5.1.1 255.255.255.0 isis enable 1 # interface LoopBack1 ip address 2.2.2.9 255.255.255.255 isis enable 1 isis prefix-sid index 20 # return
配置完成后,在P1上执行display ip routing-table命令,可以看到IP路由表信息。
<P1> display ip routing-table Route Flags: R - relay, D - download to fib, T - to vpn-instance, B - black hole route ------------------------------------------------------------------------------ Routing Table : _public_ Destinations : 22 Routes : 22 Destination/Mask Proto Pre Cost Flags NextHop Interface 1.1.1.9/32 ISIS-L1 15 1 D 10.1.1.1 GigabitEthernet0/1/0 2.2.2.9/32 Direct 0 0 D 127.0.0.1 LoopBack1 3.3.3.9/32 ISIS-L1 15 8 D 10.2.1.2 GigabitEthernet0/2/0 4.4.4.9/32 ISIS-L1 15 17 D 10.5.1.2 GigabitEthernet0/3/0 5.5.5.9/32 ISIS-L1 15 5 D 10.5.1.2 GigabitEthernet0/3/0 6.6.6.9/32 ISIS-L1 15 6 D 10.5.1.2 GigabitEthernet0/3/0 10.1.1.0/24 Direct 0 0 D 10.1.1.2 GigabitEthernet0/1/0 10.1.1.2/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/1/0 10.1.1.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/1/0 10.2.1.0/24 Direct 0 0 D 10.2.1.1 GigabitEthernet0/2/0 10.2.1.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/2/0 10.2.1.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/2/0 10.3.1.0/24 ISIS-L1 15 38 D 10.2.1.2 GigabitEthernet0/2/0 10.4.1.0/24 ISIS-L1 15 17 D 10.5.1.2 GigabitEthernet0/3/0 10.5.1.0/24 Direct 0 0 D 10.5.1.1 GigabitEthernet0/3/0 10.5.1.1/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/3/0 10.5.1.255/32 Direct 0 0 D 127.0.0.1 GigabitEthernet0/3/0 10.6.1.0/24 ISIS-L1 15 6 D 10.5.1.2 GigabitEthernet0/3/0 127.0.0.0/8 Direct 0 0 D 127.0.0.1 InLoopBack0 127.0.0.1/32 Direct 0 0 D 127.0.0.1 InLoopBack0 127.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0 255.255.255.255/32 Direct 0 0 D 127.0.0.1 InLoopBack0
在P1上执行display isis { ti-lfa-node [ process-id ] | [ process-id ] ti-lfa-node } [ level-1 | level-2 ] [ systemidsystemid ]命令,可以看到节点的TI-LFA信息,包括P节点的前缀、出接口、下一跳、PQ节点、从P到Q的标签栈和扩展策略等信息。
<HUAWEI> display isis ti-lfa-node level-1 Topology Independent LFA Node Table for ISIS(1) ----------------------------------------------- ISIS(1) Level-1 Topology Independent LFA Node Table DestNode : 0000.0000.0003 NextNearPrefix : 4.4.4.9 PNode : 0000.0000.0004 QNode : 0000.0000.0003 PInterface : GE0/3/0 PrimaryBkpNbr : 0000.0000.0005 Protect : LINK AdjLabelStack (P->Q) : 48060 ExtendPolicy : - SRGB : {16000, 23999} AdjLabel : (0000.0000.0002-00, 48060) (0000.0000.0004-00, 48061) DestNode : 0000.0000.0004 NextNearPrefix : - PNode : 0000.0000.0003 QNode : 0000.0000.0004 PInterface : GE0/2/0 PrimaryBkpNbr : 0000.0000.0003 Protect : LINKNODE AdjLabelStack (P->Q) : 48061 ExtendPolicy : - SRGB : {16000, 23999} AdjLabel : (0000.0000.0003-00, 48060) (0000.0000.0005-00, 48061) DestNode : 0000.0000.0005 NextNearPrefix : - PNode : 0000.0000.0003 QNode : 0000.0000.0004 PInterface : GE0/2/0 PrimaryBkpNbr : 0000.0000.0003 Protect : LINK AdjLabelStack (P->Q) : 48061 ExtendPolicy : - SRGB : {16000, 23999} AdjLabel : (0000.0000.0006-00, 48061) (0000.0000.0002-00, 48060) (0000.0000.0004-00, 48062) DestNode : 0000.0000.0006 NextNearPrefix : - PNode : 0000.0000.0003 QNode : 0000.0000.0004 PInterface : GE0/2/0 PrimaryBkpNbr : 0000.0000.0003 Protect : LINK AdjLabelStack (P->Q) : 48061 ExtendPolicy : - SRGB : {16000, 23999} AdjLabel : (0000.0000.0005-00, 48060) DestNode : ffff.0000.0000 NextNearPrefix : - PNode : 0000.0000.0003 QNode : 0000.0000.0004 PInterface : GE0/2/0 PrimaryBkpNbr : 0000.0000.0003 Protect : LINK AdjLabelStack (P->Q) : 48061 ExtendPolicy : - SRGB : - AdjLabel : - DestNode : ffff.0100.0000 NextNearPrefix : - PNode : 0000.0000.0005 QNode : 0000.0000.0005 PInterface : GE0/3/0 PrimaryBkpNbr : 0000.0000.0005 Protect : LINKNODE AdjLabelStack (P->Q) : - ExtendPolicy : - SRGB : - AdjLabel : - DestNode : ffff.0200.0000 NextNearPrefix : - PNode : 0000.0000.0003 QNode : 0000.0000.0004 PInterface : GE0/2/0 PrimaryBkpNbr : 0000.0000.0003 Protect : LINKNODE AdjLabelStack (P->Q) : 48061 ExtendPolicy : - SRGB : - AdjLabel : -
从以上显示信息可以看出,对于节点P4(DestNode: 0000.0000.0005),P节点是P2(PNode: 0000.0000.0003),Q节点是P3(QNode: 0000.0000.0004),出接口是GE0/2/0,保护类型是链路保护(Protect: LINK),P->Q的邻接标签栈(AdjLabelStack)是48061。
在P1上执行display isis route [ level-1 | level-2 ] [ process-id ] [ verbose ]命令,可以看到IS-IS TI-LFA FRR备份表项信息。
<P1> display isis route level-1 verbose Route information for ISIS(1) ----------------------------- ISIS(1) Level-1 Forwarding Table -------------------------------- IPV4 Dest : 1.1.1.9/32 Int. Cost : 1 Ext. Cost : NULL Admin Tag : - Src Count : 1 Flags : A/-/-/- Priority : Medium Age : 00:10:03 NextHop : Interface : ExitIndex : 10.1.1.1 GE0/1/0 0x0000000e Prefix-sid : 16010 Weight : 0 Flags : -/N/-/-/-/-/A/- SR NextHop : Interface : OutLabel : 10.1.1.1 GE0/1/0 3 IPV4 Dest : 2.2.2.9/32 Int. Cost : 0 Ext. Cost : NULL Admin Tag : - Src Count : 1 Flags : D/-/L/- Priority : - Age : 06:33:27 NextHop : Interface : ExitIndex : Direct Loop1 0x00000000 Prefix-sid : 16020 Weight : 0 Flags : -/N/-/-/-/-/A/L SR NextHop : Interface : OutLabel : Direct Loop1 - IPV4 Dest : 3.3.3.9/32 Int. Cost : 8 Ext. Cost : NULL Admin Tag : - Src Count : 1 Flags : A/-/-/- Priority : Medium Age : 00:09:28 NextHop : Interface : ExitIndex : 10.2.1.2 GE0/2/0 0x0000000a TI-LFA: Interface : GE0/3/0 NextHop : 10.5.1.2 LsIndex : 0x00000001 ProtectType: L Backup Label Stack (Top -> Bottom): {16040, 48060} Prefix-sid : 16030 Weight : 0 Flags : -/N/-/-/-/-/A/- SR NextHop : Interface : OutLabel : 10.2.1.2 GE0/2/0 3 TI-LFA: Interface : GE0/3/0 NextHop : 10.5.1.2 LsIndex : 0x00000001 ProtectType: L Backup Label Stack (Top -> Bottom): {16040, 48060} IPV4 Dest : 4.4.4.9/32 Int. Cost : 17 Ext. Cost : NULL Admin Tag : - Src Count : 1 Flags : A/-/-/- Priority : Medium Age : 00:09:28 NextHop : Interface : ExitIndex : 10.5.1.2 GE0/3/0 0x00000007 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: N Backup Label Stack (Top -> Bottom): {48061} Prefix-sid : 16040 Weight : 0 Flags : -/N/-/-/-/-/A/- SR NextHop : Interface : OutLabel : 10.5.1.2 GE0/3/0 16040 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: N Backup Label Stack (Top -> Bottom): {48061} IPV4 Dest : 5.5.5.9/32 Int. Cost : 5 Ext. Cost : NULL Admin Tag : - Src Count : 1 Flags : A/-/-/- Priority : Medium Age : 00:09:28 NextHop : Interface : ExitIndex : 10.5.1.2 GE0/3/0 0x00000007 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: L Backup Label Stack (Top -> Bottom): {48061} Prefix-sid : 16050 Weight : 0 Flags : -/N/-/-/-/-/A/- SR NextHop : Interface : OutLabel : 10.5.1.2 GE0/3/0 3 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: L Backup Label Stack (Top -> Bottom): {48061} IPV4 Dest : 6.6.6.9/32 Int. Cost : 6 Ext. Cost : NULL Admin Tag : - Src Count : 1 Flags : A/-/-/- Priority : Medium Age : 00:09:28 NextHop : Interface : ExitIndex : 10.5.1.2 GE0/3/0 0x00000007 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: L Backup Label Stack (Top -> Bottom): {48061} Prefix-sid : 16060 Weight : 0 Flags : -/N/-/-/-/-/A/- SR NextHop : Interface : OutLabel : 10.5.1.2 GE0/3/0 16060 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: L Backup Label Stack (Top -> Bottom): {48061} IPV4 Dest : 10.1.1.0/24 Int. Cost : 1 Ext. Cost : NULL Admin Tag : - Src Count : 2 Flags : D/-/L/- Priority : - Age : 00:10:03 NextHop : Interface : ExitIndex : Direct GE0/1/0 0x00000000 IPV4 Dest : 10.2.1.0/24 Int. Cost : 8 Ext. Cost : NULL Admin Tag : - Src Count : 2 Flags : D/-/L/- Priority : - Age : 06:12:37 NextHop : Interface : ExitIndex : Direct GE0/2/0 0x00000000 IPV4 Dest : 10.3.1.0/24 Int. Cost : 38 Ext. Cost : NULL Admin Tag : - Src Count : 2 Flags : A/-/-/- Priority : Low Age : 00:09:28 NextHop : Interface : ExitIndex : 10.2.1.2 GE0/2/0 0x0000000a TI-LFA: Interface : GE0/3/0 NextHop : 10.5.1.2 LsIndex : -- ProtectType: N Backup Label Stack (Top -> Bottom): {} IPV4 Dest : 10.4.1.0/24 Int. Cost : 17 Ext. Cost : NULL Admin Tag : - Src Count : 2 Flags : A/-/-/- Priority : Low Age : 00:09:26 NextHop : Interface : ExitIndex : 10.5.1.2 GE0/3/0 0x00000007 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: N Backup Label Stack (Top -> Bottom): {48061} IPV4 Dest : 10.5.1.0/24 Int. Cost : 5 Ext. Cost : NULL Admin Tag : - Src Count : 2 Flags : D/-/L/- Priority : - Age : 06:12:47 NextHop : Interface : ExitIndex : Direct GE0/3/0 0x00000000 IPV4 Dest : 10.6.1.0/24 Int. Cost : 6 Ext. Cost : NULL Admin Tag : - Src Count : 2 Flags : A/-/-/- Priority : Low Age : 00:09:26 NextHop : Interface : ExitIndex : 10.5.1.2 GE0/3/0 0x00000007 TI-LFA: Interface : GE0/2/0 NextHop : 10.2.1.2 LsIndex : 0x00000002 ProtectType: L Backup Label Stack (Top -> Bottom): {48061} Flags: D-Direct, A-Added to URT, L-Advertised in LSPs, S-IGP Shortcut, U-Up/Down Bit Set, LP-Local Prefix-Sid Protect Type: L-Link Protect, N-Node Protect
从以上显示信息可以看出,对于P1-P4的链路保护TI-LFA表项已经生成。
总结
本文主要讲解了LFA、RLFA、TI-LFA的基本原理,以及几个技术的演进过程。
综合前面的描述可以看出,基于Segment Routing的TI-LFA FRR理论上可以满足100%拓扑的故障保护,而且还具有如下优势:
- TI-LFA备份路径和网络故障收敛后的最短路径在大多数情况下都是一致的,这减少了转发路径的切换次数。TI-LFA算法是基于收敛后最短路径计算的,只有在少数链路故障和节点故障收敛后路径不一致的情况下才会出现备份路径和收敛后路径不一致的情况。
- TI-LFA备份路径依赖IGP SR实现,这样减少了为部署可靠性技术而额外引入的协议。
- TI-LFA利用已有的节点或者邻接的SID建立备份路径,不需要维护额外的转发状态。
当前SR-MPLS和SRv6均支持TI-LFA FRR保护技术,二者的实现原理一致。
- 对于SR-MPLS,TI-LFA FRR同时适用于SR-MPLS BE和松散形式SR-MPLS TE隧道/Policy场景。
- 对于SRv6,TI-LFA FRR同时适用于SRv6 BE和松散形式SRv6 TE Policy场景。正常情况下,SRv6 BE报文封装本身不需要携带SRH信息,但是在TI-LFA FRR场景,为了封装Repair List信息,SRv6 BE报文封装也需要携带SRH信息。