路由环路:在维护路由表信息的时候,如果在拓扑发生改变后,网络收敛缓慢产生了不协调或者矛盾的路由选择条目,就会发生路由环路的问题,这种条件下,路由器对无法到达的网络路由不予理睬,导致用户的数据包不停在网络上循环发送,最终造成网络资源的严重浪费。链路状态算法(OSPF)不会产生路由环路,因此,消除路由环路的技术,都是针对距离向量协议进行的。路由环路的形成大致如下述:

当C路由器一侧的X网络(192.168.4.0)发生故障,则C路由器收到故障信息,并在路由表中把X网络设置为不可达,等待更新周期到时来通知相邻的B路由器。但这时,如果相邻的B路由器的更新周期先来了,则C路由器将从B路由器那学习并更新到达X网络的路由。这是错误路由,因为此时的X网络已经损坏,而C路由器却在自己的路由表内增加了一条经过B 路由器到达X网络的路由。然后C路由器还会继续把该错误路由通告给B路由器,B路由器更新路由表,认为到达X网络须经过C路由,然后继续通知相邻的路由器,至此路由环路形成,C路由器认为到达X网络经过B路由器,而B则认为到达X网络进过C路由器。


解决路由环路问题的方法,概括来讲,主要分为六种:

1.定义最大值:
距离矢量路由算法可以通过IP头中的生存时间(TTL)来纠错,但路由环路问题可能首先要求无穷计数。为了避免这个延时问题,距离矢量协议定义了一个最大值,这个数字是指最大的度量值,如RIP协议最大值为16跳。也就是说,路由更新信息可以向不可到达的网络的路由中的路由器发送15次,一旦达到最大值16,就视为网络不可到达,存在故障,将不再接受来自访问该网络的任何路由更新信息。


2.水平分割:
一种消除路由环路并加快网络收敛的方法是通过叫做“水平分割”的技术实现的。其规则就是不向原始路由更新的方向再次发送路由更新信息(个人理解为单向更新,单向反馈)。比如有三台路由器ABC,B向C学习到访问网络192.168.4.0的路径以后,不再向C声明自己可以通过C访问10.4.0.0网络的路径信息,A向B学习到访问192.168.4.0网络路径信息后,也不再向B声明,而一旦网络192.168.4.0发生故障无法访问,C会向A和B发送该网络不可达到的路由更新信息,但不会再学习A和B发送的能够到达192.168.4.0的错误信息。


3.路由中毒(也称为路由毒化): 
定义最大值在一定程度上解决了路由环路问题,但并不彻底,可以看到,在达到最大值之前,路由环路还是存在的。为此,路由中毒就可以彻底解决这个问题。其原理是这样的:假设有三台路由器ABC,当网络192.168.4.0出现故障无法访问时,路由器C立即向邻居路由发送相关路由更新信息,并将其度量值标为无穷大,告诉它们网络192.168.4.0不可到达,路由器B收到毒化消息后将该链路路由表项标记为无穷大,表示该路径已经失效,并向邻居A路由器通告,依次毒化各个路由器,告诉邻居192.168.4.0这个网络已经失效,不再接收更新信息,从而避免了路由环路。


4.反向中毒(也称为毒化逆转):
结合上面的例子,当路由器B看到到达网络192.168.4.0的度量值为无穷大的时候,就发送一个叫做毒化逆转的更新信息给C路由器,说明192.168.4.0这个网络不可达到,这是超越水平分割的一个特列,这样保证所有的路由器都接受到了毒化的路由信息。


5.控制更新时间(即抑制计时器):
抑制计时器用于阻止定期更新的消息在不恰当的时间内重置一个已经坏掉的路由。抑制计时器告诉路由器把可能影响路由的任何改变暂时保持一段时间,抑制时间通常比更新信息发送到整个网络的时间要长。当路由器从邻居接收到以前能够访问的网络现在不能访问的更新后,就将该路由标记为不可访问,并启动一个抑制计时器,如果再次收到从邻居发送来的更新信息,包含一个比原来路径具有更好度量值的路由,就标记为可以访问,并取消抑制计时器。如果在抑制计时器超时之前从不同邻居收到的更新信息包含的度量值比以前的更差,更新将被忽略,这样可以有更多的时间让更新信息传遍整个网络。路由中毒和抑制时间结合起来可以在一定程度上避免路由环路的产生,并且抑制复位接口引起的网络震荡。路由中毒即在网络故障或接口复位时,让相应的路由项中毒,即将路由项的度量值设为无穷大,表示该路由项已经失效,一般在这个时候都会同时启动抑制时间。比如上面图示的X网络出现故障,则C路由器到X网络的路由表的度量值会被设置为最大,表示X网络已经不可达,并启动抑制时间。如果在抑制时间结束前,C路由器在X网络侧接收到到达X网络的路由,则更新路由项,因为此时的X网络故障已经排除,并且删除抑制时间。如果有从别的路由器接收到到达X网络的路由(上图没有),并且新的度量值比旧的好,则更新路由项,删除抑制时间,因为此时可能有另一条不经过C但可以到达X网络侧的路由器的路径。但是如果度量值没有以前的好,则不进行更新。


6.触发更新:
正常情况下,路由器会定期将路由表发送给邻居路由器。而触发更新就是立刻发送路由更新信息,以响应某些变化。检测到网络故障的路由器会立即发送一个更新信息给邻居路由器,并依次产生触发更新通知它们的邻居路由器,使整个网络上的路由器在最短的时间内收到更新信息,从而快速了解整个网络的变化。但这样也是有问题存在,有可能包含更新信息的数据包被某些网络中的链路丢失或损坏,其它路由器没能及时收到触发更新,因此就产生了结合抑制的触发更新,抑制规则要求一旦路由无效,在抑制时间内,到达同一目的地有同样或更差度量值的路由将会被忽略,这样触发更新将有时间传遍整个网络,从而避免了已经损坏的路由重新插入到已经收到触发更新的邻居中,也就解决了路由环路的问题。


回顾下上图示路由环路的产生,C路由器接收到X网络故障信息后,等待更新周期的到来后再通知B路由器,结果B的更新周期提早到来,结果掩盖了X网络的故障信息,从而形成环路。触发更新的机制正是用来解决这个问题,在收到故障信息后,不等待更新周期的到来,立即发送路由更新信息。但是还是有个问题,如果在触发更新刚要启动时却收到了来自B的更新信息,就会进行错误的更新。可以将抑制时间和触发更新相结合,当收到故障信息后,立即启动抑制时间,在这段时间内,不会轻易接受路由更新信息,这个机制就可以确保触发信息有足够的时间在网络中传播。


小提示:
路由中毒:是指在路由信息在路由表中失效时,先将度量值变为无穷大,而不是马上从路由表中删掉这条路由信息。(这句话要理解,如RIP协议中,其度量值变为16,意味着路由不可达)再将其信息发布出去,这样相邻的路由器就得知这条路由己无效了.....


毒性反转与路由中毒概念是不一样的,它是指收到路由中毒消息的路由器,不遵守水平分割原则将中毒消息转发给所有的相邻路由器,也包括发送中毒信息的源路由器,也就是通告相邻路由器这条路由信息己失效了。。主要目的是达到快速收敛的目的。