RIP是Routing Information Protocol(路由信息协议)的简称,它是一种较为简单的内部网关协议(Interior Gateway Protocol)。RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量来衡量到达目的网络的距离。RIP通过UDP报文进行路由信息的交换,使用的端口号为520。
RIP包括RIP-1和RIP-2两个版本,RIP-2对RIP-1进行了扩充,使其更具有优势。
RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量值来衡量到达目的地址的距离。在RIP网络中,缺省情况下,设备到与它直接相连网络的跳数为0,通过一个设备可达的网络的跳数为1,其余依此类推。也就是说,度量值等于从本网络到达目的网络间的设备数量。为限制收敛时间,RIP规定度量值取0~15之间的整数,大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。由于这个限制,使得RIP不可能在大型网络中得到应用。
RIP-1报文由头部(Header)和多个路由表项(Route Entries)部分组成。在一个RIP报文中,最多可以有25个路由表项。RIP是一个基于UDP协议的,并且RIP-1的数据包不能超过512字节。
字段解释:
字段名 | 长度 | 含义 |
---|---|---|
Command | 8比特 | 标识报文的类型:1:Request报文,向邻居请求全部或部分路由信息;2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。 |
Version | 8比特 | RIP的版本号:1:RIP-12:RIP-2 |
Must be zero | 16/32比特 | 必须为零字段。 |
AFI(Address family identifier) | 16比特 | 地址族标识,其值为2时表示IP协议。对于Request报文,此字段值为0。 |
IP Address | 32比特 | 该路由的目的IP地址,可以是自然网段的地址,也可以是子网地址或主机地址。 |
Metric | 32比特 | 路由的开销值。对于Request报文,此字段值为16。 |
RIPv1报文抓包示例:
RIP是一个基于UDP的路由协议,并且RIPv1的数据包不能超过512字节(RIP报文头部占用4个字节,而每个路由条目占用20个八位组字节。因此,RIP消息最大为4+(25*20)=504个字节,再加上8个字节的UDP头部,所以RIP数据报的大小(不含IP包的头部)最大可达512个字节。)。RIPv1的协议报文中没有携带掩码信息,所以RIPv1在发送和接收路由更新时会根据主类网段掩码和接口地址掩码来处理路由条目。因此RIPv1无法支持路由聚合,也不支持不连续子网。RIPv1的协议报文中没有验证字段,所以RIPv1也不支持验证。
RIP启动时的初始路由表仅包含本设备的一些直连接口路由。通过相邻设备互相学习路由表项,才能实现各网段路由互通。
RIP路由表形成过程如上图所示:
注意发送时没有子网掩码。
将要发送的前缀路由和出接口网段匹配:
收到一个前缀后,如果发现是主网络号,直接放入路由表,掩码是8/16/24.
如果不是主网络号,检查是否在同一主网:
RIP协议在更新和维护路由信息时主要使用四个定时器:
RIP路由与定时器之间的关系:
注意事项:
触发更新可以缩短网络收敛时间。在路由表项变化时立即向其他设备广播该信息,而不必等待定时更新。如果没有触发更新,缺省情况下,失效的路由条目会在路由表停留最多300秒(老化定时器+垃圾收集定时器)。
字段解释:
字段名 | 长度 | 含义 |
---|---|---|
Command | 8比特 | 标识报文的类型:1:Request报文,向邻居请求全部或部分路由信息;2:Reponse报文,发送自己全部或部分路由信息,一个Response报文中最多包含25个路由表项。 |
Version | 8比特 | RIP的版本号:1:RIP-12:RIP-2 |
Must be zero | 16比特 | 必须为零字段。 |
AFI(Address Family Identifier) | 16比特 | 地址族标识,其值为2时表示IP协议。对于Request报文,此字段值为0。 |
Route Tag | 16比特 | 外部路由标记。 |
IP Address | 32比特 | 该路由的目的IP地址,可以是自然网段的地址,也可以是子网地址或主机地址。 |
Subnet Mask | 32比特 | 目的地址的掩码。 |
Next Hop | 32比特 | 提供一个更好的下一跳地址。如果为0.0.0.0,则表示发布此路由的路由器地址就是最优下一跳地址。 |
Metric | 32比特 | 路由的开销值。对于Request报文,此字段为16。 |
RIPv2报文抓包示例:
路由聚合的原理是,同一个自然网段内的不同子网的路由在向外(其它网段)发送时聚合成一个网段的路由发送。
路由聚合有两种方式:
基于RIP进程的有类聚合:
聚合后的路由使用自然掩码的路由形式发布。比如,对于10.1.1.0/24(metric=2)和10.1.2.0/24(metric=3)这两条路由,会聚合成自然网段路由10.0.0.0/8(metric=2)。RIP–2聚合是按类聚合的,聚合得到最优的metric值。
基于接口的聚合:
用户可以指定聚合地址。比如,对于10.1.1.0/24(metric=2)和10.1.2.0/24(metric=3)这两条路由,可以在指定接口上配置聚合路由10.1.0.0/16(metric=2)来代替原始路由。
水平分割(Split Horizon)的原理是,RIP从某个接口学到的路由,不会从该接口再发回给邻居路由器。这样不但减少了带宽消耗,还可以防止路由环路。
水平分割在不同网络中实现有所区别,分为按照接口和按照邻居进行水平分割。广播网、P2P和P2MP网络中是按照接口进行水平分割的,如下图所示:
RouterA会向RouterB发送到网络10.0.0.0/8的路由信息,如果没有配置水平分割,RouterB会将从RouterA学习到的这条路由再发送回给RouterA。这样,RouterA可以学习到两条到达10.0.0.0/8网络的路由:跳数为0的直连路由;下一跳指向RouterB,且跳数为2的路由。
但是在RouterA的RIP路由表中只有直连路由才是活跃的。当RouterA到网络10.0.0.0的路由变成不可达,并且RouterB还没有收到路由不可达的信息时,RouterB会继续向RouterA发送10.0.0.0/8可达的路由信息。即,RouterA会接受到错误的路由信息,认为可以通过RouterB到达10.0.0.0/8网络;而RouterB仍旧认为可以通过RouterA到达10.0.0.0/8网络,从而形成路由环路。配置水平分割后,RouterB将不会再把到网络10.0.0.0/8的路由发回给RouterA,由此避免了路由环路的产生。
对于NBMA(Non-Broadcast Multiple Access)网络,由于一个接口上连接多个邻居,所以是按照邻居进行水平分割的。路由就会按照单播方式发送,同一接口上收到的路由可以按邻居进行区分。从某一接口的对端邻居处学习到路由,不会再通过该接口发送回去。
在NBMA网络配置了水平分割之后,RouterA会将从RouterB学习到的172.16.0.0/16路由发送给RouterC,但是不会再发送回给RouterB。
毒性反转(Poison Reverse)的原理是,RIP从某个接口学到路由后,从原接口发回邻居路由器,并将该路由的开销设置为16(即指明该路由不可达)。利用这种方式,可以清除对方路由表中的无用路由。
配置毒性反转后,RouterB在接收到从RouterA发来的路由后,向RouterA发送一个这条路由不可达的消息(将该路由的开销设置为16),这样RouterA就不会再从RouterB学到这条可达路由,因此就可以避免路由环路的产生。
水平分割和毒性逆转都是为了防止RIP中的路由环路而设计的,但是水平分割是不将收到路由条目再按“原路返回”来避免环路,而毒性逆转遵循“坏消息比没消息好”的原则,即将路由条目按“原路返回”,但是该路由条目被标记为不可达(度量值为16)。
缺省情况下不使能毒性逆转。一般情况下,在华为设备中均使能水平分割(除NBMA网络外)而禁用毒性逆转。
RIP多进程允许为指定的RIP进程关联一组接口,从而保证该进程进行的所有协议操作都仅限于这一组接口。这样,就可以实现一台设备有多个RIP进程,不同RIP进程之间互不影响,它们之间的路由交互相当于不同路由协议之间的路由交互。
RIP多实例是为每个VPN实例绑定一个RIP进程,从而实现VPN实例与指定进程下的所有接口相关联。
网络上的链路故障会导致路由器重新计算路由,因此缩短路由协议的收敛时间对于提高网络性能是非常重要的。加快故障感知速度并快速通告给路由协议是一种可行的方案。
双向转发检测BFD(Bidirectional Forwarding Detection)是一种用于检测邻居路由器之间链路故障的检测机制,它通常与路由协议联动,通过快速感知链路故障并通告使得路由协议能够快速地重新收敛,从而减少由于拓扑变化导致的流量丢失。在RIP与BFD联动中,BFD可以快速检测到链路故障并通知RIP协议,从而加快RIP协议对于网络拓扑变化的响应。
配置如下:
AR1:
sysname AR1
#
interface GigabitEthernet0/0/0
ip address 10.1.1.1 255.255.255.252
#
interface LoopBack0
ip address 1.1.1.1 255.255.255.255
#
rip 1
version 2
network 10.0.0.0
network 1.0.0.0
#
AR2:
<AR2>dis current-configuration
#
sysname AR2
#
interface GigabitEthernet0/0/0
ip address 10.1.1.2 255.255.255.252
#
interface LoopBack0
ip address 2.2.2.2 255.255.255.255
#
rip 1
network 10.0.0.0
network 2.0.0.0
#
实验现象:
在AR1上开启的位RIPv2版本,路由表中并未收到从AR2中RIPv1发来的路由更新。
实验结果:
v2版RIP,将只发送v2,接收v2。
v1版本的RIP可以接收v2的报文。
当两边都是v2时,AR1可以收到AR2发送的2.2.2.2/32这条路由条目,AR2也可以收到1.1.1.1/32.
两边都是v1时,收到对方的路由条目都是有类路由,1.0.0.0/8和2.0.0.0/8。而v2版本中,收到的都是无类路由,1.1.1.1/32和2.2.2.2/32.
checkzero
//使能对RIP-1报文中的零域进行检查。
//RIP-1报文中的有些字段必须为零,称之为零域。RIP-1在接收报
//文时将对零域进行检查,零域的值不为零的RIP-1报文将不被处理。
//checkzero只对RIP-1报文有效。
host-route
//允许32位主机路由加到路由表里。
network network-address
//对指定网段接口使能RIP路由。
peer ip-address
//指定RIP邻居的IP地址。配置此命令后,更新报文以单播形式发
//送到对端,而不采用正常的组播或广播的形式。
preference 100
//配置RIP路由的优先级
rip authentication-mode
//配置RIP-2的认证方式及认证参数。
rip bfd
//指定接口上配置动态BFD会话的参数值。
rip input
//控制允许指定接口接收RIP报文。
rip output
//允许接口发送RIP报文。
rip metricin
//配置接口接收RIP报文时给路由增加的度量值。
rip metricout
//配置接口发送RIP报文给路由增加的度量值。
//缺省情况下,接口发送RIP报文时给路由增加度量值为1。
rip pkt-transmit
//指定接口上设置RIP发送更新报文的时间间隔和每次发送报文的数量。
//缺省情况下,RIP接口发送更新报文的时间间隔为200毫秒,每次发送的报文数量为50。
rip poison-reverse
//使能RIP的毒性反转功能。
rip split-horizon
//使能RIP的水平分割功能。
//如果毒性反转和水平分割都配置了,简单的水平分割行为(从某
//接口学到的路由再从这个接口发布时将被抑制)会被毒性反转行为代替。
rip summary-address
//配置RIP路由器发布一个聚合的本地IP地址。
silent-interface
//来抑制接口,使其只接收报文,用来更新自己的路由表,而不发送RIP报文。
summary [ always ]
//使能RIP有类聚合,指定有类聚合被使能,不论水平分割功能是否配置。
timers rip 30
//调整定时器。
//缺省情况下,路由更新报文的发送间隔为30秒,路由老化时间为180秒,路由被从路由表中删除的时间为120秒。
参考资料:华为HedEx文档