在V-D算法中,有一个严重的问题,即“慢收敛”(slow convergence)问题,又叫“计算到无穷”(count to infinity)。
如图3.1(a) 中所示正常网间网拓扑结构,从G1可直接到达网络Net1,从G2经G1(距离为1)可到达Net1.正常情况下,G2收到G1的V-D报文后,会建立一条路由(1,G1,1)。
现在假设从G1到Net1的路由因故障而崩溃,但G1依然能正常工作。G1一旦检测到不可达,会立即将原来的路由废除(将距离改为16)。然后会出现两种可能:
第一种,在收到来自G2的V-D报文之前,G1将修改后的路由信息广播出去,于是G2将修改其路由数据库,将原来去往Net1的路由(1,G1,1)删除。这是完全正常的。
第二种,在G1发送新的报文之前,G2广播自己的V-D报文。该报文中必然有一条路由(1,1)表目,说明从G2出发,经1个驿站可以到达Net1.G1收到该报文后,显然会根据此表目更改自己的路由表,产生关于Net1的新路由(1,G2,2)。于是G1与G2间产生寻径环,如图3.1(b)所示。
上述路由环会通过G1和G2间的不断V-D报文交换而解除,但解除的过程是非常缓慢的:出现路由环后,在下一轮路由广播中,G1将向G2通告 (1,2)表目,G2收到此表目修改本地路由数据库,将去往Net1的路由改为(1,G1,3)。然后,G2向G1通告(1,3)表目,G1将去往 Net1的表目改为(1,G2,4)……如此下去,直到路由长度变为16.也就是说,至少要经过7番来回(至少30*7秒),路由环才能解除。这就是所谓满收敛问题。
其实这只是一种非常简单的情况,路由环也可以建立在不相邻的路由器之间。对于这种情况,如果减小路由的最大长度,对解决慢收敛问题将有所帮助,但这会限制网点的规模,无疑是不行的。
对于这种问题,有很多种办法,在本协议的实现中,用的是水平分割(Split Horizon)和毒性逆转法(Poison Reverse),并在毒性逆转时采用触发刷新(Triggered Update)。具体实现是这样的:
水平分割:当路由器从某个网络接口发送RIP路由刷新报文时,其中不包含从该接口获取的路由信息。
毒性逆转:某路径崩溃后,最早广播此路由的路由器将原路由继续保留在若干报文中,但指明该路由为无限长。
触发刷新:一旦检测到路由崩溃,立即广播路由刷新报文,而不等到下一刷新周期。
根据路由环产生的过程,可知通过水平分割法对解决两路由器之间形成的路由环是极为有效的方法。毒性逆转法可解决多路由器之间的路由环问题。使用触发刷新,显然可以加快新路由的有效刷新。
更有这样一个事实,从本接口发出的路由再从别的接口收到,对本地路由表是不会帮助的,正是基于这种考虑,水平分割是在RIP协议的实现中是必不可少的。对于这一点在后来的讨论中会更清楚地得到认识。