在旋乐( Xerox )公司的 Palo Alto 研究中心 PARC 早期所作的关于网络互连的研究的基础上, routed 实现了起源于 Xerox NS RIP 的一个新协议,它更为通用化,能够适应多种网络。
尽管在其前辈上做了一些小改动, RIP 作为 IGP 流行起来并非技术上有过人之处,而是由于伯克利分校把路由守护神软件附加在流行的 4BSD UNIX 系统上一起分发,从而使得许多 TCP/IP 网点根本没考虑其技术上的优劣就采用 routed 并开始使用 RIP 。一旦安装并使用了这个软件,它就成为本地选路的基础,研究人员也开始在大型网络上使用它。
关于 RIP 的最令人吃惊的事可能就是它在还没有正式标准之前就已经广泛流行了。大多数的实现都脱胎于伯克利分校的程序,但是由于编程人员对未形成文档的微妙细节理解不同而造成了它们之间互操作性限制。协议出现新版本后,出现了更多的问题。在 1988 年 6 月形成了一个 RFC 标准,这才使软件商解决了互操作性问题。
RIP 协议的基础就是基于本地网的矢量距离选路算法的直接而简单的实现。它把参加通信的机器分为主机的( active )和被动的( passive 或 silent )。主动路由器向其他路由器通告其路由,而被动路由器接收通告并在此基础上更新其路由,它们自己并不通告路由。只有路由器能以主动方式使用 RIP ,而主机只能使用被动方式。
以主动方式运行 RIP 的路由器每隔 30 秒广播一次报文,该报文包含了路由器当前的选路数据库中的信息。每个报文由序偶构成,每个序偶由一个 IP 网络地址和一个代表到达该网络的距离的整数构成。 RIP 使用跳数度量( hop count metric )来衡量到达目的站的距离。在 RIP 度量标准中,路由器到它直接相连的网络的跳数被定义为 1 ,到通过另一个路由器可达的网络的距离为 2 跳,其余依此类推。因此从给定源站到目的站的一条路径的跳数( number of hops 或 hop count )对应于数据报沿该路传输时所经过的路由器数。显然,使用跳数作为衡量最短路径并不一定会得到最佳结果。例如,一条经过三个以太网的跳数为 3 的路径,可能比经过两条低速串行线的跳数为 2 的路径要快得多。为了补偿传输技术上的差距,许多 RIP 软件在通告低速网络路由时人为地增加了跳数。
运行 RIP 的主动机器和被动机器都要监听所有的广播报文,并根据前面所说的矢量距离算法来更新其选路表。例如图 1.2 中的互连网络中,路由器 R1 在网络 2 上广播的选路信息报文中包含了序偶( 1,1 ),即它能够以费用值 1 到达网络 1 。路由器 R2 和 R5 收到这个广播报文之后,建立一个通过 R1 到达网络 1 的路由(费用为 2 )。然后,路由器 R2 和 R5 在网络 3 上广播它们的 RIP 报文时就会包含序偶( 1,2 )。最终,所有的路由器和主机都会建立到网络 1 的路由。
RIP 规定了少量的规则来改进其性能和可靠性。例如,当路由器收到另一个路由器传来的路由时,它将保留该路由直到收到更好的路由。在我们所举的例子中,如果路由器 R2 和 R5 都以费用 2 来广播到网络 1 的路由,那么 R3 的 R4 就会将路由设置为经过先广播的那个路由器到达网络 1 。即:
为了防止路由在两个或多个费用相等的路径之间振荡不定, RIP 规定在
得到费用更小的路由之前保留原有路由不变。
如果第一个广播路由的路由器出故障(如崩溃)会有什么后果? RIP 规定所有收听者必须对通过 RIP 获得的路由设置定时器。当路由器在选路表中安置新路由时,它也为之设定了定时器。当该路由器又收到关于该路由的另一个广播报文后,定时器也要重新设置。如果经过 180 秒后还没有下一次通告该路由,它就变为无效路由。
RIP 必须处理下层算法的三类错误。第一,由于算法不能明确地检测出选路的回路, RIP 要么假定参与者是可信赖的,要么采取一定的预防措施。第二, RIP 必须对可能的距离使用一个较小的最大值来防止出现不稳定的现象( RIP 使用的值是 16 )。因而对于那些实际跳数值在 16 左右的互连网络,管理者要么把它划分为若干部分,要么采用其他的协议。第三,选路更新报文在网络之间的传输速度很慢, RIP 所使用的矢量距离算法会产生慢收敛( slow convergence )或无限计数( count to infinity )问题从而引发不一致性。选择一个小的无限大值( 16 ),可以限制慢收敛问题,但不能彻底解决客观存在。
选路表的不一致问题并非仅在 RIP 中出现。它是出现在任何矢量距离协议中的一个根本性的问题,在此协议中,更新报文仅仅包含由目的网络及到达该网络的距离构成的序偶。为了理解这个问题我们考虑图 1.4 中路由集合。图中描述了在图 1.2 中到达网络 1 的路由。
图 1.4 慢收敛问题。 (a) 中的三个路由器各有到网络 1 的路由。 (b) 中,到网络 1 的路由已经消失了,但是 R2 对它的路由通告引起了选路的环路正如图 1.4 ( a )所显示的那样, R1 直接与网络 1 相连,所以在它的选路表中有一条到该网络的距离为 1 的路由;在周期性的路由广播中包括了这个路由。 R2 从 R1 处得知了这个路由,并在自己的选路表中建立了相应的路由产工将之以距离值 2 广播出去。最后 R3 从 R2 处得知该路由并以距离值 3 广播。
现在假设 R1 到网络 1 的连接失效了。那么 R1 立即更新它的选路表把该路由的距离置为 16 (无穷大)。在下一次广播时, R1 应该通告这一信息。但是,除非协议包含了额外的机制预防此类情况,可能有其他的路由器在 R1 广播之前就广播了其路由。可能假设一个特殊的情况,即 R2 正好在 R1 与网络 1 连接失效后通告其路由。因此, R1 就会收到 R2 的报文,并对此使用通常的矢量距离算法:它注意到 R2 有到达网络 1 的费用更低的路由,计算出现在到达网络 1 需要 3 跳( R2 通告的到网络 1 费用是 2 跳,再加上到 R2 的 1 跳)。然后在选路表中装入新的通过 R2 到达网络 1 的路由。图 1.4 描述了这个结果。这样的话, R1 和 R2 中的任一个收到去网络 1 的数据报之后,就会把该报文在两者之间来回传输直到寿命计时器超时溢出。
这两个路由器随后广播的 RIP 不能迅速解决这个问题。在下一轮交换选路信息的过程中, R1 通告它的选路表中的各个项目。而 R2 得知 R1 到网络 1 的距离是 3 之后,计算出该路由新长度 4 。到第三轮的时候, R1 收到从 R2 传来的路由距离增加的信息,把自己的选路表中该路由的距离增到 5 。如此循环往复,直至距离值到达 RIP 的极限。