距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

news2024/12/26 23:50:28

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

简介

距离矢量路由协议(Routing Information Protocol, RIP)是一种内部网关协议,它位于应用层,使用520 UDP端口。RIP基于距离矢量算法(Bellham-Ford)根据metric来衡量目的地址的距离。

原理

基本原理

对于RIP协议,路由器只会和相邻的路由器交换路由表,通常包含:

  • 目的网络
  • 距离
  • 下一跳路由

RIP规定每经过一个路由器跳数加1,最多15跳,当一个路由条目对应的跳数为16跳的时候会被认为距离是无限大,即不可达。

RIP工作流程如下:

  • 路由器激活RIP,立刻发送一个Request报文和一个Response报文,并开始监听链路上的RIP协议报文。
  • 对应的接口会周期性发送Response报文一个Response报文最多携带25个路由条目,当超过这个数字时使用多个报文。
  • 当另一启用了RIP的路由器接收Request报文后,会使用相应的Response报文回应,并在该报文中携带对应的路由信息。
  • 当另一启用了RIP的路由器接收Response报文后,会解析该报文中的路由信息,如果报文中的路由条目是自己未发现的,并且路由的度量值有效,则路由器将学习该路由并加载到路由表。(同时设置度量值、出接口、下一跳)

计时器

RIP的四个计时器

RIP主要有四个计时器:

  • 更新计时器(Update timer):每次更新 30 seconds RIP,都是完整路由表,不过要排除被 split-horizon 抑制的路由条目。 为了防止路由表全局同步,update timer 值被设计成一个小范围内的随机值 (25-35s),思科路由器上一般为 25.5-30s。随机值的意义在于防止同时更新洪泛Response报文导致不必要的冲突
  • 失效计时器(Invalid timer):路由器在 180s 内没有收到特定路由条目的更新,则视此路由条 目为非法或不可达,将它的 hop count 设置为 16。启动失效计时器,标志这条路由条目失效,并且这个路由器会给所有相邻的路由器发送更新消息通告这条路由条目失效。标记为 16 跳。
  • 刷新计时器(Flush Timer或garbage collection timer flush): 计时器满时,该路由条目将会从路由表中被移除,默认为 240s。
  • 抑制计时器(Holddown Timer): 只有当失效计时器周期结束时,抑制计时器才会被激活。一旦路由器收到了关于某条路由条目的更新,并发现其 metric 值比本路由表中记录的 metric值大时,将会对这条路由设置 holddown timer,直至计时器周期结束才会接受这条次优路径,默认为 180s。

缺点

RIP协议有如下缺点:

  • 过于简单,以跳数为依据计算度量值,经常得出非最优路由。例如:2 跳 64K 专线,和 3 跳 1000M 光纤,显然多跳一下没什么不好。
  • 度量值以 16 为限,不适合大的网络。解决路由环路问题,16 跳在 rip 中被认为是无穷大,RIP是一种域内路由算法自治路由算法,多用于园区网和企业网。
  • 收敛性差,时间经常大于 5 分钟。
  • 消耗带宽很大。完整的复制路由表,把自己的路由表复制给所有邻居,尤其在低速广域网链路上更以显式的全量更新。
  • 容易产生环路(先天缺陷,有后天的防环机制)
  • 缺少主动发现网络变化机制(无拓扑信息,不知道全网链路,只知道自己直连)

防环机制

在刚在我们就说到过,RIP协议发送路由表,如果路由表相互包含则容易产生环路。协议本身就容易导致环路,故需要一系列防环机制:

  • 跳数上限:上限16跳,设定包的生命周期,这在一定程度上减少了环路产生带来的问题,但无法避免。
  • 水平分割:不向原始路由更新来的方向再次发送路由更新信息,即单向更新、单向反馈。可以进入某个接口,使用命令 no ip split-horizon 关闭水平分割。例如,R1路由从Fa0/0接口向R2路由的Fa0/1接口发送路由信息,对于R2来讲不再从Fa0/1接口发送路由更信息。
  • 路由毒化:又叫路由中毒。若 RIP 的路由条目出现故障时,会立即将此路由标记为 16 跳,并发送给邻居,告知邻居此路由有问题,尽快删除。
  • 抑制计时器:抑制计时器告诉路由器把可能影响路由的任何改变暂时保持一段时间, 抑制时间通常比更新信息发送到整个网络的时间要长。
  • 毒性逆转:如果Z的最短路径要通过邻居Y,那么它将告诉Y自己到目的节点的距离是无穷大。这样,Z向Y撒了一个善意的谎言,使得只要Z经过Y选路到X,它就会一直持续讲述这个谎言,这样Y也就永远不会尝试从Z选路到X了,也就避免了环路问题。由于这个方案不用路由间更新报文,所以优先于路由毒化

触发更新与Silent模式

触发更新(Trigger Update)与周期性更新不同,它不会触发接收端的路由器重置其 update timer, 因为这样会引起许多路由器在同时重置它们的 update timer,最终导致全局路由同步,而这是我们不希望看到的。 同时为 了避免 trigger storm(触发更新风暴),会产生一个随机值(1-5 秒), 连续的触发更新必须等待相 应的时间才可再被发出。 当路由表发生变化时,更新报文立即广播给相 邻的所有路由器,而不是 等待 30 秒的更新周期。同样,当一个路由器刚启动 RP 路由协议时,它广播请求报文。收到此广播 的相邻路由器立即应答一个更新报文, 而不必等到下一个更新周期。这样,网络拓扑的变化会最快 地在网络上传播开, 减少了路由循环产生的可能性。

Silent模式(Silent Mode) 在 UNIX 系统上,使用 routed -q 参数可以将 RIP 置于一种“silent”模式,这种模式下不会主动发送路由更新,只是监听并根据需要修改自已本地的路由表。

RIPv1

报文结构

RIPv1报文结构如下图所示

RIPv1报文结构

下面来说说各个字段的功能:

  • 命令(Command):用于标识RIP报文类型。当值为1的时候,报文为Request;当值为2的时候,报文为Response类型。
  • 版本(Version):在RIPv1中,该字段为1。
  • 地址簇标识符(Address Family Identity AFI):该字段为2的时候表示IP协议;该字段为0表示且报文为Request类型,则说明用于向直连路由请求整个路由表,同时仅包含一个路由条目,目的IP地址为0.0.0.0,度量值即metric跳数为16。
  • IP地址(IP Address):路由的目的网络地址。
  • 度量值(Metric):到达目的网络的开销值。

问题

通过报文结构我们就能看到缺少了一个很重要的东西——子网掩码。没错,RIPv1版本协议并不支持在报文中携带目的网络的子网掩码。

因此,有类别路由选择协议首先必须匹配一个目的地址对应 A,B,C 类的主网络号,对于每一个通过路由器的数据包有如下操作:

  • 如果目的地址是一个路由器直接相连的主网络的成员,那么该网络的路由器接口 上配置的子网掩码将被用来确定目的的地址的子网,因此,在那个主网络中必须自始至终 地统一使用这个相同的子网掩码。
  • 如果目的地址不是一个和路由器直接相连的主网络的成员,那么路由器将仅仅尝 试去匹配该目的的地址对应于A类,B类或 C类的主网络号。

我们抓包看一下:

RIPv1抓包

更详细的信息如下图:

RIPv1抓包详细信息

由此可得知:RIPv1 仅支持有类路由协议,并且在路由更新中不发送子网掩码。使用广播每 30 秒(实际是 25.5-30 秒)发送一次完整的更新。

此外RIPv1还不支持口令验证,这具有一定的不安全性。

解决问题

最省心的方案要么换协议,要么启用RIPv2版本。如果非要用RIPv1,可以给路由器配置第二个IP地址,使其成为一个连续的子网。

所谓连续的子网:母网相同,子网掩码一致。例如:192.169.1.0/24192.168.2.0/24

实验

接下来我们通过Cisco Packet Tracer模拟器来看一下。

RIPv1实验拓扑

在上述样例中,各个路由器的Fa0/0端口都与对应的交换机相连,该接口地址为下方对应标签的第三行,例如R1路由器的Fa0/0接口IP地址为172.18.0.64子网掩码为255.255.255.192。此时下方主机的默认网关也是这个地址。

同样的下方标签的第一行为主机地址,例如PC01的地址为172.18.0.10

其余接口的IP已经在相应链路上给出。例如R1 Se0/1/0接口IP为10.0.0.1/30

迅速对上述拓扑完成基本配置:

//R1
en
config t
int f0/0
ip address 172.18.0.62 255.255.255.192
no shutdown
int s0/1/0
ip address 10.0.0.1 255.255.255.252
no shutdown

//R2
en
config t
int f0/0
ip address 172.18.0.126 255.255.255.192
no shutdown
int s0/1/0
ip address 10.0.0.2 255.255.255.252
no shutdown
int s0/3/0
ip address 10.0.0.5 255.255.255.252
no shutdown
//R3
en
config t
int f0/0
ip address 172.18.0.190 255.255.255.192
no shutdown
int s0/3/1
ip address 10.0.0.6 255.255.255.252
no shutdown

上述命令并没有给出特定的模式,直接打开路由的CLI然后复制粘贴进去(别复制注释)就行,我们的重点不在此处。(如果你不懂此处命令请参考我之前关于交换机和路由器基本配置的文章。)

接下来我们启用RIP

在R1上,我们用RIPv1宣告直连的网络

R1(config)#router rip
R1(config-router)#v 1
R1(config-router)#network 172.18.0.0
R1(config-router)#network 10.0.0.0
R1(config-router)#exit

R2和R3也是同理

R2(config)#router rip
R2(config-router)#v 1
R2(config-router)#network 172.18.0.64
R2(config-router)#network 10.0.0.0
R2(config-router)#network 10.0.0.4
R2(config-router)#exit
R3(config)#router rip
R3(config-router)#v 1
R3(config-router)#network 172.18.0.128
R3(config-router)#network 10.0.0.4
R3(config-router)#exit

在R1上执行debug命令

R1#debug ip rip

发现弹出如下信息

RIP Debug

观察上图,发送的目的地址都是255.255.255.255,这说明v1使用广播

在R1中使用命令,查看数据库中学习的条目

R1#show ip rip database 

RIP数据库

再看看路由表

R1#show ip route

信息如下

Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default, U - per-user static route, o - ODR
       P - periodic downloaded static route

Gateway of last resort is not set

     10.0.0.0/8 is variably subnetted, 3 subnets, 2 masks
C       10.0.0.0/30 is directly connected, Serial0/1/0
L       10.0.0.1/32 is directly connected, Serial0/1/0
R       10.0.0.4/30 [120/1] via 10.0.0.2, 00:00:24, Serial0/1/0
     172.18.0.0/16 is variably subnetted, 2 subnets, 2 masks
C       172.18.0.0/26 is directly connected, FastEthernet0/0
L       172.18.0.62/32 is directly connected, FastEthernet0/0

发现找不到对应的主机网络的条目——不存在172.18.0.64172.18.0.128网络。这正是因为RIPv1没有传递子网掩码的功能,且子网不连续造成的。

另外,对于同一网络,若该路由既有直连又从其它路由器中接收到条目,由于直连网络matric值比从其它路由收到的条目小,所以并不会更新条目

我们给对应的PC设好IP地址之后发现也是Ping不通的(此处不演示)。

我们尝试给路由器之间的链路分配与主机网络相连续的网络的IP地址试一试。

R1(config-if)#ip addr 172.18.1.1
R1(config-if)#ip addr 172.18.1.1 255.255.255.192
R2(config)#int se0/1/0
R2(config-if)#ip addr 172.18.1.2 255.255.255.192
R2(config-if)#int se0/3/0
R2(config-if)#ip addr 172.18.2.1 255.255.255.192
R3(config)#int se0/3/1
R3(config-if)#ip addr 172.18.2.2 255.255.255.192

然后尝试在PC1上Ping PC3

ping 172.18.0.130

见证奇迹的时刻到了,我们的网络竟然Ping通了!

由此可见对于RIPv1不发送子网掩码,我们需要使用连续的子网来解决问题。

但是这种解决问题的方式经常不符合我们的规范,在某些特定的情况下我们就想要不连续的子网,然后就有了RIPv2协议。

RIPv2

报文结构

RIPv2版本报文结构如下图

RIPv2报文结构

我们发现相比于RIPv1,v2版本的报文头多了网络掩码、下一跳、路由标记这几个字段。我们一下仅介绍与RIPv1不同的字段:

  • 版本(Version):在RIPv2中该字段值为2。
  • 网络掩码(Netmask):目的网络的掩码。RIPv1没有这一项,不支持可变子网掩码(Variable Length Subnet Mask, VLSM),而RIPv2支持了这一点。
  • 路由标记(Route Tag):为路由设置标记信息,缺省为0。当一条外部路由被引入RIP从而形成一条RIP路由时,RIP可以为该路由设置路由标记,当这条路由在整个RIP域内传播时,路由标记不会丢失。
  • 下一跳(Next Hop):RIPv2新增,使得路由器在多路访问网络上可以避免次优路径现象。一般情况下,在路由器所发送的路由更新中,路由条目的“下一跳”字段会被设置为0.0.0.0,此时收到该路由的路由器将路由条目加载到路由表时,将路由的更新源视为到达目的网段的下一跳。在某些特殊的场景下,该字段值会被设置为非0.0.0.0

RIPv2的新增功能

我们同样来抓一次包:

RIPv2抓包

RIPv2抓包详细信息

可见RIPv2相比于RIPv1使用组播的方式而非广播。

在 RIP 中的身份验证中,路由信息协议 RIPv2 的 Cisco 实现支持身份验证,密钥管理,路由汇总, 无类域间路由(CIDR)和可变长度子网掩码(VLSM)。

RIPv2发送路由条目时第一次发送整张表。此外,RIPv2支持自动汇总和手动汇总,自动汇总能关闭(只有关闭自动汇总才能启用手动汇总)。而RIPv1仅支持自动汇总且无法关闭。

实验

与RIPv1一样,我们构建类似的拓扑

RIPv2实验拓扑

为主机配置相应的IP,为路由器设置基本的配置。

基础配置方案与RIPv1实验部分一致,我们主要看RIP配置部分:

对于R1,我们开启RIPv2,宣告网络

R1(config)#router rip
R1(config-router)#v 2
R1(config-router)#network 172.18.0.0
R1(config-router)#network 10.0.0.0
R1(config-router)#exit

对于R2和R3同理

R2(config)#router rip
R2(config-router)#v 2
R2(config-router)#network 172.18.0.64
R2(config-router)#network 10.0.0.0
R2(config-router)#network 10.0.0.4
R2(config-router)#exit
R3(config)#router rip
R3(config-router)#v 2
R3(config-router)#network 172.18.0.128
R3(config-router)#network 10.0.0.4
R3(config-router)#exit

使用同样的命令查看R1路由表:

R1#show ip route

我们发现一个重要的问题:R1 路由表中还是只存在有类网络的路由条目,无法看到具体到达 R3 直连 172.18.0.128/26 的条目!

按理说RIPv2支持VLSM,我们应该能在路由表中看到R3的172.18.0.128/26才对。

实际上RIPv2的自动汇总是默认开启的,它仍会如v1那样将网络合并汇总,我们需要将自动汇总手动关闭。

实际上很简单,只需要在RIP配置模式下执行一条命令即可

R1(config)#router rip
R1(config-router)#no auto-summary

对于R2和R3一样

R2(config)#router rip
R2(config-router)#no auto-summary
R3(config)#router rip
R3(config-router)#no auto-summary

协议兼容性

在配置RIP时,如果不指定版本,接口默认情况下是能接收v1和v2的报文的,但是却只能发送v1的报文;在指定版本的情况下,RIPv1只能接收和发送v1的报文,RIPv2只能接收和发送v2的报文。

总结

RIPv1与RIPv2对比图

其它命令(加密、查看信息等)

基本

查看 rip database (从邻居收集来的信息)

R1#show ip rip database

关闭自动汇总

R1(config-router)#no auto-summary 

查看 RIP 配置

R1#show run | section rip 

查看路由表

R1(config)#Show ip rout 

指定一个接口可以发送的 RIP 的版本

R1(config-if)#ip rip send version 2 

允许接口的地址和路由选择更新使用全 0 子网

R1(config-if)#ip subnet-zero

手动开始汇总

R1(config)#interface serial 0/3/0
R1(config-if)#ip summary-address rip 10.0.0.0 255.0.0.0 

RIP加密

R1(config)#key chain cisco //定义 rip 中加密密钥链
R1(config-keychain)#key 0 //定义密钥
R1(config-keychain-key)#key-string cisco //定义密钥值
R1(config-if)#ip rip authentication key-chain cisco //在接口上调用密钥
R1(config-if)#ip rip authentication mode text //选择加密方式 明文
R1(config-if)#ip rip authentication mode md5 //选择加密方式 密文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据探索的新前沿:可视化大屏交互功能

在当今数字化时代,数据和信息是企业成功的关键。可视化大屏已经成为各个行业中数据呈现和决策支持的重要工具。然而,随着技术的发展,用户对于数据可视化的期望也在不断演变。仅仅呈现数据已经不再足够,用户希望能够更深入地与数据…

buildroot中将编译好的库(Qt,tslib)放入嵌入式linux文件系统

首先交叉编译想使用版本的Qt源码,还有tslib库,编译好之后 再次编译buildroot,再编译好的buildroot中会出现output文件夹,然后output文件夹下有target文件夹,这个target文件夹就是将要打包的文件系统,目标目…

Cloudflare分析第二天:解密返回数据

前言 Cloudflare分析第一天:简单的算法反混淆 由上篇for (j "10|8|5|9|1|4|0|2|3|6|7"["split"](|) 可以看到循环的循序 case 6:o (n {},n["msg"] f,n.cc g,hF["VNwzz"](JSON["stringify"](n))["re…

多线程和并发编程(6)—并发编程的设计模式

优雅终止 如何优雅终止线程? 中断线程的思路是使用两阶段法:第一阶段发生中断请求,第二阶段根据中断标识结束线程; public class Test1 {private volatile static boolean interrupted false;public static void main(String[…

生信教程:使用全基因组SNP数据进行ABBA-BABA分析

动动发财的小手,点个赞吧! 简介 ABBA BABA 统计(也称为“D 统计”)为偏离严格的分叉进化历史提供了简单而有力的测试。因此,它们经常用于使用基因组规模的 SNP 数据(例如来自全基因组测序或 RADseq&#xf…

monkeyrunner环境搭建和初步用法

一、打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器,不然monkeyrunner无法连接设备。 用Elipse打开Android模拟器或在CMD中用Android命令打开模拟器。这里重点讲一下在CMD中用Android命令打开模拟器 命令:emulator -avd test (注…

使用ElementUI结合Vue完善主页的导航菜单和书籍管理以及后台数据分页查询

目录 动态树 数据表 案列 书籍管理 动态树 动态树(Dynamic tree)是一种数据结构,它可以在树中动态地插入、删除和修改节点。与静态树不同,静态树的节点是固定的,一旦构建完成就无法再进行修改。而动态树可以在运行时…

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…

Learn Prompt- Midjourney案例:Logo设计

Logo设计是一个充满挑战的任务,因为Logo是品牌重要价值的浓缩。 快速开始​ 直接使用logo design for...来获取灵感。 备注 图像中生成文字在Midjourney中的效果还不是很好,但你可以用Canva编辑图片并替换自己的文字。 在提示中使用那些擅长你所寻找的…

02-Zookeeper实战

上一篇:01-Zookeeper特性与节点数据类型详解 1. zookeeper安装 Step1: 配置JAVA环境,检验环境: java -versionStep2: 下载解压 zookeeper wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeepe…

大数据安全 | 【实验】仿射加密

文章目录 📚实验目的📚关于仿射加密🔥使用暴力破解的方式对仿射加密进行破解,还原明文🔥使用词频统计的方式对仿射加密进行破解,还原明文🔥在同一运行环境下,对比两种破解方式所需的…

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读:2023年9月25日,Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节,主要核心要点总结如下: >> 数据处…

融合之力:数字孪生、人工智能和数据分析的创新驱动

数字孪生、人工智能(AI)和数据分析是当今科技领域中的三个重要概念,它们之间存在着紧密的关联和互动,共同推动了许多领域的创新和发展。 一、概念 数字孪生是一种数字化的模拟技术,它通过复制现实世界中的物理实体、…

应用在手机触摸屏中的电容式触摸芯片

触控屏(Touch panel)又称为触控面板,是个可接收触头等输入讯号的感应式液晶显示装置,当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板&…

数据库存储引擎和数据类型详细介绍

目录 一、数据库存储引擎(了解)1.了解MySQL体系结构2.存储引擎(了解)2.1.存储引擎的介绍2.2.存储引擎分类2.3.如何选择引擎? 3.事务控制语言(TCL)事务的四个特性(ACID) 二、数据类型(了解)1.整型…

【文献】TOF标定 Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair

文章目录 Article info.Introduction处理TOF误差Take home messagesResourcesIDEAS Article info. Time-of-Flight Sensor Calibration for a Color and Depth Camera Pair IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 37, NO. 7, JULY 2015 Intr…

(一)连续随机量的生成-加权重采样

加权重采样 import numpy as np import matplotlib.pyplot as plt# Step 1: Generate 10,000 random theta values from U([0, 1]) n 10000 theta_values np.random.rand(n)# Define the function to compute weights for a given theta def compute_weight(theta):return (…

SQLAlchemy列参数的使用和query函数的使用

目录 Column常用参数 代码演示 代码刨析 query函数的使用 基本用法 常见用法示例 查询所有记录 根据条件查询 查询第一条符合条件的记录 查询特定列的值 添加排序规则 使用聚合函数 连接查询 使用filter_by Column常用参数 primary_key:True设置某个字…

当蛋白质成为儿童的敌人:应对蛋白过敏的挑战

儿童时期是充满欢笑和探索的时光,但对某些孩子来说,它可能伴随着一项不太受欢迎的挑战——蛋白过敏。在这篇文章中,我们将探讨蛋白过敏的现象、挑战以及如何在这个过程中为孩子提供支持。 蛋白质过敏:小儿的无情敌人 蛋白质过敏…

flink的序列化基准测试

背景: flink提供了在本地环境使用jmh测试不同序列化方法的性能差异,本文就是基于这个https://github.com/apache/flink-benchmarks这个性能测试,总结几个结论,以便后面使用时避免掉坑 基准测试 我们本次运行的是SerializationF…