OSPF邻居震荡抑制
OSPF邻居震荡抑制功能是一种震荡抑制方式,通过延迟邻居建立或调整链路开销为最大值的方法达到抑制震荡的目的。
产生原因
如果承载OSPF业务的接口状态在Up和Down之间切换,就会引起邻居状态的频繁震荡。此时,OSPF会快速发送Hello报文重新建立邻居,同步数据库LSDB,触发路由计算,会造成大量报文交互,影响现有邻居的稳定性,对OSPF业务造成较大影响,同时也会影响依赖OSPF的其他业务(如:LDP、BGP)的正常运行。为了解决这个问题,OSPF实现了邻居震荡抑制功能,即在邻居频繁震荡时,启动震荡抑制,实现邻居延迟建立,或实现业务流量延迟经过频繁震荡的链路,达到抑制震荡的目的。
相关概念
flapping_event:震荡事件,接口上最后一次邻居状态由Full切换为ExStart或Down,称之为flapping_event。flapping_event作为震荡源输入,用来触发震荡检测机制启动工作。
flapping_count:当前震荡次数。
detect-interval:震荡检测间隔,用于判断是否触发一次有效震荡事件。
threshold:震荡抑制阈值,有效震荡事件触发累计大于等于该值时,进入震荡抑制阶段。
resume-interval:恢复间隔,连续两次有效震荡事件的时间间隔超过该值时,退出震荡抑制阶段。
实现原理
震荡检测
OSPF接口启动一个flapping_count计数器,相邻两次flapping_event产生时间的间隔在detect-interval之内,记为一次有效震荡事件。flapping_count计数加1,当flapping_count计数大于等于threshold时,系统判定震荡发生,需要进入震荡抑制阶段。进入震荡抑制阶段后,flapping_count清0。在flapping_count大于等于threshold之前,如果两次flapping_event的间隔大于等于resume-interval,则flapping_count清0。邻居震荡抑制从最后一次邻居状态变为ExStart或Down开始计时。
用户可以通过命令行配置detect-interval,threshold,resume-interval三个震荡检测的关键参数。
注:resume-interval必须大于detect-interval。
震荡抑制
震荡抑制分为Hold-down和Hold-max-cost两种模式:
- Hold-down模式:针对邻居建立过程中的频繁泛洪和拓扑变化的问题,在一段时间内禁止该邻居重新建立,避免频繁的数据库同步和大量的报文交互。
- Hold-max-cost模式:针对用户业务流量频繁切换的问题,在一段时间内将链路开销值设置为最大值Max-cost(65535),避免用户的业务流量经过频繁震荡的链路。
Hold-down模式和Hold-max-cost模式可以叠加使用,同时生效时,先进入Hold-down模式,待Hold-down模式退出后,再进入Hold-max-cost模式。
缺省情况下,OSPF使能Hold-max-cost模式,用户可以通过命令行修改震荡抑制方案和震荡抑制周期。
注:接口进入震荡抑制阶段后,接口下的全部邻居都会进入震荡抑制阶段。
退出震荡抑制
退出震荡抑制有以下几种方式:
- 抑制定时器超时。
- 复位OSPF进程。
- 重启OSPFv3邻居。
- 用户通过命令行强制退出震荡抑制状态。
典型场景
基本场景
如图1所示,正常的业务流量路径是Router A->Router B->Router C->Router E。链路故障时,业务流量路径切换为Router A->Router B->Router D->Router E。在主备路径切换初期,Router B和Router C之间很可能会发生邻居状态频繁震荡,导致Router A到Router E的用户流量在两条路径不断切换,并且每次故障引发的切换都会导致用户流量部分丢失,影响网络稳定性。此时,如果Router B和Router C之间邻居震荡满足抑制条件时,设备就会启动震荡抑制功能。