SRv6技术课堂:SRv6可靠性方案(三)

2019-12-30 15:00:26 浏览数 (1)

作者简介:

胡志波 华为SR与IGP高级协议专家。负责华为的SR与IGP协议规划和创新工作。目前主要从事SR/SRv6协议以及5G切片相关技术的研究。自2017年起积极参与IETF标准创新工作,主导和参与SRv6可靠性保护,SRv6 Yang, 5G 切片,IGP协议等相关标准。致力于通过SRv6协议创新支撑网络向5G,云化的演进。

李振斌 华为首席协议专家/IETF互联网架构委员会(IAB)委员。负责华为的IP协议研究和标准推动工作。自2009年起积极参与IETF标准创新工作,主导和参与了大量IETF RFC/草案。在过去六年内持续推动了SDN演进BGP/PCEP/Netconf/YANG的协议创新和标准化,当前研究的重点包括SRv6、网络智能、Telemetry、5G承载等。2019年当选IETF互联网架构委员会(IAB)委员,承担2019 - 2021年的互联网架构管理工作。

本文为《SRv6可靠性方案》最终篇,第一篇详见《SRv6可靠性方案(一)》、第二篇详见《SRv6可靠性方案(二)》。

5

防微环

微环产生背景

IP网络的分布式无序收敛会产生环路。以IS-IS/OSPF链路状态为例,每次网络拓扑发生变化时,都需要一些路由器基于新拓扑更新其转发信息库(FIB),由于收敛顺序差异,不同路由器会有暂态的不一致。这个不一致持续的时间根据设备能力、配置参数、业务量等的不同可能在毫秒级到秒级。在此期间,报文沿途转发的路由器可能处于收敛前状态,也可能处于收敛后状态,这样就可能会导致转发环路。直到沿途路径的设备都完成收敛,环路才会消失。我们将这种暂态的环路称为微环。微环可能导致网络丢包、时延抖动、报文乱序等。

图1-1 路由环路

如上图所示,节点A沿着路径A->R1->R2->B发送报文给节点B。当R1->R2的链路故障的时候,R1先收敛,将下一跳收敛到R3。此时如果R3未完成收敛,下它到节点B的下一跳还是R1,那么就会有一个期间,在此期间内,报文就会在R1和R3之间形成环路。

微环可能发生在任何拓扑变更的情况下(如链路/节点UP,链路/节点Down, 或者Metric值变化等)。微环普遍存在于IP网络中,在Segment Routing技术出现之前,业界针对如何消除防微环已经做了大量的研究,例如:Order Fib、Order Metric等。它们的基本原理都是通过控制网络节点的收敛顺序,使得网络节点节点按照有序的顺序进行收敛,例如:正切时,离故障点最远的节点先收敛,离故障点最近的节点最后收敛,回切时,离故障点最近的节点先收敛,离故障点最远的节点最后收敛,从而达到消除环路的目的。但是这种方式普遍会使得整网的收敛过程复杂化,而且整体收敛时间会变得很长,因此这些方式一直没有在网络中得到部署。

Segment Routing使得我们可以采用一种对网络影响比较小的方式来消除网络中潜在的环路。它的原理是:如果网络拓扑变化可能引发环路,网络节点通过创建一个无环的SRv6 segment List,引导流量转发到目的地址,等待一段时间(网络节点全完完成收敛)再回退到正常转发状态,从而能有效地消除网络中的环路。

SRv6本地正切防微环

本地正切微环指的是紧邻故障节点的节点收敛后引发的环路,如下图所示,全网节点都部署SRv6 TI-LFA, 当节点B故障的时候,节点A针对目的地址C的收敛过程如下:

  1. 节点A感知到故障,进入TI-LFA的快速重路由切换流程,报文沿着备份路径转发,下一跳为节点F,并封装SRv6 Repair List: <5::>(TI-LFA计算的PQ节点为结点E)。
  2. 节点A完成到目的地址C的收敛,下一跳为节点F,不再携带SRv6 Repair List。
  3. 如果此时节点F还未完成收敛,当节点A将报文转发给节点F的时候,F的下一跳还是A,这样就在节点A和节点F直接形成环路。

图1-2 本地正切微环示意图

通过上述收敛过程的描述我们知道,本地正切环路发生在节点A退出TI-LFA流程,变成正常转发,而网络中其他节点还未完成收敛期间。因此为了解决这个场景下的环路问题,只需要节点A延时收敛。由于TI-LFA一定是个无环路径,所以只需要维持一段时间走TI-LFA路径,待网络中其他节点完成收敛以后再退出TI-LFA,正常收敛。

图1-3 本地正切防微环示意图

使能正切防微环后的收敛流程如下:

  1. 节点A感知到故障,进入TI-LFA流程,报文沿着备份路径转发,下一跳为节点F,并封装SRv6 Repair List: <5::>。
  2. 节点A启动一个定时器T1。在T1期间,节点A不响应拓扑变化,转发表不变,报文依旧走TI-LFA转发。网络中其他节点正常收敛。
  3. 节点A的定时器T1超时,这时网络中其他节点都已经完成收敛,节点A也正常收敛,退出TI-LFA流程,按照正常收敛后的路径转发报文。

通过上述步骤能够有效地避免该场景的环路问题,但是值得注意的是,该方案只能解决正切场景,而且环路是发生在PLR结点。这是因为只有正切场景,而且是PLR结点才能进入TI-LFA转发流程,可以通过延时收敛,继续使用TI-LFA路径实现防环。此外,该方案只限于单点故障,如果是多点故障,TI-LFA备份路径可能也会受影响,如果长时间走TI-LFA备份路径也会导致转发出现不可预期的问题。

SRv6回切防微环

网络中不仅在故障发生的时候会产生故障,而且在故障恢复路径回切的时候也可能会出现短暂的环路。下面以下图为例,我们说明一个回切时产生环路的场景:

  1. 节点A将报文按照路径A->B->C->D>F将报文发送给到目的节点F。当B->C之间的链路发生故障之后,A节点会按照重新收敛之后的路径A->B->E->D->F发送报文到目的节点F。
  2. 节点B和节点C的链路故障后恢复,节点E率先完成收敛。
  3. 节点A将报文转发给节点B,由于节点B未完成收敛,依然按照下图中故障前路径转发,转发给节点E。
  4. 节点E已经完成收敛,所以节点E按照故障恢复后的路径转发到节点B,这就在B和E之间形成了环路。

由于回切不会进入TI-LFA转发流程,所以无法像正切一样使用延时收敛的方式解决回切微环问题。

图1-4 SRv6回切微环示意图

从上述回切微环产生过程中我们了解到,当网络中故障恢复的时候,节点E先于节点B收敛会产生短暂的环路。由于节点E无法预估网络中的链路UP事件,所以也无法预先安装针对链路UP计算的无环路径。为了消除回切过程中潜在的环路问题,节点E需要能够收敛到一条无环路径。

如上图所示,节点E感知到B->C的链路UP事件以后,重新收敛到E->B->C->D->F路径。我们知道, B->C的链路UP事件不会影响到E->B的路径(链路UP触发的拓扑变化只会影响收敛后经过该链路的转发路径,如果收敛后节点E到节点B的路径不经过B->C的链路,那么该路径一定不会受B->C的链路UP事件的影响。同样的原理,链路Down触发的拓扑变化只会影响收敛前经过该链路的转发路径),所以节点E到B的路径一定是一个无环路径。我们在构造节点E到节点F的无环路径的时候,无需指定E到B的路径。同理,节点C到节点F也不会受B->C链路UP事件的影响,节点C到F的路径也一定是一个无环路径。唯一受影响的是节点B到节点C的路径,所以要计算节点E到F的无环路径,只需要指定节点B到节点C的路径即可我。们只需要在节点E的收敛后路径插入一个节点B到C的邻接SID,就可以保证E到F的路径无环。

图1-5 SRv6回切防微环示意图

使能回切防微环后的收敛流程如下:

  1. 节点B和节点C的链路故障后恢复,节点E率先完成收敛。
  2. 节点E启动定时器T1,在T1超时前,结点E计算的防微环SegmentList为:<2::3>。
  3. 节点A将报文转发给节点B,由于节点B未完成收敛,依然按照图中路径2转发,转发给节点E。
  4. 节点E在报文中插入防微环SegmentList:<2::3>,并转发到节点B(需要注意的是报文在节点B和E来回了一次,但是由于在节点E修改了报文目的地址,所以不会成环)。
  5. 节点B根据End.X SID 2::3指令执行转发动作,沿着SID 2::3指定的出接口转发到节点C,并执行SL—,将外层IPv6头变更为6::。
  6. 节点C按最短路径转发到目的地址F。由于结点E转发报文的时候插入防微环SegmentList:<2::3>,消除了网络中潜在的环路。

节点E的定时器T1超时,这时网络中其他节点都已经完成收敛,报文按照正常收敛后的路径A->B->C->D->F转发报文。

SRv6远端正切防微环

前面我们介绍了本地正切防微环,但是正切的时候也可能引起远端节点之间形成环路,即沿着报文转发路径,如果离故障点更近的节点先于离故障点远的节点收敛,就可能会导致环路。下面我们用以下图为例,描述远端正切微环产生过程:

  1. C->D的链路故障,节点G先完成收敛,节点B未完成收敛。
  2. 节点A和节点B沿着故障前路径转发报文到节点G。
  3. 由于G已经完成收敛,根据路由下一跳转发到B。这样报文就在节点B和G之间形成环路。

图1-6 SRv6远端正切微环示意图

由于网络节点只能针对本地直连的链路或节点故障预先计算无环路径,而无法针对网络中任何潜在的故障预先计算无环路径,否则计算量就太大了。因此只能在节点G收敛以后安装一条无环路径。

在上文中我们已经提到,链路Down触发的拓扑变化只会影响收敛前经过该链路的转发路径,如果收敛前某节点到目的节点的路径不经过故障链路,那该路径一定不会受该链路故障事件的影响。从上图所述拓扑我们知道,节点G到E的路径不会受C->D的链路故障的影响,所以节点G到F的无环路径不需要指定节点G到节点E的路径。同样,节点D到节点F也不会受C->D的链路故障的影响,所以我们也无需指定节点D到F的路径。因为只有节点E到节点D的路径受C->D的链路故障的影响,所以无环路径只需要指定节点E到节点D的End.X SID 5::4即可,具体如下图所示。

图1-7 SRv6远端正切防微环示意图

使能远端正切防微环后的收敛流程如下:

  1. 节点C和D之间的链路故障,节点G率先完成收敛。
  2. 节点G启动定时器T1,在T1超时前,结点G计算的防微环SegmentList为:<5::4>。
  3. 节点A将报文转发给节点B,由于节点B未完成收敛,依然之前的路径将报文转发给节点G。
  4. 节点G在报文中插入防微环SegmentList:<5::4,并转发到节点B(需要注意的是报文在节点B和G来回了一次,但是由于在节点G修改了报文目的地址,所以不会形成环路)。
  5. 节点B根据目的地址5::4查询路由表转发给节点E。
  6. 节点E根据SID 5::4的指令执行转发动作,沿着SID 5::4指定的出接口转发到节点D,并执行SL—,将外层IPv6头变更为6::。
  7. 节点D按最短路径转发到目的地址F。由于结点G转发报文的时候插入防微环SegmentList:<5::4,消除了网络中潜在的环路。
  8. 节点G的定时器T1超时,这时网络中其他节点都已经完成收敛,报文按照正常收敛后的路径A->B->E->D->F转发报文。

小结

在分布式算路转发中,微环和故障丢包一样重要,SRv6由于其路径可编程的能力,结合针对各种不同场景的防环算法,能够消除分布式算路暂态的微环,提升网络质量。

注:本公众号允许其他公众号或网络平台进行转载,但任何形式的转载需注明“文章转载自SDNLAB公众号”相关字样

0 人点赞