计网第四章(网络层)(七)

news/2024/11/25 19:45:50/

目录

一、路由信息协议RIP

1.距离向量:

2.跳数:

3.基本工作原理:

三个要点:

4.基本工作过程:

(1)初始状态:

(2)交换并更新信息 

(3)收敛

5.更新规则

6.RIP协议的问题


一、路由信息协议RIP

路由信息协议RIP是互联网中最早使用的协议,他是基于距离向量的。

1.距离向量:

RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络距离的记录,这是一组距离,称为“距离向量D-V”。

2.跳数:

RIP使用跳数作为度量来衡量到目的网络的距离。

如果是直连网络,那么距离就等于1。

如果是非直连网络,那么每经过一个路由器距离就加1。

RIP协议中一条路径最多只能包含15个路由器,距离等于16时就相当于不可达。所以,RIP协议只适合用于小型网络。

也就是说距离最小为1,最大为15。

比如:

图中对于R1路由器,要到达目的网络192.168.1.0/24和目的网络10.0.0.0/30,因为都是直连网络,所以距离都等于1;要到达目的网络10.0.1.0/30,因为是非直连网络,中间经过路由器R2,所以在1的基础上加1,所以距离为2,同样地,到达目的地网络192.168.2.0/24的距离为3。

注意:有些路由器的RIP将路由器到直连网络的距离定为0。 

3.基本工作原理:

RIP认为到达目的网络的路径中通过的路由器数量最少的路径最好,即距离最小。

如果到达同一目的网络有多条距离相等的路由时,就会进行等价负载均衡,即将通信量均衡地分布到多条等价的路由上。

三个要点:

RIP协议的三个要点是和谁交换信息,交换什么信息以及何时交换信息。

和谁交换信息:RIP协议中,仅和相邻的路由器交换信息。

例如上图中,路由器R1和R2会交换信息,同时R2还会和R3交换信息,但是R1和R3不是相邻路由器,所以不会交换信息。

交换什么信息:交换自己的路由表。

何时交换信息:周期性交换信息(如:每隔30秒发送一次RIP更新报文)。

综上所述,RIP协议中仅相邻的路由器周期性交换并更新自己的路由表。

4.基本工作过程:

(1)初始状态:

我们之前有提到过,在路由器刚开始工作时只知道与自己直连的网络,所以路由器只知道自己到直连网络的距离为1。

(2)交换并更新信息 

图中,对于路由器R1,路由器R2和路由器R3都为它的相邻路由器;

对于路由器R2,路由器R1和路由器R3和路由器R4都为它的相邻路由器;

对于路由器R3,路由器R1和路由器R2和路由器R4都为它的相邻路由器;

对于路由器R4,路由器R2和路由器R3都为它的相邻路由器。

根据RIP协议的要点可以得出,每个路由器会若干次交换并更新自己的路由信息。

(3)收敛

在若干次交换和更新后,每个路由器都可以知道在本AS内到达各网络的最短距离和下一跳地址。这就是收敛。

5.更新规则

前面提到路由器会交换并更新自己的路由信息,那么具体是怎么交换和更新的?

A、B各自的路由表如图,假设现在路由器A的RIP更新报文的发送周期到了,则路由器A将自己路由表的信息封装到更新报文中发送给路由器B。

图中我们故意将A的路由表的下一跳全部写为问号,这是因为A将自己的路由表信息给B时会将表中的下一跳都改为A,也就是说B无需关心A路由表里的这些内容。 

B接收到的A的路由表如图:其中距离在原有基础上都加1,因为这个过程相当于通过了路由器A,下一跳统一变为A。

随后B根据收到的改造后的A的路由表(后面简称为A路由表,但要注意这是改造后的A路由表)更新自己的信息。如图:

首先我们可以看到在B的路由表里面没有关于到达N1网络的条目,现在发现可以通过路由器A到达N1网络,于是将该条目加进去。这条规则叫“发现新的网络直接添加” 。

其次,我们在B的路由表的下一跳里面发现了有关于A的下一跳,即到达N7网络的条目,距离为6。在传来的A的路由表里面也有关于N7的条目,但是距离变为了7,于是将R2的路由表中的该条目的距离改为7。这条规则叫“到达目的网络,相同的下一跳,更新为最新信息” 。

现在A的路由条目还剩N3、N5、N9三条,很明显可以看到在B的路由表里里面,它们的下一跳都不是A。首先关于N3的条目,可以看到N3条目在B的路由表里面的距离为9,但是在A的路由表里面距离为6;在工作原理部分,我们有说RIP协议认为好的路由就是到达同一个目的网络通过的路由器数量最少的路径,所以应该把B路由表里的N3条目距离更新为6,且下一跳更新为A。这条规则叫“到达目的网络,不同的下一跳,新路由有优势,更新” 。

N5条目在两个路由表里虽然下一跳不同,但是距离都为5,在基本原理部分有提到过,有到达同一目的网络多条距离相等的路由时进行等价负载均衡。于是将A中关于N5网络的条目直接添加到B中。这条规则叫“到达目的网络,不同的下一跳,等价负载均衡” 。

最后,N9条目在A路由表里面的距离为6,但是在B路由表里面为5,秉持着好的路由原则,B路由表关于该条目的信息不发生变化。这条规则叫“到达目的网络,不同的下一跳,新路由有劣势,不更新” 。于是,最终的B更新后的路由表就如图所示:

总结RIP协议中,一个路由器A给相邻的路由器B发送装有自己路由表信息的RIP更新报文,路由器B会接受到改造后的路由表A,即距离全部加1,并且下一跳全部变为A。

更新可以先从到达的目的网络入手,如果发现新网络直接进行添加;如果是B表中已有的网络,则从下一跳入手,下一跳相同就进行更新;下一跳不同就从距离入手,谁距离短就用谁,距离一样就进行添加。

6.RIP协议的问题

RIP协议存在一个坏消息传的慢的问题。该问题又叫做路由环路或者距离无穷计数问题。这是基于距离向量算法的一个固有问题

首先需要注意的是,RIP协议中的交换并不是意思时间到了相邻的路由器同时交换,它们有可能是有先后顺序的。实际上,每个路由器都有一个RIP更新报文发送周期,它们的时间不一定相等。

我们从示例中进行详细说明,如图:

假设R1和R2已经交换过路由信息,那么R1表中现在就有到达N3网络的条目。

但是现在R2与直连网络N3的链路出现了故障。R2检测到该故障后,就会将自己表中N3网络条目的距离改为16,表示该网络不可达。然后R2就等待自己的RIP更新报文发送周期到时后,将自己的路由信息发送给R1。

但是R1在未收到R2的更新后的路由表的信息时,关于N3的条目的距离仍然为2。

那么根据前面所说的,现在假设R1的更新周期先到时,它就会将自己的路由信息传给R2。R2收到后会误认为可以通过R1到达N3网络,于是将自己表中的N3条目改为3。

 后面就会出现两个路由器不停地传递这个错误的条目,并且每次到达N3网络条目距离都会增加1,一直增加到16,才会发现网络不可达。而在中间这个过程R1和R2就会产生路由环路。

对于这种问题,有多种措施可以减少该问题出现的概率及带来的危害。(注意:是减少该问题而不是解决该问题。说明这种问题无法彻底避免。

一个就是在跳数部分提到的,路由距离达到16即不可达。上面这个示例也体现了这个措施的好处,虽然中间出现了路由环路,但是距离到达16后,双方就都知道该网络不可达了。

第二个,就是当路由表发生变化时,立即发送更新报文(也叫“触发更新”不用等待更新周期。(这一块不知道大家是否想起了之前说的超时重传与立即重传

还有就是让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口反方向传送。(比如上图中的路由器,我们将两个路由器的左边接口都叫接口0,右边都叫接口1,那么R1就只能从接口1接收关于N3网络的路由信息,但是不能再从该接口发送该信息)。


http://www.ppmy.cn/news/1075261.html

相关文章

解决RabbitMQ报错Stats in management UI are disabled on this node

文章目录 问题描述:解决步骤:进入容器后,cd到以下路径修改 management_agent.disable_metrics_collector false退出容器重启rabbitmq容器 问题描述: linux 部署 rabbitmq后,打开rabbitmq管理界面。点击channels&#…

Redis执行lua脚本-Time函数-获取当前时间

演变过程: TIME 命令返回当前服务器的时间,包含两个条目 Unix 时间戳和这一秒已经过去的微秒数。 eval " local res redis.call(time); return res; " 0 eval " local current_time redis.call(TIME) local unix_timestamp tonumb…

使用Spring的getBeansOfType实现接口多实现类的动态调用

使用Spring的getBeansOfType实现接口多实现类的动态调用 package com.xxl.job.admin.core.alarm;import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLog; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sp…

【函数栈帧解析:代码的迷人堆积和无限嵌套】

本章重点 一、何为函数栈帧 二、函数栈帧特性 - 同栈 - 后进先出 三、认识内存空间布局图 四、认识相关寄存器 五、认识相关汇编命令 六、测试代码: 七、函数栈帧全过程 要解决的问题​​​​​​​ 局部变量是怎么创建的?为什么局部变量的值是随机值&am…

GO学习之 搜索引擎(ElasticSearch)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

curl封装

一。由于工作的原因,需要对curl做一些封装,附加上我们的证书,提供给第三个C和jAVA使用。 二。头文件封闭四个函数,get,post,download,upload #ifndef CURLHTTP_H #define CURLHTTP_H#include …

Java Stream与多线程

Java Stream 1. 问题引入 学习了尚硅谷的JUC,周阳老师讲的商城比较价格的案例,自己模拟了一个多线程的demo, 多线程处理任务并且汇总结果,出现了疑问,实例代码放在下面,读者有兴趣的话可ctrlcv玩一玩 如下是自定义的任…

如何用Python爬虫持续监控商品价格

目录 持续监控商品价格步骤 1. 选择合适的爬虫库: 2. 选择目标网站: 3. 编写爬虫代码: 4. 设定监控频率: 5. 存储和展示数据: 6. 设置报警机制: 7. 异常处理和稳定性考虑: 可能会遇到的…