书籍来源:《SRv6网络编程:开启IP网络新时代》
这本书已经出了很多年了,但多年之后因为工作需要再来读一遍,除了温习之外,发现自己学到了更多的知识。一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:SRv6网络编程自学系列 | 汇总_COCOgsta的博客-CSDN博客
本节介绍SRv6网络发生故障时和故障恢复后产生的微环现象,以及如何解决这些微环问题。
由于收敛时间和顺序不同,不同设备会存在短时间的不同步,可能存在毫秒级到秒级的数据库不同步暂态,可能会导致转发路由的不一致,导致转发环路,这种暂态的环路被称为Microloop(微环)。
Segment Routing使得我们可以采用一种对网络影响比较小的方式来消除网络中潜在的环路。它的原理是如果网络拓扑变化引发环路,网络节点就通过创建一个无环的SRv6 Segment List,引导流量转发到目的地址,等待网络节点全部完成收敛以后再回退到正常转发状态。
本地正切微环指的是紧邻故障节点的节点收敛后引发的环路。如图6-16所示,全网节点都部署SRv6 TI-LFA,当节点B发生故障的时候,节点A针对目的地址C的收敛过程如下。
① 节点A感知到故障,进入TI-LFA的快速重路由切换流程,向报文插入SRv6 Repair Segment List <5::1>,将报文转向TI-LFA计算的PQ节点E。因此报文会先转发到下一跳节点D。此时Segment List中的SID为<5::1,3::1>。
② 当节点A完成到目的地址节点C的路由收敛,则直接查找节点C的路由,将报文转发到下一跳节点D,此时不再携带SRv6 Repair Segment List,而是直接基于目的地址3::1进行转发。
③ 如果此时节点D还未完成收敛,当节点A向节点D转发报文时,节点D的转发表中到节点C的路由下一跳还是节点A,这样就在节点A和节点D之间形成了环路。
图6-16 SRv6本地正切微环
本地正切微环发生在节点A完成收敛、退出TI-LFA流程、变成正常转发,而网络中其他节点还未完成收敛的时候。因此解决这个场景下的环路问题,只需要让节点A延时收敛。只需要维持一段时间按照TI-LFA路径转发,待网络中其他节点完成收敛以后再退出TI-LFA,正常收敛,即可避免正切微环。
如图6-17所示,部署正切防微环后的收敛流程如下。
① 节点A感知到故障,进入TI-LFA流程,报文沿着备份路径转发,下一跳为节点D,并封装SRv6 Repair Segment List <5::1>。
② 节点A启动一个定时器T1。在T1期间,节点A不响应拓扑变化,转发表不变,报文依旧按照TI-LFA策略转发。网络中其他节点正常收敛。
③ 节点 A 的定时器 T1超时,此时网络中其他节点都已经完成收敛,节点 A 也正常收敛,退出 TI-LFA 流程,按照正常收敛后的路径转发报文。
该方案只能解决PLR的正切微环问题。此外,该方案只限于单点故障场景,如果是多点故障场景,TI-LFA备份路径可能也会受影响。
图6-17 SRv6本地正切防微环
微环不但可能在路径正切时产生,也可能在故障恢复后、路径回切时出现。
① 节点A将报文按照路径A→B→C→E→F发送到目的节点F。当B-C链路发生故障时,节点A会将报文按照重新收敛之后的路径A→B→D→E→F发送到目的节点F。
② 节点B和节点C之间的链路故障恢复后,假设节点D率先完成收敛。
③ 节点A将报文转发给节点B,由于节点B未完成收敛,依然按照图6-18中故障恢复前的路径转发,转发给节点D。
④ 节点D已经完成收敛,所以节点D按照故障恢复后的路径转发到节点B,这样就在节点B和节点D之间形成了环路。
为了消除回切过程中潜在的环路问题,节点D需要能够收敛到一条无环路径。
如图6-19所示,节点D感知到B-C链路Up事件以后,重新收敛到D→B→C→E→F路径。
此外,B-C链路Up事件不会影响节点D到节点B的路径,所以该路径一定是一个无环路径。
要计算节点D到节点F的无环路径,只需要指定节点B到节点C的路径即可。即在节点D收敛后的路径中插入一个节点B到节点C的End.X SID,指示报文从节点B转发到节点C,就可以保证节点D到节点F的路径无环。
图6-19 SRv6回切防微环
部署回切防微环后的收敛流程如下。
① 节点B和节点C之间的链路发生故障后恢复,假设节点D率先完成收敛。
② 节点D启动定时器T1,在T1超时前,节点D针对访问节点F的报文计算的防微环Segment List为<2::3>。
③ 节点A将报文转发给节点B,由于节点B未完成收敛,依然按照故障恢复前的路径将报文转发给节点D。
④ 节点D在报文中插入防微环Segment List <2::3>,并转发到节点B。
⑤ 节点B根据End.X SID 2::3的指令执行转发动作,沿着End.X SID 2::3指定的出接口转发到节点C,并将SL的值减1,然后将外层IPv6报文头的目的地址字段更新为6::。
⑥ 节点C按最短路径将报文转发到目的地址F。
从以上过程可以看出,由于节点D转发报文的时候插入了防微环Segment List <2::3>,所以消除了网络中潜在的环路。
当节点D的定时器T1超时后,网络中的其他节点也都已经完成收敛,头节点A按照收敛后的正常路径A→B→C→E→F转发报文。
实际上正切时不仅会导致本地微环,也可能引起远端节点之间形成环路。
① 节点C和节点E之间的链路发生故障,假设节点G率先完成收敛,节点B未完成收敛。
② 节点A和节点B沿着发生故障前的路径将报文转发到节点G。
③ 由于节点G已经完成收敛,根据路由下一跳转发到节点B。这样报文就在节点B和节点G之间形成了环路。
图6-20 SRv6远端正切微环
要解决此场景的微环问题,只能在节点 G 收敛以后安装一条无环路径。
无环路径只需要指定节点D到节点E的End.X SID 4::5即可,具体如图6-21所示。
图6-21 SRv6远端正切防微环
使能远端正切防微环后的收敛流程如下。
① 节点C和节点E之间的链路发生故障,假设节点G率先完成收敛。
② 节点G启动定时器T1,在T1超时前,节点G针对访问节点F的报文计算的防微环Segment List为<4::5>。
③ 节点A将报文转发给节点B,由于节点B未完成收敛,依然按照之前的路径将报文转发给节点G。
④ 节点G在报文中插入防微环Segment List <4::5>,并转发到节点B。
说明:报文在节点B和节点G之间往返了一次,但是由于在节点G上修改了报文的目的地址为End.X SID 4::5,所以不会形成环路。
⑤ 节点B根据目的地址4::5查询路由表转发给节点D。
⑥ 节点D根据End.X SID 4::5的指令执行转发动作,沿着End.X SID 4::5指定的出接口转发到节点E,并将SL的值减1,然后将外层IPv6报文头的目的地址段更新为6::。
⑦ 节点E按最短路径将报文转发到目的地址F。
从以上过程可以看出,由于节点G转发报文的时候插入了防微环Segment List <4::5>,所以消除了网络中潜在的环路。
当节点G的定时器T1超时后,网络中的其他节点也都已经完成收敛,头节点A按照收敛后的正常路径A→B→D→E→F转发报文。