曲径通幽论坛
标题:
RIP 环路(最大跳数/水平分割/路由毒化/毒性反转)
[打印本页]
作者:
beyes
时间:
2016-7-12 11:59
标题:
RIP 环路(最大跳数/水平分割/路由毒化/毒性反转)
当网络发生故障时, RIP 网络有可能发生路由环路。参考下面的网络拓扑图:[attach]4531[/attach]
刚开始网络正常时,RTA 上会收到 RTB 的一条路由表:
10.0.0.0/8 192.168.1.1 1
现在假设 RTB 上通往 10.0.0.0/8 的网络发生故障,那么相应的路由信息会从 RTB 上删掉。
在下一次更新时,RTB 会从 RTA 上接收通往 10.0.0.0/8 的路由表信息,于是它身上就有:
10.0.0.0/8 192.168.1.2 2
因为这条路由信息是 RTA 告诉 RTB 的,因此下一跳的地址就得指向 RTA 的地址,即 192.168.1.2;此外跳数 metric + 1 (2)。
接下来,在 RTB 发起更新路由信息时,RTA 上的这条路由信息又会变成:
10.0.0.0/8 192.168.1.1 3
以此类推,RTA 和 RTB 会互相更新该条路由信息,最后当 metric 值到达 16 时,不再更新,因为这个数是规定跳数的最大值,当到达该值时,便认为网络不可达。不过,即使不设置这个 metric 最大值,TTL 值也会不断的减 1,到最后还是会认为网络不可达。
正是因为上述 RTA 和 RTB 的你发过来,我又发回去这种没道理的事情存在,于是提出了个 “
水平分割
” 的解决办法。
水平分割的意思是,路由器从某个接口学到的路由,不会从该接口再发送回邻居路由器,如下图所示:
[attach]4532[/attach]
现在再回过头来看,在网络出现故障前,通往 10.0.0.0/8 网络的路由信息是由 RTB 发往 RTA 的。当网络出现故障后,RTB 中就会删掉 10.0.0.0/8 这个路由表,但有了“水平分割”后,就不会像上述那样 RTA 会把这路由再发往 RTB 了。
毒性反转
是指路由器从某个接口学到路由后,将该路由的跳数设置为 16,并从原接收接口发回给邻居路由,如下图所示:
[attach]4533[/attach]
假设只有水平分割,而没有毒性反转。当网络发生故障时,RTB 中的 10.0.0.0/8 这个路由表被删除,那么 RTA 在什么时候才能知道 RTB 中这个路由表已经不存在了呢? 首先,RIP 的更新周期是 30s 。当 10.0.0.0/8 这个网络断开后,该路由表不存在。在 RTB 发起下一次更新时,更新信息中并没有含有该条路由,但是 RTA 并不会马上就将该路由表删除,而是需要等到 180s 之后(5 个 RIP 更新周期),如果 RTB 还没有发来关于 10.0.0.0/8 的路由更新信息,那么 RTA 就会将该条路由标为不可达(metric = 16)。然后再过 120s 后,RTA 才把这条路由从自己的 RIP 数据库中删掉。也就是说,RTA 需要经过 5 分钟才能知道通往 10.0.0.0/8 的网络之路已经断掉,这个时间显然比较长。
那么如何才能缩短这个时间呢?
在 10.0.0.0/8 断开时,RTB 在发送路由更新时,RTB 仍然会发送这条路由信息,只不过将 metric 直接设置为 16 后再发送;其意是,RTB 要告诉 RTA 该网络已经断开。以这个方法来看,时间只要过去一个更新周期(30s),RTA 就能知道 10.0.0.0/8 这个网络不可达,这个做法就称之为 “
路由毒化
” 。
这么一来一回后,RTB 毒化了 RTA,而 RTA 反过来又毒化了 RTB (毒性反转,即 RTA 中毒后使用“以彼之道还施彼身”的武功将毒返回到 RTB 身上),最后的结果是,双方都知道了出了故障的网络不可达。
不过问题到这还不算完。因为有了水平分割的存在,RTA 并不会把网络不可达的信息发给 RTB 。但如果引入了 “毒性反转” 之后,它作为一个特例,破坏了水平分割的机制,最后 RTA 会把这条网络不可达(metric = 16)的路由信息发到 RTB 。
欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/)
Powered by Discuz! X3.2