RIP(HCNP)——RIP的防环机制

目录

RIP的防环机制

环路的产生

定义最大跳数

水平分割

毒性逆转

触发更新

毒性路由


RIP的防环机制

对于具备路由功能的网络设备来说,当其执行数据转发操作时,路由表是一个非常关键的指引,如果网络中的路由信息出现问题,那么设备的数据转发过程也就势必受到影响。

路由环路(Routing Loop)是一种在路由部署不恰当或者网络规划不合理等等情况发生后,很容易引发的一类问题。如果网络中的数据包在设备之间不停的被来回转发,从而严重影响设备性能,并且大量消耗网络带宽,影响正常的业务流量,这种问题被称为路由环路问题。

路由环路对于未来而言是具有严重危害的,任何一个网络规划、设计或者交付人员都应该重视并且严格规避该问题。几乎所有的动态路由协议在协议设计时就要考虑路由环路的规避机制。RIP也不例外。

环路的产生

距离矢量路由协议只是简单地将自己的路由表周期性地通告出去,同时也将收到的 有效路由加载到路由表中,并通过累加的度量值来体现到达目标网络的距离,因此运行距离矢量路由协议的路由器并不了解整个网络的拓扑结构,这些特点使得网络中非常容 易出现路由环路。

在图2中,R1R2都运行了 RIP,当网络完成收敛后,R2通过RIP学习到了 1.0.0.0/8路由。现在R1GE0/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。可以想象,如果数据流量特别大的话,这无疑将对路由器的性能造成极大损耗,当然,也可能将链路的带宽耗尽。

另一方面,由于RIP每隔30s泛洪一次路由表,因此1.0.0.0/8路由会在每个更新周 期到来时随着Response报文在网络中不停地被泛洪。在R1的下一个更新周期到来时, 它会把1.0.0.0/8路由通过Response报文再通告给R2, R2收到该报文后,刷新自己的路 由表,将该路由的跳数更新为3跳,如图所示。而当R2的更新周期到来时,它将 在通告给R1的Response报文中继续携带1.0.0.0/8路由,而且跳数设置为4。R1收到该 Response报文后刷新自己的路由表,将该路由的度量值更新为4,如此反复。设想一下, 如果R1没有任何机制解决该问题,那么1.0.0.0/8路由岂不是会在网络中被不断地泛洪 且其度量值也会持续累加到无穷大?

综上,路由环路的问题对于网络而言危害是巨大的,因此从网络设计、协议设计的 角度都应该充分考虑到环路的隐患及可能性,并加以规避。 

定义最大跳数

为了避免RIP路由在网络中被无休止的防洪,RIP定义了路由的最大跳数——15跳,也就是说,RIP路由的最大可用跳数为15跳,也就是说,RIP路由的最大可用跳数为15跳,当一条路由的度量值达到16跳时,该路由被视为不可用,路由所指的网段被视为不可达。

显然这是一种“无奈”的办法,虽然解决了路由被无限防洪的问题,但是同时也在极大程度上限制了RIP所能够支持的网络规模,设想一下,如果一个网络的直径真的有 16台路由器该怎么办? RIP面对这样的网络也就显得力不从心了。另外,RIP定义路由 的最大跳数,虽然有效防止了 RIP路由被无限泛洪,但是却并没有从根本上解决路由环路问题。

水平分割

水平分割(Split Horizon)的原理是,RIP路由器从某个接口收到的路由不会再从该接口通过回去,这个机制再很大程度上消除了RIP路由的环路隐患。

在如图所示的网络中,R1及R2运行了 RIP,现在R1将本地直连路由1.0.0.0/8 发布到了 RIP,它将通过Response报文将该条路由通告出去,路由的度量值会被设置为 lo R2将在自己的GE0/0/0接口上收到R1发送的Response报文,并学习到1.0.0.0/8路 由,它将该条路由加载到自己的路由表中。当R2的更新周期到来时,如果R2的GE0/0/0 接口没有激活水平分割,那么它将会在自己从该接口发送的Response报文中携带 1.0.0.0/8路由,该路由的跳数被设置为2。如此一来,R1就会从R2收到原本由自己通告出去的RIP路由。当然,此时R1会优选自己本地直连的这条路由,因为它的优先级更高,但是当R1的直连网段1.0.0.0/8变成不可达时(关于该网段的直连路由将 失效),它会错误地认为可以通过R2到达该网段,于是,环路就极有可能发生。这 个问题的症结在于,R2把R1告知它的路由信息又返还给了 R1,这就埋下了路由环路的隐患。

当R2的GE0/0/0接口激活水平分割后,R2将不能收到的RIP路由再从这个接口通告出去,如图所示,如此一来路由环路的问题就可以得到很好的规避。水平分割是距离矢量路由协议的路由防环的最重要的机制之一。

在大多数场景下,水平分割能够很好地规避RIP路由环路,但是在某些特定的场景 中,这个机制可能会引发一点小问题。如下图所示,Rl、R2及R3三台路由器通过 帧中继网络互联,釆用的是中心到分支(也被称为Hub&Spoke)的部分互联模型,R1 与R2之间拥有一条互联的PVC (Permanent Virtual Circuit,永久虚电路),R1与R3之 间存在另一条PVC,但是R2及R3之间并没有直接互联的PVCo需留意的是,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会在自己的Seriall/0/O接口上收到这些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这两条路由————因为这两条路由都是在该接口上学到的,水平分割使然,所以最终R2无法学习到3.0.0.0/8 路由,而R3无法学习到2.0.0.0/8路由。

 在这种场景中,为了使网络中的路由器都能够学习到完整的路由信息,一个简单的方法是在R1的Serial 1/0/0接口上关闭RIP水平分割(以华为AR2220路由器为例,在该 场景中路由器会自动将这个接口的水平分割关闭),当然,这么做可能会增加产生路由环 路的风险。另一个方法是,在R1的Serial 1/0/0接口上创建两个子接口,将连接 R2及 R3的这两条PVC分别承载在这两个子接口上。

毒性逆转

毒性逆转(Poison Reverse)是另一种防止路由环路的有效机制,其原理是,RIP从某个接口学到路由后,当它从该接口发送Response报文时会携带这些路由,但是这些路 由度量值被设置为16跳(16跳意味着该路由不可达)。利用这种方式,可以清除对方路 由表中的无用路由。毒性逆转也可以防止产生路由环路。

在图中,R1及R2两台路由器运行了 RIP,彼此开始交互RIP路由。R1将路 由1.0.0.0/8通过RIP通告给R2。如果R2激活毒性逆转,那么当它从GE0/0/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报文的“体积”。

如图所示,R1如果作为一台汇聚层设备,将一定规模的路由信息通过RIP通 告给R2,如果R2激活了毒性逆转,那么它除了将路由表中的其他路由通告给R1之外, 还会把自己从R1接收的RIP路由再通告回给R1并且告知其路由不可达,R2所发送的 Response报文势必变得更加臃肿,这显然增加了链路带宽的损耗及设备负担。

触发更新

大家已经知道,路由器会在激活了 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跳的路由更新来通知网络中的路由器一一目标网络已经不可达,这种路由被称为毒性路由。

如图所示,R1的直连网段1.0.0.0/8因故障变为不可达,R1将立即发送Response 报文(触发更新机制使然)用于通告这个更新,在其发送给R2的这个Response报文中, 包含着1.0.0.0/8路由,最重要的是这条路由的度量值被设置为16。R2收到这个Response 报文后,就立即意识到该网段已经不可达了,于是将该路由从路由表中移除。值得注意 的是,R2虽然将该路由从路由表中删除,但是依然将其保存在RIP数据库中,同时为其 启动垃圾回收计时器。

 毒性逆转:R1和R2使能了RIP协议,R1有1.0.0.0/8的路由,R2通过RIP协议学习到了1.0.0.0/8的路由,在从接口发送给R1时,会将1.0.0.0/8的RIP路由的度量值设置为16跳。

毒性路由:R1和R2使能了RIP协议,R1发现1.0.0.0/8的路由不可达,则会将1.0.0.0/8的RIP路由度量值直接设置为16跳,发送给R2,R2则无法到达目标网络。

猜你喜欢

转载自blog.csdn.net/weixin_40274679/article/details/106315260
RIP