一、概述
RIP协议的全称是路由信息协议(RoutingInformationProtocol),它是一种内部网关协议(IGP),用于一个自治系统(AS)内的路由信息的传递。RIP协议是基于距离矢量算法(DistanceVectorAlgorithms)的,它使用“跳数”,即metric来衡量到达目标地址的路由距离。
二、该协议的局限性
1、协议中规定,一条有效的路由信息的度量(metric)不能超过15,这就使得该协议不能应用于很大型的网络,应该说正是由于设计者考虑到该协议只适合于小型网络所以才进行了这一限制。对于metric为16的目标网络来说,即认为其不可到达。
2、该路由协议应用到实际中时,很容易出现“计数到无穷大”的现象,这使得路由收敛很慢,在网络拓扑结构变化以后需要很长时间路由信息才能稳定下来。
3、该协议以跳数,即报文经过的路由器个数为衡量标准,并以此来选择路由,这一措施欠合理性,因为没有考虑网络延时、可靠性、线路负荷等因素对传输质量和速度的影响。
三、RIP(版本1)报文的格式和特性
3.1、RIP(版本1)报文的格式
071531
命令字(1字节)版本(1字节)必须为0(2字节)
地址类型标识符(2字节)必须为0(2字节)
IP地址
必须为0
必须为0
Metric值(1—16)
(最多可以有24个另外的路由,与前20字节具有相同的格式)
“命令字”字段为1时表示RIP请求,为2时表示RIP应答。地址类型标志符在实际应用中总是为2,即地址类型为IP地址。“IP地址”字段表明目的网络地址,“Metric”字段表明了到达目的网络所需要的“跳数”。
3.2.RIP的特性
(1)路由信息更新特性:
路由器最初启动时只包含了其直连网络的路由信息,并且其直连网络的metric值为1,然后它向周围的其他路由器发出完整路由表的RIP请求(该请求报文的“IP地址”字段为0.0.0.0)。路由器根据接收到的RIP应答来更新其路由表,具体方法是添加新的路由表项,并将其metric值加1。如果接收到与已有表项的目的地址相同的路由信息,则分下面三种情况分别对待:第一种情况,已有表项的来源端口与新表项的来源端口相同,那么无条件根据最新的路由信息更新其路由表;第二种情况,已有表项与新表项来源于不同的端口,那么比较它们的metric值,将metric值较小的一个最为自己的路由表项;第三种情况,新旧表项的metric值相等,普遍的处理方法是保留旧的表项。
路由器每30秒发送一次自己的路由表(以RIP应答的方式广播出去)。针对某一条路由信息,如果180秒以后都没有接收到新的关于它的路由信息,那么将其标记为失效,即metric值标记为16。在另外的120秒以后,如果仍然没有更新信息,该条失效信息被删除。
2)RIP版本1对RIP报文中“版本”字段的处理:
0:忽略该报文。
1:版本1报文,检查报文中“必须为0”的字段,若不符合规定,忽略该报文。
>1:不检查报文中“必须为0”的字段,仅处理RFC1058中规定的有意义的字段。因此,运行RIP版本1的机器能够接收处理RIP版本2的报文,但会丢失其中的RIP版本2新规定的那些信息。
(3)RIP版本1对地址的处理
RIP版本1不能识别子网网络地址,因为在其传送的路由更新报文中不包含子网掩码,因此RIP路由信息要么是主机地址,用于点对点链路的路由;要么是A、B、C类网络地址,用于以太网等的路由;另外,还可以是0.0.0.0,即缺省路由信息。
(4)计数到无穷大(CountingtoInfinity)
前面在RIP的局限性一部分提到了可能出现的计数到无穷大的现象,下面就来分析一下该现象的产生原因与过程。考察下面的简单网络:
c(目的网络)----routerA------routerB
在正常情况下,对于目标网络,A路由器的metric值为1,B路由器的metric值为2。当目标网络与A路由器之间的链路发生故障而断掉以后:
c(目的网络)--||--routerA------routerB
A路由器会将针对目标网络C的路由表项的metric值置为16,即标记为目标网络不可达,并准备在每30秒进行一次的路由表更新中发送出去,如果在这条信息还未发出的时候,A路由器收到了来自B的路由更新报文,而B中包含着关于C的metric为2的路由信息,根据前面提到的路由更新方法,路由器A会错误的认为有一条通过B路由器的路径可以到达目标网络C,从而更新其路由表,将对于目标网络C的路由表项的metric值由16改为3,而对于的端口变为与B路由器相连接的端口。很明显,A会将该条信息发给B,B将无条件更新其路由表,将metric改为4;该条信息又从B发向A,A将metric改为5……最后双发的路由表关于目标网络C的metric值都变为16,此时,才真正得到了正确的路由信息。这种现象称为“计数到无穷大”现象,虽然最终完成了收敛,但是收敛速度很慢,而且浪费了网络资源来发送这些循环的分组。
另外,从这里我们也可以看出,metric值的最大值的选择实际上存在着矛盾,如果选得太小,那么适用的网络规模太小;如果选得过大,那么在出现计数到无穷大现象的时候收敛时间会变得很长。
3.3.为了提高RIP性能的两项措施
3.3.1.水平分割
在上面的“计数到无穷大”现象中,产生的原因是A、B之间互相传送了“欺骗信息”,那么针对这种情况,我们自然会想到如果能将这些“欺骗信息”去掉,那么不就可以在一定程度上避免“计数到无穷大”了吗。水平分割正是这样一种解决手段。
“普通的水平分割”是:如果一条路由信息是从X端口学习到的,那么从该端口发出的路由更新报文中将不再包含该条路由信息。
“带毒化逆转的水平分割”是:如果一条路由信息是从X端口学习到的,那么从该端口发出的路由更新报文中将继续包含该条路由信息,而且将这条信息的metric置为16。
“普通的水平分割”能避免欺骗信息的发送,而且减小了路由更新报文的大小,节约了网络带宽;“带毒化逆转的水平分割”能够更快的消除路由信息的环路,但是增加了路由更新的负担。这两种措施的选择可根据实际情况进行选择。
3.3.2.触发更新
上面的“水平分割”能够消除两台路由器间的欺骗信息的相互循环,但是当牵涉到三台或者以上的路由器时,效果就有限了。考察下面的网络:

+---++----++-----+/-----\
|||C+-------|D|-----||E||
|A+------|||+----||
+-+-++----++---+-+\-----/
|--|
|--|
|--|
+----+|
|||
|B+-----------------------
||
+----+
E是目标网络

针对目标网络,各路由器的路由信息分别如下:
A:3C
B:2D
C:2D
D:1直连
当D与目标网络之间发生故障中断以后,B和C都能正确的从D得到网络不可达的信息,但是,从上面的路由信息中可以看出,A虽然不会给C发送错误信息,但是A可能在未收到网络不可达信息之前就给B发送了路由信息,让B错误的认为可以通过A到达目标网络,继而又会出现“计数到无穷大”的现象。
触发更新就是为了针对上述情况进行的一种改善,它的具体实现措施是:路由器一旦察觉到网络变化,就尽快甚至是立即发送更新报文,而不等待更新周期结束。只要触发更新的速度足够快,就可以大大的防止“计数到无穷大”的发生,但是这一现象还是有可能发生的。
使用了触发更新以后,当网络拓扑发生变化的时候,网络中会出现类似于“多米诺骨牌”的更新报文潮流,并最后中止于从未发生变化的路径到达目标网络的路由器。
3.4.RIP中的4个定时器
RIP中一共使用了4个定时器:updatetimer,timeouttimer,garbagetimer,holddowntimer。
Updatetimer用于每30秒发送路由更新报文。
Timeouttimer用于路由信息失效前的180秒的计时,每次收到同一条路由信息的更新信息就将该计数器复位。
Garbagetimer和holddowntimer同时用于将失效的路由信息删除前的计时:在holddowntimer的时间内,失效的路由信息不能被接收到的新信息所更新;在garbagetimer计时器超时后,失效的路由信息被删除。
另外,在触发更新中,更新信息会需要1到5秒的随机延时以后才被发出,这里也需要一个计时器。
四、RIP版本2简介
RIP版本2的报文格式如下:
071531
命令字(1字节)版本(1字节)路由域(2字节)
0xFFFF(2字节)验证类型(2字节)
验证(16字节)
地址类型标识符(2字节)路由标签(2字节)
IP地址
子网掩码
下一跳IP地址
Metric值(1—16)
(最多可以有24个另外的路由,与前20字节具有相同的格式)
版本2的RIP使用了版本1中“必须为0”的字段,增加了一些对于路由的有用信息,其主要新添的特性如下:
(1)报文中包含子网掩码,可以进行子网路由
(2)支持明文/MD5验证
(3)报文中包含了下一跳IP,为路由的选优提供了更多的信息。
RIP协议的前身是一个运行在UnixBSDI版本上称为"routed"的程序,在1988年被IETF标准化,定义为RFC1058。紧接着的RIP2标准在RFC1388中定义,它加入了对变长子网掩码(VLSM)的支持,但并没有从根本上解决RIP路由协议的一些主要缺点,例如在一个网络中如果有多条路径可以到达目的地,那么RIP协议在转移到另外一条可选路径时需要较长的一段时间才能完成。
RIP协议经受了长期的实际运行考验,在网络界已被广为运用。RIP在那些并没有冗余路由器的网络中的确是一种非常适合的路由协议。
一般路由协议的基本功能有两个,一个是交换路由;另一个是维护一份路由表以提供给其他通信协议调用,RIP也不例外。RIP路由表中的每一项都包含了最终目的地址、到目的节点的路径中的下一跳节点(nexthop)等信息。nexthop指的是网上的报文欲通过本网络节点到达目的节点,如不能直接送达,则本节点应把此报文送到某个中转站点,此中转站点称为nexthop,这一中转过程叫hop。一个报文从本节点到目的节点中途经历的中转次数称为hopcount。RIP采用距离向量算法,它通过比较到达目的站点的各个路由的hopcount,即距离的大小,从中选择具有最小数值的路由作为最佳路由,而把数值稍大的路由作为备份。一旦最佳路由失效,则采用备份路由。RIP只保留到目的地的最佳路由,当一条交换过来的新的路由信息提供了一条更佳的路由时,RIP就用它来替换旧的信息。当网络拓扑改变时,RIP实体会向外发布路由更新报文,以便与其他网络设备共享。每一个路由器收到一条更新报文后除了更新自己的路由表之外,还接着传播这条报文,这可以简单地理解为互通有无、彼此信任。
RIP使用一些时钟以保证它所维持的路由的有效性与及时性。但是对于RIP协议来说,一个不理想之处在于它需要相对较长的时间才能确认一个路由是否失效。RIP至少需要经过3分钟的延迟才能启动备份路由。这个时间对于大多数应用程序来说都会出现超时错误,用户能明显地感觉出来系统出现了短暂的故障。
RIP的另外一个问题是它在选择路由时不考虑链路的连接速度,而仅仅用hopcount来衡量路径的长短。这就造成了在一个实际的网络中,采用快速以太网(100Mbps)连接的链路可能仅仅因为比10Mbps以太网链路多出1个hop,致使RIP认为10Mbps链路为一条更优化的路由,而实际上并非如此。
老版本的RIP不支持VLSM,使得用户不能通过划分更小网络地址的方法来更高效地使用有限的IP地址空间。在RIP2版本中对此做了改进,在每一条路由信息中加入了子网掩码。由于老版本的RIP路由信息中不采用子网掩码,所以RIP1没有办法来传达不同网络中变长子网掩码的详细信息。
路由协议应该能够阻止数据包在网络中循环传递,或进行循环路由。RIP认为如果一条路由具有15个以上的hopcount值,那么这条路径上一定有环路存在。这就是说,一条路由的hopcount值到达16后,就被RIP认为无效。显然,这样的定义有效地预防了环路的存在,而且对于小网络高效易行。但是对于超过15个hop的大网络来说,RIP就有局限性。
RIP协议是一个国际标准,所有的路由器厂商都支持它,而且RIP在各种操作系统中都能很容易地进行配置和故障排除。在那些没有冗余链路的网络中RIP能很好地进行工作,但RIP的最大毛病在于它无法在具有冗余链路的网络中有效地运用。所以对于大网络或需要具备冗余链路的网络,就必须考虑采用其他路由协议了。