TCPIP卷一(7):Routing Information Protocol—-RIP

Routing Information Protocol

RIP作为TCP/IP协议族中最早出现的内部距离矢量协议,采用了Bellman-Ford算法,IETF针对RIP开发了两个版本,一个为v1,v2针对v1增强了许多特性。

RIP的基本原理和实现

TCPIP卷一(7):Routing Information Protocol—-RIP

RIP协议使用UDP的520端,将路由器条目从开启了RIP进程的接口发送出去,RIP有两种消息类型:1、请求消息:用于向邻居请求一个邻居更新 2、响应消息:用于传递路由更新。 针对v1来说,使用广播地址255.255.255.255发送,而v2则使用组播地址 224.0.0.9。

当一个路由器开始运行RIP协议后,每个启用RIP协议的接口开始组播或者广播带有请求消息的数据包,并且监听来自其他路由器的RIP请求或响应消息,接收到请求消息的邻居路由器则回复它们路由表中包含的路由表信息,以响应消息回应。
当路由器收到关于邻居的响应消息后,它会查看这个响应消息中包含的路由条目是否为最新,如果最新则放入路由表,如果响应消息中包含的路由存在于路由表中,则比较两者之间的hop(跳数),小的则进入路由表,替换掉原来的路由条目。

RIP的计时器和稳定性

无论是v1还是v2,在一个路由器上运行RIP后,每个30s更新周期就会从运行了RIP协议接口不断发送响应消息,当然,其中不包括水平分割原则在内的路由信息,这30s不是绝对的,为了防止同步存在,引用了一个随机变量值,这个变量值为15%,也就是说在25.5~30s之间变化。

无效计时器:当一个运行RIP的路由器,成功收到一条路由后,这条路由就会关联一个计时器,这个计时器初始化为180s,当每个更新周期内从邻居那再次收到这台路由后,则刷新计时器(还原180s),如果在6个更新周期,也就是180s后没有收到这条路由的信息,那么就进入possibly down状态,标记跳数为16跳。

刷新计时器(flush timer):这个计时器在240~60s,在Cisco中为60s,其实,这60s是为了让进入possibly down状态的路由,正确的通告给邻居,让它们知道这条路由已经失效了, 由于进入possibly down状态之前必须要经历180s,所以,flush timer的总时间为,invalid timer 180s +possibly down 60s=240s

抑制计时器(Holdwn timer):这个计时器在Cisco路由器上是存在的,虽然IETF的RFC中并没有介绍holdwns,它的作用是当一条路由更新的跳数大于现存在路由表中的跳数,那么这条路由则进入180s的抑制阶段,直到180s后如果还是从邻居收到同样的跳数,那么该路由的信息被更新。

RIP Version 1

一、RIP V1的消息格式
TCPIP卷一(7):Routing Information Protocol—-RIP

1、命令:有1~2的取值,1代表请求信息,2代表响应消息
2、版本号:标示该rip的协议工作在哪个版本
3、地址族标示:对于IP来说为2
4、IP Address:路由的目标地址
5、度量:RIP以跳数为度量,取值1~16
6、无论是V1还是V2,RIP每个更新包中最多携带25个条目

可以看出来,关于RIP v1中许多字段没有比定义,都是为未使用,也同时说明ripv1工作在于有类路由协议的情况下,因为它在传递路由信息的时候 是不携带子网掩码信息的。

案例分析一:有类路由协议更新路由的过程

TCPIP卷一(7):Routing Information Protocol—-RIP

地址信息如图标识,保证直连网络能通
R1(config)#router rip
R1(config-router)#network 12.0.0.0

R2(config)#router rip
R2(config-router)#network 12.0.0.0
R2(config-router)#network 172.17.0.0
R2(config-router)#network 172.16.0.0

R3(config)#router rip
R3(config-router)#network 172.16.0.0
可以看出来,RIP的宣告方式是直接宣告主类网络,由于RIP是早期的路由协议,所以,不能通过反掩码的方式来匹配宣告的范围。

Network的含义:匹配上network范围的网段都参路由协议,并且把这个网段宣告出去。

TCPIP卷一(7):Routing Information Protocol—-RIP

可以看出来,RIP v1的更新方式非常简单,就是以广播形式,4个255,并且周期性的更新路由表的所有信息给邻居,也就是发送Response,关于Request的话,只有当RIP刚开始启用,或者通过人为的方式clear ip route * 它才会发送Request的信息,来请求邻居的路由。

TCPIP卷一(7):Routing Information Protocol—-RIP

可以看出,抓包内容中,携带的内容与卷一给出的数据包格式是一样的,命令为2,也就是response, 版本为1, IP地址、地址族、度量值,并没有携带关于任何的子网掩码信息。

地址族:默认情况下,所有TCP/IP协议都工作在IPv4下,所以,不需要手工去输入关于地址族的信息,如果对于以后接触了MPLS ***或者VRF,IPV6组播的话,那么都需要跟在特定的地址族中进行对应的操作。

TCPIP卷一(7):Routing Information Protocol—-RIP

可以看出来关于172.17.1.1/24的路由条目,在R3收到以后是172.17.0.0/16了,而172.17.2.1/24,则不便,下面看下有类路由协议的更新规则和接收规则

R2发送更新规则

1、2向3广播的网络网络是否与源接口(发送路由更新的接口) 处于同一个主类网络
2、如果不是,则R1在主网络边界自动汇总网络或子网并广播该网络
3、如果是,则判断网络(所连接的掩码)与源接口是否有相同的子网掩码
4、如果是,则广播该路由
5、如果不是,则丢弃该路由。除非次路由是主机路由,并且路由器支持。


R3接受更新的规则

1、判断从更新接受的子网与接受的端口是否处于同一主类网络
2、如果是,则R3使用接受接口的掩码。如果是32位路由,则R3使用主机掩码
3、如果不是,则判断主网络中的任一子网是否已在路由表中,并且是从另外一个接口所学习到
4、如果是,则R3忽略更新
5、如果不是,则路由器R3用有类掩码。


1、关于172.17.1.1/24的路由,查看与更新源接口是否是同一主类网络,在这里172.17和172.16明显不处于同一主类网络,所以,则在边界执行自动汇总,以172.17.0.0/16广播该子网

2、关于172.16.2.1/24,它与更新源接口是处于同一主类网络,紧接着判断是否与源接口有相同的子网掩码,在这里都为24,所以,广播该路由信息。

3、假设这时候,把R2的172.16.2.1/24改成25的话,那么它还会收到路由么?

R2(config-if)#int lo 1
R2(config-if)#ip add 172.16.2.1 255.255.255.128
R3#clear ip route *

这里说下clear ip route *的作用,因为对于RIP来说,它是没有邻居的概念的,所有的路由都存放在database中,当执行了clear ip route *后,就是强制让RIP发送Request消息给邻居,重新获取路由条目。

TCPIP卷一(7):Routing Information Protocol—-RIP

可以看到,关于172.16.2.0/24的路由信息,并没有收到,这是因为它跟源接口处于同一主类网络,但是子网掩码不匹配,所以,直接丢弃。

案例分析二:主机路由出现的原因

这是卷一中没有提到的,关于RIP v1来说,有时候我们在做实验的时候,莫名奇妙的就有条32位的主机路由,它是怎么出现的呢?

TCPIP卷一(7):Routing Information Protocol—-RIP

关于12.1.5.0在R1上可是以24位的掩码出现的,并且,在R1上更新该路由的时候,与源接口处于同一主类网络和子网掩码也是相同的,那么它为什么会出现呢。很简单,关于有类路由协议除了在发送时有规则,而且在接收时候,同样有规则进行匹配,可以看之前提到过的有类协议接收时的规则, 2、如果是,则R2使用接受接口的掩码。如果是32位路由,则R2使用主机掩码。

这条32位路由出现的规则:路由表是用于存放网段信息的,所有因该都是网络地址,而不是主机地址,但是在RIPv1中,当收到一条路由的时候,如果是同一主类,那么该接口IP地址的掩码长度来检查,最后计算出是否为主机地址,如果是,就以32位的主机路由存放在路由表中。

当R2收到一条RIPv1更新过来的12.1.5.0的网段,会用自己接口的掩码长度来进行计算看是否属于主机路由,过程为23位掩码的长度为9位,那么就查看这条路由的后9位是否全为0,如果不是,则为主机路由,12.1.5.0 的5.0换算成二进制为0000 0101 0000 0000,第9位为1,不是全部为0,所有会以32位的主机路由存放在路由表中,而如果是12.1.6.1/24的话,那么 6.0 表示为 0000 01100 0000 0000 ,9位全部为0,所以会以接口的掩码存放在路由表中。

案例分析三:Secondary的应用

TCPIP卷一(7):Routing Information Protocol—-RIP

这时候,R3的地址已经改为23.1.1.2了,那么在正常情况下 R2和R3是相互收不到对方的路由信息的。

TCPIP卷一(7):Routing Information Protocol—-RIP

通过debug信息可以看出来,R3忽略了来自1726.1.1的跟新,原因是不在同一网段中

这时候,在R3上配置一个secondary的地址,与R2处于同一网段

R3(config)#int f0/1
R3(config-if)#ip address 172.16.1.2 255.255.255.0 secondary

TCPIP卷一(7):Routing Information Protocol—-RIP

发现开始接收和发送跟新了,发送更新的时候,则以23.1.1.2主地址和辅助izhi 172.16.1.2同时发送更新。

TCPIP卷一(7):Routing Information Protocol—-RIP

路由已经成功收到了,关于辅助地址还有很多的应用,比如不连续子网的解决方案,但是,对于现网中 已经不存在这样的环境了,所以,只需要了解有这么种情况存在即可, 我们学习网络知识,因该以实际环境的情况下进行学习,对于已经淘汰或者即将不用的技术,只需要做适当的了解。

RIP Version 2

RIP v2在v1的基础上增加了许多扩展性,同时v2作为无类路由协议的存在,因为它的字段中增加了子网掩码信息。

RIP Version 2的协议字段

TCPIP卷一(7):Routing Information Protocol—-RIP

RIPv2的数据包字段:

1、命令:取值1~2,1为请求消息,2为响应消息
2、版本号:标示该RIP工作在哪个版本
3、地址族标识:对于IP来说为2
4、路由标记:标记外部路由重分布进RIP后打上的标记(Tag)
5、IP address:IPV4的目的地址,可以是主网络、子网或主机路由
6、子网掩码:标识该路由条目的网络和子网部分
7、下一跳:一个标示更靠近目的地的下一跳地址,如果为0.0.0.0,那么通告路由器就是最优的下一跳
8、度量:标示路由条目的metric,取值1~16
9、无论是V1还是V2,RIP每个更新包中最多携带25个条目,但是,如果v2启用了认证的话,那么就会占用一些字节,最多携带24个条目

可以看出,V2对于协议字段增加了,路由标记、下一跳、和子网掩码,这也使得v2更加适合当前的网络,路由标记在后续的路由协议中都会提到,它就是把另外一个路由协议的路由重分布进当前的路由协议中,打上一个烙印,发后续做策略或者过滤使用。

另外一个改变,就是RIP v2采用的是组播更新了,使用的地址是224.0.0.9,组播更新有什么好处? 先谈下广播更新,一个路由器收到一个广播的时候,先查看的是二层的封装信息,MAC地址在二层显示为全F,一个路由器收到一个关于全F的数据包,必须交给三层以上进行处理,再次看 组播更新,由于组播的地址是可以与二层MAC做映射关系的,224.0.0.9对应的MAC地址是0100.5e00.0009 ,至于怎么换算,在组播部分在讨论。一个路由器收到一个关于组播地址的MAC,它只会查看是否与监听这个MAC的进程存在,比如开启了RIP,那么除了监听RIP的UDP5 520端口以外,其实还会监听组播MAC地址的,相当来说组播更加节约资源和安全性。 对于,这类组播地址,称为本地链路地址,也就是说TTL=1,只能和相连的路由器进行路由协议数据包的交互。这点是卷一中没有提到过的。

案例分析一:与RIPv1的兼容性

对于RIPv2的新版本定义的时候,考虑到网络中可能有些主机或者路由器还处于v1的状态,RFC1723中定义了一个兼容性开关,允许v2与v1之间进行相互操作。

1、rip-1:只有RIPV1的消息被传送
2、rip-1兼容性:RIPV2使用广播方式代理多播来通告消息,以便ripv1能够接收,接口下 ip rip v2-broadcast
3、RIP-2:RIPV2能够使用多播方式将消息通告到目的地224.0.0.9
4、Node:不发送更新,在Cisco中相当于passive interface

TCPIP卷一(7):Routing Information Protocol—-RIP

地址信息如图,在R1上运行v1,而R2与R3则运行V2版本。

R1(config)#router rip
R1(config-router)#network 12.0.0.0

R2(config)#router rip
R2(config-router)#version 2
R2(config-router)#network 12.0.0.0
R2(config-router)#network 172.16.0.0

R3(config)#router rip
R3(config-router)#network 172.16.0.0
R3(config-router)#version 2

TCPIP卷一(7):Routing Information Protocol—-RIP

可以看到 关于R1运行的是RIP v1,而它接收了来自R2的v2的路由更新

TCPIP卷一(7):Routing Information Protocol—-RIP

而R2则忽略掉关于从12.1.1.1来的路由更新,不合法的版本

TCPIP卷一(7):Routing Information Protocol—-RIP

从show ip protocols可以查看当前运行路由协议的情况,可以看到 当前RIP处于v1版本,发送的是send version 1,receie any version,也就是说接收任何版本的信息。

TCPIP卷一(7):Routing Information Protocol—-RIP

所以,R1的路由表中有关于其他网络的路由信息

TCPIP卷一(7):Routing Information Protocol—-RIP

R2没有收到任何的信息,因为它忽略了来自R1的更新

TCPIP卷一(7):Routing Information Protocol—-RIP

可以看到关于R2是运行version 2的,所以它只send verison 2 , rcceive version 2 ,对于R1发送过来的RIP包携带的版本字段为1,所以,直接忽略了

解决办法

R2(config)#int f0/0
R2(config-if)#ip rip receive version 1 2

这时候,让R2在f0/0的接口行,能够接收v1的路由信息。

TCPIP卷一(7):Routing Information Protocol—-RIP

路由已经收到了,32位主机路由已经介绍过股则了,那么为什么12.1.6.0是23位的,它从发送规则来看的话,因该是24位的,因为接口处于24位,但是,不要忽略了接收规则,它也会匹配是否主类网络,如果是,则以R2的接口地址掩码作为该路由的掩码,也就是12.1.6.0为23的原因。

案例分析二:自动汇总和手动汇总

TCPIP卷一(7):Routing Information Protocol—-RIP

地址信息如图,所有路由器都运行RIP v2,查看路由的情况

TCPIP卷一(7):Routing Information Protocol—-RIP

关于R1收到的路由信息都是主类边界的,这是为什么?

因为,无论是RIP还是EIGRP在默认情况下,都是开启了自动汇总的,自动汇总在某些环境下就不是那么好了,这样会造成路由不精确性,所以,我们必须在RIP上面关闭自动汇总。

在RIP进程中,输入 no auto-summary

TCPIP卷一(7):Routing Information Protocol—-RIP
TCPIP卷一(7):Routing Information Protocol—-RIP

每个路由器都以正常的掩码显示了。

手动汇总,对于12网段的路由来说,在R3中有4条信息,那么我们可以让它汇总成一条存在于路由表,这样能够加快查表速度,和路由器的资源。

R1(config)#int f0/0
R1(config-if)#ip summary-address rip 12.1.0.0 255.255.0.0

TCPIP卷一(7):Routing Information Protocol—-RIP
TCPIP卷一(7):Routing Information Protocol—-RIP

关于路由已经汇总了,这样有效的节约了路由表的资源。

案例分析三:被动接口和单播更新

    被动接口在实际应用中是非常广泛的,也是非常有必要的,在IGP协议中,包括RIP、EIGRP、OSPF、ISIS都支持被动接口的特性,被动接口就是让该接口不参与某个路由协议的进程,不同的协议实现不同,比如RIP实施被动接口,但是,它还是能接收更新,但是,在EIGRP或者OSPF中则不收也不发。
TCPIP卷一(7):Routing Information Protocol—-RIP

在这个网络中,R1和R2需要进行正常的RIP路由更新,但是,为了安全起见,不向PC发送RIP的更新信息,防止让不合法的用户监听网络中的信息,通过注入恶意的路由,影响网络的正常。 这里R1有个loopback口 1.1.1.1/32

R1(config)#router rip
R1(config-router)#passive-interface f0/0

R2(config)#router rip
R2(config-router)#passive-interface f0/0

TCPIP卷一(7):Routing Information Protocol—-RIP

这时候,R2和R1收不到任何的路由信息了,因为接口被抑制了。

R1(config)#router rip
R1(config-router)#neighbor 172.16.1.2

R2(config)#router rip
R2(config-router)#neighbor 172.16.1.1

TCPIP卷一(7):Routing Information Protocol—-RIP

这时候,R2就能够收到关于R1的路由更新了。

主机是收不到关于这个的路由信息的,因为R1这时候是单播更新了。

案例分析四:认证

关于RIP的认证,支持MD5和明文认证,明文认证非常简单,通过配置一个共同的key,匹配了则认为路由正常,如果这时候非法者在中间进行抓包的话,那么这个密码是可见的,所以对于明文认证,不建议采用。

MD5的工作方式:也是双方配置一个key,但是在发送路由更新的时候,会把路由条目信息和这key做hash,得到的结果放入RIP的数据包中,当邻居收到以后,它会以同样的方法,路由条目信息+key做hash,与之前的做比对,如果匹配则认证通过,不匹配则不接收。这样,既保证了安全,又不让key在报文中出现。

R1(config)#key chain 1
R1(config-keychain)#key 1
R1(config-keychain-key)#key-string cisco
R1(config)#int f0/0
R1(config-if)#ip rip authentication mode md5
R1(config-if)#ip rip authentication key-chain 1

TCPIP卷一(7):Routing Information Protocol—-RIP

提示无效的认证,则时候需要在R2上配置对应的Key才行

R2(config)#key chain 1
R2(config-keychain)#key 2
R2(config-keychain-key)#key-string cisco
R2(config)#int f0/0
R2(config-if)#ip rip authentication mode md5
R2(config-if)#ip rip authentication key-chain 1
注意,在RIP中是不需要匹配key id的,但是,在EIGRP中必须匹配,否则认为不无效。

TCPIP卷一(7):Routing Information Protocol—-RIP

这时候,路由已经成功收到了。

总结:关于RIP协议在现网中应用不是很多了,可以说已经是淘汰的协议,所以,在学习的过程中,我们只需要了解这个协议的特性和工作过程即可。没有太多必要去深入学习该协议,对于后续的EIGRP和OSPF则因该多深入,因为在现网中应用是非常多的,特别是OSPF。

本文首发于公众号:网络之路博客

上一篇:RabbitMQ(十)——Routing 之订阅模型-Topic


下一篇:MYSQL外键(Foreign Key)的使用