RIP协议简介和防回路原理

RIP协议是一种基于距离矢量算法(DV)的内部网关协议(IGP)。路由器之间通过交换RIP数据库来获得网络中其他网段是否可达和跳数距离的信息,并且基于跳数来决定报文转发路线。RIP中请求其他路由器信息的报文为请求报文,而向其他路由器发送自己的路由信息为应答报文(Response)

但是如果仅仅任由路由器之间交换RIP数据库信息,很有可能在网络情况发生变化的时候出现路由回路的情况,轻则耗费大量网络资源,重则使得整个网络瘫痪。因此,防止回路是每一个路由协议都不能缺少考虑的问题。

目前RIP已有RIPv1和RIPv2两版,第二版在其他很多方面兼容并扩充了第一版,但是在防止回路的方法上,第一版已经做得不错,第二版也没有什么扩充。RIP主要通过三种方法来防止产生路由回路:

  • 水平分割:路由器不会将来源于邻居分享的路由表项发送回来源。
  • 路由毒化:首先设定一个最大可达跳数(比如RIP的15跳),然后当网路发生变化,一个网段失去连接时,第一个发现的路由器不是直接删去记录,而是到该网段的跳数设置为大于最大可达跳数(如RIP会设置为16跳),使得该表项逻辑上失效。
  • 抑制计时器:当路由器收到某一网段可能失联的信息时,进入“怀疑状态”,启动一个抑制计时器。如果计时期间,收到的其他RIP报文中到这一网段的跳数比自己数据库中记录值小,就按照这个值更新并退出;如果RIP报文中收到的跳数相同或更大就忽略。到时后若还没有收到更加的跳数,就相信原来的失联的信息,并将该网段从路由表中删除。

准备工作

连接拓扑

按照如下拓扑图连接设备,其中为了模仿真实环境,路由器之间的连接都使用串口。不知道该怎么设置串口可以参考我的上一篇博客:用packet_tracer验证NAT机制

tuopu

其中R1到Router0之间这条串口线是后面测试的时候准备切断的线路。

配置RIP

以R1为例,可以在配置模式下这样配置开启RIPv1:

R1(config)#router rip
R1(config-router)#network 192.168.0.0
R1(config-router)#network 192.168.1.0
R1(config-router)#network 192.168.2.0

第一句表示开启rip路由协议,后面network表示我们将特定的网段加入到协议中,允许发现这个网段上其他的路由器以及分享数据,必须是直连的网段。

其他路由器也类似地配置就好,并不复杂。配置完成之后,可以在特权模式下通过show ip route查看路由表(前面带R的表示是通过RIP学来的),用show ip rip database命令来查看rip的数据库,可以很清楚的看到到远处网段的跳数和最佳出口(可能会有跳数相同的多条记录)。

最后为了能够方便验证抑制计时器机制,特地要把R4的更新周期改一下:Router(config-router)#timers basic 5 90 180 270 360,也就是把RIP发送更新报文的周期改为5s。

验证三种防回路方法

水平分割

即使不破坏现有的拓扑连接,也能看到水平分割在起着作用。进入模拟模式后,我们任选一台路由器发出的RIP报文,查看RIP报文的内容就不难发现,交换的报文中就不包含下一跳为目的路由器的RIP数据库条目。这是因为在发送报文之前,由于水平分割机制的存在,发送方路由器已经为接受方定制了自己要发送的报文,即已经把下一跳为目的方路由器的内容去掉了。

举例说明:

水平分割例证

路由毒化

这个是更容易验证的,只需要看一下删除R1和Router0连接的串口线之后观察R1、R2、R3后面的反应就可以了。

路由毒化的体现

同时,如果直接观察报文的内容,也可以看到200.0.0.0/24这个网段的Metric是0x10,也就是16。这样一来,这个网段就从逻辑上不可达了。

抑制计时器

这个是相对来说比较麻烦的,不过这里还是细致观察了Cisco Packet Tracer中1841路由器的抑制计时器机制的实现。

首先,就像抑制计时器机制中所介绍的,收到网段不可达的消息时抑制计时器就会启动,表现是路由器不会立刻将条目从路由表中删除,而是先设置为is possibly down。从上面的图中就能看出。在这个期间之内,只要遇到跳数更小的该网段信息才会解除计时并按照新消息更新,否则会忽略。计时器到时后就会正式将这个网段的条目删去。可以等一段时间之后再查看它们的路由表,发现确实没有了。

这样就验证了三种防回路的方式。在实际的效果上,RIP也确实杜绝了路由回路的发生,可以说卓有成效。

PacketTracer的RIP抑制计时器问题分析

有些情况下,经过特殊的设置,RIP中抑制计时器机制不能起到消除回路的作用。

首先声明一下:以下内容所描述的现象可能在实际的实验中很难出现或者根本不会出现,但是经过测试,在Packet Tracer中模拟使用1841时,RIP中抑制计时器不能起到消除回路的情况是存在的。

接下来看一下怎么触发这种情况。

准备工作:在R1,R2,R4中都配置Router(config-router)#timers basic 5 90 180 270 360,缩短他们发送RIP报文的周期为5s,唯独保持R3还是原本默认的30s。准备好后,进入模拟模式准备观察,然后叉掉R1和Router0之间连接的串口线。

状态1:R1发现自己可能到不了200.0.0.0/24网段了,发送消息给R2和R3,描述到达200.0.0.0/24的跳数为16跳,也就是不可达。

状态2:R2和R3更新自己的RIP数据库关于200.0.0.0/24的内容。在R2和R3都没有告诉R4关于200.0.0.0/24网段可能断开的消息之前,R4记录的内容仍然是到达200.0.0.0/24网段可以从R2或者R3经过且都是3跳。因此,R4在组织发给R2和R3的RIP报文时并不会把200.0.0.0/24的情况包括在内。

状态3R2由于发送RIP报文周期短,很有可能在R3之前将200.0.0.0/24跳数16的消息告知R4。此时,R4更新他的RIP数据库,设置到达200.0.0.0/24网段仅能通过R3到达,还是3跳。

状态4R4的RIP报文发送周期也很短,很有可能在R3告诉他“200.0.0.0从我这里也不可达”之前再把自己数据库中“从R3可达200.0.0.0”的情况告诉R2。这样一来,R2更新他的RIP数据库之后的内容是:从R4可达200.0.0.0,跳数为4。请注意:由于R2原来记录的200.0.0.0跳数为16,这次为4,比16小,所以R2确实会接受这样的更新

状态5:R3还是迟迟没有反应。(这也是个概率事件,如果在这之前R3提前反应了可以关掉软件重来试试)R2又把200.0.0.0/24的消息发给R1。和状态4中R2的反应差不多,R1会更新他的RIP数据库,就成了从R2可达200.0.0.0,跳数为5。

说到这里问题已经暴露出来了。接下来R3会更新为从R1可达200.0.0.0,跳数为6;然后R4会重新更新为从R3可达200.0.0.0,跳数为7;R2又更新为从R4可达200.0.0.0,跳数为8……形成了一个循环,抑制计时器的作用被这样的假消息给欺骗了。

不过幸运的是还有路由毒化机制在后面兜底,16跳不可达的规矩还在。这样,当循环到16跳的时候,就认为网段不可达了,之后也不会将跳数继续累加。最终所有路由器还是能够正确的删除200.0.0.0/24的路由条目,不过过程相对来说就比较艰辛了,也浪费了一定的资源。

下面是我在实验中使用的PacketTracer文件下载地址:

验证三种防回路方法,这个文件中R1,R2的周期是正常的,点击下载

验证PacketTracer的RIP抑制计时器问题的文件,点击下载

如有错误,欢迎指出!