一.序言
在一个运行中的网络中,设备常常出现一些不稳定的现象,原因可能是设备本身的bug,也可能是在搭建网络的时候很多地方遗留下了后患。
那么面对这些不稳定的现象,厂家应该如何来面对呢?显然为了把他们的设备买的更好,他们必须替客户考虑的更多……于是他们必须在他们的设备中加入一些预防性的措施,比如route flap dampening。
二.什么是route flapping?为什么需要dampening?如何实现route flapping dampening?
现在我们来考虑一种现象:由于我们的线缆的问题,或者是端口连接问题,我们的网络中某一个端口经常性的up---down,这种情况出现的频率很高,会导致什么样的结果呢?结果是某些路由在设备的路由表里面会消失---出现---消失---出现---消失出现了我们称之为route flapping的现象。这样网络中的很多设备就会因此不断的刷新自己的路由表,白白的消耗大量的处理器时间片。
这种浪费必须最大程度的避免,如何来避免呢?先来分析一下这种现象的因果关系:原因是端口不稳定,结果是导致了路由表的刷新,浪费了处理器时间。这个是必然的因果关系吗?答案是否!当我们不采取任何措施的时候的确是这样,但是如果我们采取有效的措施呢?
现在让我们反过来思考一下,我们在避免什么?我们在避免设备浪费资源,而不是避免端口出现不稳定的情况(很多时候我们只能减少这样的事情发生,而不能杜绝这种情况),所以我们要做的是:即使端口在flapping,我们的路由表也不要不停的去刷新!这就是dampening所要实现的功能!所谓dampening就是指当某个端口在flapping的时候,网络设备会自动的抑制这个端口,直到网络设备确定端口恢复正常才启用这个端口。
在这个dampening过程中,存在着几个问题需要我们去解决:
1.当这个端口处在什么状态时,网络设备应该认为它处在flapping状态?
2.网络设备如何确定这个端口已经恢复了正常?然后如何来启用它?
3.如果这个端口一直不稳定,网络设备应该永久性的抑制它吗?
解决了以上的问题,我们就实现了dampening的功能。
解决办法(针对以上每一个问题):
1.每当端口flap一次之后,就惩罚它一次,用一个值来表示处惩罚的概念。比如说开始当端口稳定的时候,这个端口的惩罚值为0,当它flap一次后,我们就给它加1000的惩罚值,再flap一次就再加1000;并且我们设定一个dampening的门限值,比如为2500,那么可以计算出,当这个端口flap三次,它的惩罚值为3000>2500,于是它被dampening了!
2.接着引用上面的例子,如果当端口flap三次后一直都不在flap了,那么网络设备是否应该一直抑制它呢(由于3000>2500,所以如果不采取其他措施,这个端口肯定一直会被抑制)?显然这不是我们想要的结果!它稳定了,我们就应该再用它,于是我们需要想办法让它启用,办法就是让惩罚值随着时间的推移自动的减少,引用元素衰减中半衰期的概念(当过了一段时间后,元素的质量会衰减到初始的一半,这儿引申为过了一定的时间后(比如10分钟),惩罚值会衰减到当初的一半)。并且设定一个启用的门限值(比如1800),设定当端口的惩罚值衰减到这个以下那么端口就会被重新启用。于是10分钟后,惩罚值变成3000/2=1500<1800,端口重新被启用了。
3.很明显,我们用了某个端口,必然是有用处的,所以我们不能一直的抑制它,必须要设定一个最大的抑制时间(比如40分钟);
图如下:
注意:
抑制值<最大惩罚值 的条件必须满足!
否则dampening的功能自动关闭!
比如:dampening 30 500 2500 60 无效
解决了上面的三个问题后,我们完全的实现了dempening的功能;
实现的语句为(引用上面的例子):
dempening 10m(半衰期) 1800(启用值) 2500(抑制值) 40m(最大抑制时间)
三.Route Flap Dampening 应用在哪些地方?
Route flap dampening主要应用在两个地方,一个比较典型的应用在BGP中,另一个是应用在IGP中。两个应用的差别在于抑制的时间不同,bgp dampening中半衰期为1-45分钟,最大抑制时间为255分钟;而IGP中半衰期为1-30秒,最大抑制时间为255秒。当然两个应用的命令也有差异,这个查看相关的命令文档就可以了。
四.惩罚值是如何衰减的?(Route Flap Dampening 的算法)