RIP环路解决方法
定义最大跳数
-
为了避免RIP路由在网络中被无休止地泛洪,RIP定义了路由的最大跳数为15跳,也就是说,RIP路由的最大可用跳数为15跳,当一条路由的度量值达到16跳时,该路由被视为不可用,路由所指向的网段被视为不可达。
-
很显然,这是一种“杀敌一千,自损八百”的办法,虽然可以解决了路由被无限泛洪的问题,但是同时也在极大程度上限制了RIP所能够支持的网络规模(假设一个网络的直径真的有16台路由器,基于RIP部署路由就有局限性)。
-
最重要的一点,RIP定义路由的最大跳数,虽然有效防止了RIP路由被无限泛洪,但是却并没有从根本上解决路由环路问题。
触发更新
问题背景
路由器会在激活了RIP的接口上周期性地发送Response报文,在缺省情况下,RIP会以30s为周期进行报文发送,这在网络稳定的情况下是没有问题的,但是一旦拓扑出现变更,如果依然要等待下一个更新周期到来才发送路由更新,这显然是不合理的,而且也非常容易引发路由环路。
解决方法
-
触发更新机制指的是,当路由器感知到拓扑发生变更或RIP路由度量值变更时,它无需等待下一个更新周期到来即可立即发送Response报文。
-
如下图所示的网络拓扑中:
-
R1、R2及R3三台路由器运行了RIP,
-
R1在RIP中发布1.0.0.0/8路由,它立即向R2发送一个Response报文,在该报文中包含这条路由以及路由的度量值。
-
R2收到这条路由更新后,将路由加载到自己的路由表,然后(无需等待下一个更新周期到来)立即向R3发送Response报文,将1.0.0.0/8路由通告给它。
-
假设现在由于网络拓扑发生改变,R1通告的1.0.0.0/8路由的度量值发生了变化,由原来的1跳变为2跳,R1向R2会立即发送一个Response报文以便将这个变化通知给对方。
-
由于R2是从该条路由的下一跳收到的Response报文,即使新的度量值要劣于R2路由表中已经存在的1.0.0.0/8路由的度量值,R2也会立即刷新自己的路由表,并且无需等待下一个更新周期的到来,立即触发一个Response报文给R3,如下图所示。
-
R3在收到该报文后,也会立即刷新自己的路由表。
毒性路由
- RIP将15跳视为最大的可用跳数,这就意味着度量值为16跳的路由是不可达的。
- 将度量值为16跳的路由包含在Response报文中进行泛洪,这在某些场合下是非常有用的,比如毒性逆转,另一种重要的用途是,当一个网络变为不可达时,发现这个变化的路由器立即触发一个16跳的路由更新来通知网络中的路由器,即目标网络已经不可达,这种路由被称为毒性路由。
- 如下图所示的网络拓扑中:
(1)R1的直连网段1.0.0.0/8因故障变为不可达,R1将立即发送Response报文(触发更新机制使然)用于通告这个更新,在R1发送给R2的这个Response报文中,包含着1.0.0.0/8路由,最重要的是这条路由的度量值被设置为16。
(2) R2收到这个Response报文后,就立即意识到该网段已经不可达了,于是将该路由从路由表中移除。
(3)值得注意的是,R2虽然将该路由从路由表中删除,但是依然将其保存在RIP数据库中,同时为其启动垃圾回收计时器。
水平分割
- 水平分割(Split Horizon )的原理是,RIP路由器从某个接口收到的路由不会再从该接口通告回去。这个机制在很大程度上消除了RIP路由的环路隐患。
- 如下图所示的网络拓扑中:
(1)R1及R2运行了RIP,现在R1将本地直连路由1.0.0.0/8发布到了RIP,它将通过Response报文将该条路由通告出去,路由的度量值会被设置为1。
(2)R2将在自己的GE0/0/0接口上收到R1发送的Response报文,并学习到1.0.0.0/8路由,它将该条路由加载到自己的路由表中。
(3)当R2的更新周期到来时,如果R2的GE0/0/0接口没有激活水平分割,那么它将会在自己从该接口发送的Response报文中携带1.0.0.0/8路由,该路由的跳数被设置为2。
(4)R1就会从R2收到原本由自己通告出去的RIP路由。但是此时R1还是会优选自己本地直连的这条路由,因为它的优先级更高,但是当R1的直连网段1.0.0.0/8变成不可达时(比如该网段的直连路由将失效),那么它会错误地认为可以通过R2到达该网段,于是,环路就极有可能发生。这个问题的症结在于,R2把R1告知它的路由信息又返还给了R1,这就埋下了路由环路的隐患。
(5)当R2的GE0/0/0接口激活水平分割后,R2将不能把它从该接口收到的RIP路由再从这个接口通告出去,如下图所示,如此一来路由环路的问题就可以得到很好地规避。
- 水平分割是距离矢量路由协议的路由防环专题中最重要的机制之一。
引入问题
在大多数场景下,水平分割能够很好地规避RIP路由环路,但是在某些特定的场景中,这个机制可能会引发一点小问题。如图下图所示的网络拓扑中:
- R1、R2及R3三台路由器通过帧中继网络互联,采用的是中心到分支(也被称为Hub&Spoke )的部分互联模型,
- R1与R2之间拥有一条互联的PVC (Permanent Virtual Circuit,永久虚电路),R1与R3之间存在另一条PVC,但是R2及R3之间并没有直接互联的PVC。也就是说,R1的Serial 1/0/0接口承载了两条PVC。
- 三台路由器都激活了RIP,最终R1能够通过RIP学习到2.0.0.0/8及3.0.0.0/8路由,但是R2只能学习到1.0.0.0/8路由,却无法学习到3.0.0.0/8
路由,同理,R3也只能学习到1.0.0.0/8路由,无法学习到2.0.0.0/8路由。
问题分析
- R2会将包含2.0.0.0/8路由的Response报文从其Serial 1/0/0接口发送出去,R3也会将包含3.0.0.0/8路由的Response报文从其Serial 1/0/0接口发送出去,最终R1会在自己的Serial 1/0/0接口上收到这些Response报文,并学习到2.0.0.0/8及3.0.0.0/8路由。
- 当R1的更新周期到来时,它也会发送Response报文,然而它从其Serial 1/0/0接口发送的Response报文并不会携带2.0.0.0/8及3.0.0.0/8这两条路由,因为这两条路由都是在Serial 1/0/0接口上学到的,基于水平分割防环机制,导致最终R2无法学习到3.0.0.0/8。R3无法学习到2.0.0.0/8路由。
解决方法
- 为了使网络中的路由器都能够学习到完整的路由信息,一个简单的方法是在R1的Serial1/0/0接口上关闭RIP水平分割,但是关闭水平分割可能会增加产生路由环路的风险。
- 另一个方法是,在R1的Serial1/0/0接口上创建两个子接口,将连接R2及R3的这两条PVC分别承载在这两个子接口上。(两个子接口接收的路由是不同的,但是都激活了RIP,因此可以通告互相学习的路由)
毒性逆转
- 毒性逆转(Poison Reverse)是另一种防止路由环路的有效机制,其原理是,RIP从某个接口学到路由后,当它从该接口发送Response报文时会携带这些路由,但是这些路由度量值被设置为16跳(16跳意味着该RIP路由不可达)。
- 利用这种方式,可以清除对方路由表中的无用路由。
- 如下图所示的网络拓扑中:
(1)R1及R2两台路由器运行了RIP,彼此开始交互RIP路由。
(2)R1将路由1.0.0.0/8通过RIP通告给R2。
(3)如果R2激活毒性逆转,那么当它从GE0/0/0接口周期性发送Response报文时,报文中会包含从该接口学习到的1.0.0.0/8路由,但是路由的度量值被设置为16跳。
(4)由于R2到达1.0.0.0/8的RIP路由是通过R1获知的,这意味着R1自己可能直连该网段,或者通过其他路由器可以到达该网段。换而言之,R1不会从R2到达1.0.0.0/8,因为那样就可能出现环路,所以毒性逆转的思路是R2认为:“既然这条路由是R1给我的,那么R1就不可能从我这里到达该网段,所以我就告诉R1,这个网络从我这走是不可达的”。
(5)这条不可达路由可以彻底杜绝R1从R2到达1.0.0.0/8从而出现环路的可能性。
-
很明显,毒性逆转和水平分割是存在矛盾的,如果在R2的接口上同时激活水平分割和毒性逆转,则只有毒性逆转生效。
-
对水平分割通俗的理解就是:“到达某个目的网段的路由既然是你告诉我的,那么我就不应该再说回给你听”,这是一种相对消极的举动。而毒性逆转则显得更加主动和积极:“到达某个目的网段的路由是你告诉我的,那么我通过主动告诉你这个网段从我这走不通来杜绝你从我这走的可能”。
-
看起来,似乎毒性逆转在避免环路方面要比水平分割更加靠谱,但是它依然存在明显的缺点,因为增加了Response报文的“体积”。 如下图所示的网络拓扑中:
(1)R1如果作为一台汇聚层设备,将一定规模的路由信息通过RIP通告给R2,
(2)如果R2激活了毒性逆转,那么它除了将路由表中的其他路由通告给RI之外,还会把自己从R1接收的RIP路由再通告回给R1并且告知其路由不可达,那么R2所发送的Response报文势必变得更加臃肿,这显然增加了链路带宽的损耗及设备负担。