R2通过RIP从R1学习到了1.0.0.0/8的路由
R1的g0/0/1接口出现故障。1.0.0.0/8不可达,R1从路由表中删除了这条路由,并在下一次泛洪时传给R2。
但这个时候,R2先进行了通告,R1收到了R2的更新通告,发现通告中有自己没有的1.0.0.0/8网段的路由,以为可以通过R2到达1.0.0.0/8网段,所以把路由写进表中。
这样就形成了环路,到达1.0.0.0/8网段的数据会出现R2发给R1,R1又发给R2的情况。
为了避免RIP路由在网络中被无休止地泛洪, RIP定义了路由的最大跳数----15跳,也就是说, RIP路由的最大可用跳数为15跳,当一条路由的度量值达到16跳时,该路由被视为不可用,路由所指向的网段被视为不可达。
虽然解决了路由被无限泛洪的问题,但是同时也在极大程度上限制了RIP所能够支持的网络规模。另外, RIP定义路由的最大跳数,虽然有效防止了RIP路由被无限泛洪,但是却并没有从根本上解决路由环路问题。
水平分割(Split Horizon)的原理是, RIP路由器从某个接口收到的路由不会再从该接口通告回去。这个机制在很大程度上消除了RIP路由的环路隐患。
R1及R2运行了RIP,现在R1将本地直连路由1.0.0.0/8发布到了RIP,它将通过Response报文将该条路由通告出去,路由的度量值会被设置为1。
R2将在自己的GE0/0/0接口上收到R1发送的Response报文,并学习到1.0.0.0/8路由,它将该条路由加载到自己的路由表中。当R2的更新周期到来时,如果R2的GEO/0/0接口没有激活水平分割,那么它将会在自己从该接口发送的Response报文中携带1.0.0.0/8路由,该路由的跳数被设置为2。
如此一来, R1 会从R2收到原本由自己通告出去的RIP路由。当然,此时R1会优选自己本地直连的这条路由,因为它的优先级更高,但是当R1的直连网段1.0.0.0/8变成不可达时(关于该网段的直连路由将失效),它会错误地认为可以通过R2到达该网段,于是,环路就极有可能发生。
当R2的GE0/0/0接口激活水平分割后, R2将不能把它从该接口收到的RIP路由再,从这个接口通告出去,如此一来路由环路的问题就可以得到很好地规避。水平分割是距离矢量路由协议的路由防环专题中最重要的机制之一。
毒性逆转(Poison Reverse)是另一种防止路由环路的有效机制,其原理是, RIP从某个接口学到路由后,当它从该接口发送Response报文时会携带这些路由,但是这些路由度量值被设置为16跳(16跳意味着该路由不可达)。利用这种方式,可以清除对方路由表中的无用路由。毒性逆转也可以防止产生路由环路。
R1及R2两台路由器运行了RIP,彼此开始交互RIP路由。R1将路由1.0.0.0/8通过RIP通告给R2,如果R2激活毒性逆转,那么当它从GEO/0接口周期性发送Response报文时,报文中会包含从该接口学习到的1.0.0.0/8路由,但是路由的度量值被设置为16跳。
由于R2到达1.0.0.0/8的RIP路由是通过R1获知的,这意味着R1自己可能直连该网段,或者通过其他路由器可以到达该网段。换而言之, R1不会从R2到达1.0.0.0/8,因为那样就可能出现环路,所以毒性逆转的思路是R2认为: “既然这条路由是R1给我的,那么R1就不可能从我这里到达该网段,所以我就告诉R1,这个网络从我这走是不可达的”。这条不可达路由可以彻底杜绝R1从R2到达1.0.0.0/8从而出现环路的可能性。
从上面的描述能看出,其实毒性逆转和水平分割是存在矛盾的,如果在R2的接口上同时激活水平分割和毒性逆转,则只有毒性逆转生效。
综上,对水平分割通俗的理解就是: “到达某个目的网段的路由既然是你告诉我的,那么我就不应该再说回给你听”,这是一种相对消极的举动。
而毒性逆转则显得更加主动和积极:“到达某个目的网段的路由是你告诉我的,那么我通过主动告诉你这个网段从我这走不通来杜绝你从我这走的可能”。
从这个层面上理解,似乎毒性逆转在避免环路方面要比水平分割更加靠谱,但是它依然存在明显的缺点–增加了Response报文的“体积"。
触发更新机制指的是,当路由器感知到拓扑发生变更或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跳的路由更新来通知网络中的路由器–目标网络已经不可达,这种路由被称为毒性路由。
R1的直连网段1.0.0.0/8因故障变为不可达, R1将立即发送Response报文(触发更新机制使然)用于通告这个更新,在其发送给R2的这个Response报文中,包含着1.0.0.0/8路由,最重要的是这条路由的度量值被设置为16.
R2收到这个Response报文后,就立即意识到该网段已经不可达了,于是将该路由从路由表中移除。值得注意的是, R2虽然将该路由从路由表中删除,但是依然将其保存在RIP数据库中,同时为其启动垃圾同收计时器。