RIP简介
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原理描述
RIP基本原理:
RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量值来衡量到达目的地址的距离。在RIP网络中,缺省情况下,设备到与它直接相连网络的跳数为0,通过一个设备可达的网络的跳数为1,其余依此类推。也就是说,度量值等于从本网络到达目的网络间的设备数量。为限制收敛时间,RIP规定度量值取0~15之间的整数,大于或等于16的跳数被定义为无穷大,即目的网络或主机不可达。由于这个限制,使得RIP不可能在大型网络中得到应用。
RIPv1报文:
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报文抓包示例:
RIPv1的特点:
- 有类别路由协议。
- 广播更新。
- 基于UDP,端口号520.
RIP是一个基于UDP的路由协议,并且RIPv1的数据包不能超过512字节(RIP报文头部占用4个字节,而每个路由条目占用20个八位组字节。因此,RIP消息最大为4+(25*20)=504个字节,再加上8个字节的UDP头部,所以RIP数据报的大小(不含IP包的头部)最大可达512个字节。)。RIPv1的协议报文中没有携带掩码信息,所以RIPv1在发送和接收路由更新时会根据主类网段掩码和接口地址掩码来处理路由条目。因此RIPv1无法支持路由聚合,也不支持不连续子网。RIPv1的协议报文中没有验证字段,所以RIPv1也不支持验证。
RIP工作过程分析:
- 初始状态:路由器开启RIP进程,宣告相应接口,则设备就会从相关接口发送和接收RIP报文。
- 构建路由表:路由器依据收到的RIP报文构建自己的路由表项
- 维护路由表:路由器每隔30秒发送更新报文,同时接收相邻路由器发送的更新报文以维护路由表项。
- 老化路由表项:路由器为将自己构建的路由表项启动180秒的定时器。180秒内,如果路由器收到更新报文,则重置自己的更新定时器和老化定时器。
- 垃圾收集表项:如果180秒过后,路由器没有收到相应路由表项的更新,则启动时长为120秒的垃圾收集定时器,同时将该路由表项的度量置为16。
- 删除路由表项:如果120秒之后,路由器仍然没有收到相应路由表项的更新,则路由器将该表项删除。
RIP路由表的形成:
RIP启动时的初始路由表仅包含本设备的一些直连接口路由。通过相邻设备互相学习路由表项,才能实现各网段路由互通。
RIP路由表形成过程如上图所示:
- RIP协议启动之后,RouterA会向相邻的路由器广播一个Request报文。
- 当RouterB从接口接收到RouterA发送的Request报文后,把自己的RIP路由表封装在Response报文内,然后向该接口对应的网络广播。
- RouterA根据RouterB发送的Response报文,形成自己的路由表。
RIPv1的发送和接收规则:
RIPv1的发送规则:
注意发送时没有子网掩码。
将要发送的前缀路由和出接口网段匹配:
- 如果不在同一主网,此为主网边界,将前缀自动汇总为有类网段发送前缀到出接口。
- 如果在同一主网,检查发送的前缀是否为32位:
- 如果是,发送32位前缀到出接口。
- 如果不是,检查前缀和出口掩码是否相同:
- 如果不同,抑制发送或者汇聚为主网络号。
- 如果相同,没有边界,发送正确的前缀到出接口。
RIPv1接收规则:
收到一个前缀后,如果发现是主网络号,直接放入路由表,掩码是8/16/24.
如果不是主网络号,检查是否在同一主网:
- 如果不在,生成有类路由,掩码按有类路由计算。
- 如果在同一主网,用接口掩码去掩,然后检查该前缀是网络地址还是主机地址:
- 如果是网络地址,生成路由,掩码等于自己的接口掩码,放入路由表。
- 如果不是网络地址,就默认是主机地址,生成32位路由,放入路由表。
RIP的更新与维护:
RIP协议在更新和维护路由信息时主要使用四个定时器:
- 更新定时器(Update timer):当此定时器超时时,立即发送更新报文。
- 老化定时器(Age timer):RIP设备如果在老化时间内没有收到邻居发来的路由更新报文,则认为该路由不可达。
- 垃圾收集定时器(Garbage-collect timer):如果在垃圾收集时间内不可达路由没有收到来自同一邻居的更新,则该路由将被从RIP路由表中彻底删除。
- 抑制定时器(Suppress timer):当RIP设备收到对端的路由更新,其cost为16,对应路由进入抑制状态,并启动抑制定时器。为了防止路由震荡,在抑制定时器超时之前,即使再收到对端路由cost小于16的更新,也不接受。当抑制定时器超时后,就重新允许接受对端发送的路由更新报文。
RIP路由与定时器之间的关系:
- RIP的更新信息发布是由更新定时器控制的,默认为每30秒发送一次。
- 每一条路由表项对应两个定时器:老化定时器和垃圾收集定时器。当学到一条路由并添加到RIP路由表中时,老化定时器启动。如果老化定时器超时,设备仍没有收到邻居发来的更新报文,则把该路由的度量值置为16(表示路由不可达),并启动垃圾收集定时器。如果垃圾收集定时器超时,设备仍然没有收到更新报文,则在RIP路由表中删除该路由。
注意事项:
- 如果设备不具有触发更新功能,一个路由表项最多需要300秒才能被删除(老化时间+垃圾收集时间)。
- 如果存在触发更新,那么一个路由条目最多需要120秒才能被删除(即为垃圾收集时间)。
触发更新:
触发更新可以缩短网络收敛时间。在路由表项变化时立即向其他设备广播该信息,而不必等待定时更新。如果没有触发更新,缺省情况下,失效的路由条目会在路由表停留最多300秒(老化定时器+垃圾收集定时器)。
RIPv2的增强特性:
RIPv2特点:
- 无类别路由协议。
- 组播更新,组播地址224.0.0.9
- 基于UDP,端口号520.
- 支持外部Tag。
- 支持路由聚合和CIDR
- 支持指定下一跳。
- 支持认证。
RIPv2的报文:
字段解释:
字段名 | 长度 | 含义 |
---|---|---|
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报文抓包示例:
RIPv1与RIPv2的比较:
- RIPv1是有类路由协议,RIPv2是无类路由协议
- RIPv1不能支持VLSM,RIPv2可以支持VLSM
- RIPv1没有认证的功能,RIPv2可以支持认证,并且有明文和MD5两种认证
- RIPv1没有手工汇总的功能,RIPv2可以在关闭自动汇总的前提下,进行手工汇总
- RIPv1是广播更新,RIPv2是组播更新,
- RIPv1对路由没有标记的功能,RIPv2可以对路由打标记(tag),用于过滤和做策略
- RIPv1发送的updata最多可以携带25条路由条目,RIPv2在有认证的情况下最多只能携带24条路由
- RIPv1发送的updata包里面没有next-hop属性,RIPv2有next-hop属性,可以用与路由更新的重定
RIPv2路由聚合:
路由聚合的原理是,同一个自然网段内的不同子网的路由在向外(其它网段)发送时聚合成一个网段的路由发送。
- RIPv2支持路由聚合,因为RIPv2报文携带掩码位,所以支持子网划分。在RIPv2中进行路由聚合可提高大型网络的可扩展性和效率,缩减路由表。
- 基于RIPv2进程的有类聚合即实现自动聚合。
- 基于接口的聚合即实现手动聚合。
- 如果被聚合路由携带了Tag,那么路由聚合发生之后,Tag信息将被清除。
路由聚合有两种方式:
基于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)来代替原始路由。
RIP的特性:
水平分割:
水平分割(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实例与指定进程下的所有接口相关联。
RIP与BFD联动:
网络上的链路故障会导致路由器重新计算路由,因此缩短路由协议的收敛时间对于提高网络性能是非常重要的。加快故障感知速度并快速通告给路由协议是一种可行的方案。
双向转发检测BFD(Bidirectional Forwarding Detection)是一种用于检测邻居路由器之间链路故障的检测机制,它通常与路由协议联动,通过快速感知链路故障并通告使得路由协议能够快速地重新收敛,从而减少由于拓扑变化导致的流量丢失。在RIP与BFD联动中,BFD可以快速检测到链路故障并通知RIP协议,从而加快RIP协议对于网络拓扑变化的响应。
RIP故障排除流程:
- 检查接口是否在RIP中使能:使用display rip process-id interface 可以查看运行rip的接口;
- 检查对方发送版本号和本地接口接收的版本号是否匹配:缺省情况下,接口只发送RIPv1报文,但可以接收RIPv1和RIPv2报文。当入接口与收到的RIP报文使用不同的版本号时,有可能造成RIP路由不能被正确的接收;
- 检查在RIP中是否配置了策略,过滤掉收到的RIP路由:如果被路由策略过滤掉,则需修改路由策略;
- RIP使用的端口520是否被禁用;
- 检查接口是否配置了undo rip input/output或者rip metricin设置度量值过大;
- 检查接口是否配置了抑制接口;
- 检查路由度量值是否大于16;
- 检查链路两端是否配置了认证,认证的配置是否正确。
RIPv1和RIPv2的兼容性问题
- RIPv1和RIPv2默认互相不兼容。
- 运行RIPv2的路由器默认只发送和接收v2的报文,不接收v1的报文。
- 运行RIPv1的路由器可以接收v2的报文。
RIPv1和RIPv2兼容性实验验证:
配置如下:
AR1:
1 | sysname AR1 |
AR2:
1 | <AR2>dis current-configuration |
实验现象:
在AR1上开启的位RIPv2版本,路由表中并未收到从AR2中RIPv1发来的路由更新。
图:在AR2上配置为RIPv1,收到了从AR1中发送的路由,1.1.1.1/32路由条目。
实验结果:
v2版RIP,将只发送v2,接收v2。
v1版本的RIP可以接收v2的报文。
当两边都是RIPv2时:
当两边都是v2时,AR1可以收到AR2发送的2.2.2.2/32这条路由条目,AR2也可以收到1.1.1.1/32.
当两边都是RIPv1时:
图:当两边都是v1版本时,AR1的路由表
图:当两边都是v1版本时,AR2的路由表
两边都是v1时,收到对方的路由条目都是有类路由,1.0.0.0/8和2.0.0.0/8。而v2版本中,收到的都是无类路由,1.1.1.1/32和2.2.2.2/32.
RIP配置命令
1 | checkzero |
参考资料:华为HedEx文档