路由环路
- 路由环路(Routing Loop)是一种在路由部署不恰当或网络规划不合理等情况发生后,很容易引发的一类问题。
- 如果网络中的路由信息不正确,将导致去往某个目的地的数据包在设备之间不停地被来回转发,从而严重影响设备性能,并且大量消耗
网络带宽,影响正常的业务流量,这种问题被称为路由环路问题。 - 路由环路对于网络而言是具有严重危害的,几乎所有的动态路由协议在协议设计时便考虑了路由环路的规避机制,RIP也不例外。
RIP环路的产生
需要注意的是,距离矢量路由协议只是简单地将自己的路由表周期性地通告出去,同时也将收到的有效路由加载到路由表中,并通过累加的度量值来体现到达目标网络的距离,但是运行距离矢量路由协议的路由器其实并不了解整个网络的拓扑结构,这些特点使得网络中非常容易出现路由环路。
如下图所示的网络拓扑中:
- R1及R2都运行了RIP,当网络完成收敛后,R2通过RIP学习到了1.0.0.0/8路由。
引入问题
-
假设现在R1的GE0/0/1接口发生了故障,R1感知到这个拓扑变化并且立即在路由表中删除1.0.0.0/8路由。但是这个拓扑的变更对于R2来说此时并不知晓的。
-
R1准备在下一个更新周期到来时通告该条路由的不可达情况。
-
但是此时完全有可能出现的一种情况是,在R1通告这个更新之前,R2的更新周期到了,它开始在自己的GE0/0/0接口上发送Response报文,该报文中包含R2路由表中的所有路由,其中就包括1.0.0.0/8路由,且该路由的跳数为2 (R2自己到达该网段需经过1个路由器,因此它将路由更新出去时将跳数加1) 。
-
R1收到这个Response报文后,发现1.0.0.0/8竟然通过R2可达且跳数为2,于是它将1.0.0.0/8路由加载到路由表,如下图所示:
-
很明显,此时出现了路由环路。如果R2收到一个发往1.0.0.0/8的数据包,经过路由表查询后,R2发现自己有一条路由可以匹配该目的地址,并且下一跳为R1,因此它将数据包转发给R1,但是R1经过路由表查询,发现到达1.0.0.0/8下一跳是R2,于是数据包又被转发给R2,如此反复,发往该网段的数据包就会在R1、R2之间不停地来回转发,直到报文的TTL值递减为0。
-
如果业务流量特别大的话,这无疑将对路由器的性能造成极大损耗,也可能将链路的带宽耗尽。
引入问题2
-
另一方面,由于RIP每隔30s泛洪一次路由表,因此1.0.0.0/8路由会在每个更新周期到来时随着Response报文在网络中不停地被泛洪。
-
在R1的下一个更新周期到来时,它会把1.0.0.0/8路由通过Response报文再通告给R2 , R2收到该报文后,刷新自己的路由表,将该路由的跳数更新为3跳(最开始1.0.0.0/8的路由就是R1通过给R2的,属于同一个下一跳的通告路由发生变化时会触发更新),如下图所示:
-
而当R2的更新周期到来时,它将在通告给R1的Response报文中继续携带1.0.0.0/8路由,而且跳数设置为4。R1收到该Response报文后刷新自己的路由表,将该路由的度量值更新为4,如此反复。
设想一下,如果RIP没有任何机制解决该问题,那么1.0.0.0/8路由岂不是会在网络中被不断地泛洪且其度量值也会持续累加到无穷大?