计算机网络基础 (九)--- 网络层 - 内部网关路由协议
文章内容概览
内部网关路由协议之 RIP 协议
距离矢量(DV)算法
在介绍 RIP 协议之前,先了解一下 DV 算法,因为该协议是通过 DV 算法进行实现的
该算法是运行在图中的
每一个节点使用两个向量 Di 和 Si
Di 描述的是当前节点到别的节点的距离
Si 描述的是当前节点到别的节点的下一个节点
对于该算法,它是如何运行的?
每一个节点和相邻的节点交换向量 Di 和 Si 的信息
每一个节点根据交换的信息,更新自己的节点信息
Di1 表示从节点 i 到节点 1 的*距离*
Si1 表示从节点 i 到节点 1 的*下一个节点*
n 表示节点的数量
对于 DV 算法,他其实就是计算 D 的距离的最小值。比如 Dij 的最小值就等于:min(Dix+Dxj)。通过一个例子来理解这个 DV 算法
图中有 A、B、C、D、E、F 这六个顶点和若干条边,对于这六个节点,就有右边这样的 Di 和 Si 的距离矢量信息。对于 Di,它有六个元素,分别是 Dia、Dib...到 Dif,他表示的是,i 这个节点到 A、B、C、D、E、F 这六个节点的距离。对于 Si,它也有六个元素,分别是 Sia、Sib...到 Sif,他表示的是,i 这个节点到 A、B、C、D、E、F 这六个节点的下一个节点是什么
下边会以 A 这个节点为例来展示 DV 算法是如何运行的,也就是求 Da 和 Sa 这两个向量。假设 A 的距离矢量信息(Da)如下
它表示的是 A 到其它的每个节点的距离分别为右侧列的值。在上边介绍 DV 算法时有提到,该算法会与相邻的节点交换 Da 和 Sa 的信息。假设 A 收到了来自 B、C、D、F 这四个相邻节点的信息,并且在接收到距离矢量信息的时候,知道了 A 到各个相邻节点的直线距离是多少
为了更加方便的了解 DV 的过程,将 A 的距离矢量信息和 A 到其它四个相邻节点的矢量信息合在一起
图中的每一列表示的是某一个节点到达 A、B、C、D、E、F 节点的距离是什么
可能大家对表中的数据有疑问,为什么 A 到 B 的距离是 11,而 B 到 A 的距离却是 9。这个是因为里边的距离矢量信息并不是最新的。比如说,A 到 B 的距离可能是通过 A->C->B 所得到的,因此这里 A 到 B 的距离可能是 11。而 B 到 A 的距离可能是通过 B->C->D->A 所得到的,所以这里 A 到 B 的距离矢量信息可以和 B 到 A 的距离矢量信息不一样
列出 A 的 S 向量,默认初始化为空,S 向量表示的是 A 到其它几个节点的下一个节点是什么
假设此时 A 在和 B 这个节点交换信息,A 就得到了 B 这个节点的信息,也就是得到了 B 到每一个节点的距离
A 得到这些信息之后,首先会进行运算。因为 A 和 B 是直接进行通信的,所以 A 知道 A 到 B 的距离是什么。然后会通过从 B 那里得到的 B 到其它节点的距离,来计算 A 到其它节点的距离
以上就是 A 得到 B 的数据之后进行的运算,然后他会把得到的这些数据和自己的距离矢量进行比较,如果比自己到其它节点的距离更小,那么它就会把它填充到自己的距离矢量中。所以拿到 B 的数据,经过计算之后,发现 A 到 B 的距离 6,比自己原来的 11 小,所以把自己原来的 11,替换成 6;然后发现自己原来 A 到 F 的距离为 17,和计算之后 A 到 F 的距离 17 相等,那么 A 也会进行替换。替换为完之后,A 就会把相应的下一个节点设为 B。以上就是 A 获取到 B 的信息之后的整个过程,如下图
接下来 A 又接收到了节点 C 的信息,这其中就包括 C 到 A、B、C、D、E、F 的距离。A 接收到 C 的信息之后,也会进行和之前一样的运算
经过计算之后,也会和自己现有的距离矢量进行比较。比如 A->C 的距离为 9,要比 A 之前到 C 的距离 12 小,所以就会用 9 把原来的 12 替换掉,并且对应的 S 会填充为 C,后边的同理,如图:
A 和 D、F 交换信息的过程也是和上边一模一样的。当 A 和每一个相邻的节点交换完信息之后,得到如下的结果
以上就是 DV 算法的整个过程,回看前边介绍的 DV 算法,再来理解它的定义会好明白很多
每一个节点使用两个向量 Di 和 Si
Di 描述的是当前节点到别的节点的距离
Si 描述的是当前节点到别的节点的下一个节点
每一个节点和相邻的节点交换向量 Di 和 Si 的信息
每一个节点根据交换的信息,更新自己的节点信息
RIP 协议的过程
RIP(Routing Information ProtoCol)协议
RIP 协议是使用 DV 算法的一种路由协议
RIP 协议把网络的跳数(hop)作为 DV 算法的距离(其实就是跳数越多,距离就越长)
RIP 协议每隔 30s 交换一次路由信息(这里的路由信息就包含 Di 和 Si)
RIP 协议认为跳数>15 的路由则为不可达路由
使用 RIP 协议的路由器
路由器会初始化路由信息(两个向量 Di 和 Si)
根据相邻路由器 X 发过来的信息,对信息的内容进行修改(下一跳地址设为 X,所有距离加 1。意思就是,通过 X,它可以到达 X 所发过来信息的每一个节点,只需要将距离加 1 就可以了)
修改了之后,首先检索本地路由,将信息中新的路由插入到路由表里边(因为有些目的地,本地路由表里边可能是没有的)
检索本地路由,对于下一跳为 X 的,更新为修改后的信息
检索本地路由,对比相同目的地的距离,如果新信息的距离更小,则更新本地路由表
如果 3 分钟没有收到相邻的路由信息,则把相邻的路由设置为不可达(也就是设置为 16 跳)
通过例子来理解上边的描述。假设路由中初始化的信息如下最左边部分:
第一步:检索本地路由,将信息中新的路由插入到路由表里边
初始化路由表中的信息,表示路由到 D 的距离为 2,并且其下一跳地址为 A。假设此时收到来自路由器 X 发来的信息。信息有到达 A 的距离 4,下一跳地址为 C。到达 B 的距离为 2,下一跳地址为 C。收到这些信息之后,路由器会对自身信息进行修改,将所有的距离都加一,并且将下一跳地址都设为 X。接下来就会检索本地的路由,发现 A、B 都是原来路由里边没有的,所以会把 A、B 的信息插入到路由表中。就得到了更新之后的路由表
第二步:检索本地路由,对于下一跳为 X 的,更新为修改后的信息
假设初始化的路由信息如下最左边部分:
当初始路由器,收到中间的路由信息,该路由信息首先会进行修改,修改之后,就会根据接收到的路由信息对自身进行修改,因为这是最新的信息,所以会把原来的覆盖掉
第三步:检索本地路由,对比相同目的地的距离,如果新信息的距离更小,则更新本地路由表
这一步其实就是前边介绍的 DV 算法过程,当初始路由收到另一个路由信息之后,另一个路由的信息先进行更新,然后和初始路由进行对比,如果新信息的距离更小,则更新本地路由表
以上便是 RIP 协议的完整过程
RIP 协议的缺点
通过一个例子来了解一下 RIP 协议的缺点。假设有 A、B、C 三个节点,并且他们是线性连接的。B、C 到达 A 的距离分别是 1 和 2,B 是直接到达 A,C 是通过 B 到达 A
假设在某一个时刻,路由器 A 宕掉了,即 A 不可达。此时,B 发现 A 不可达之后,就会询问 C,询问 C 之后发现,通过 C 可以到达 A,因此把下一跳设置为 C,并且距离加一(也就是 3)。C 在某一个时刻也发现 A 不可达了,那么 C 也会询问 B,发现 B 通过 3 跳之后可以到达 A,所以它也会更新自己的路由信息,将到达 A 的距离设为 4,并且下一跳设置为 B,此时就会死循环下去,一直到距离为 16(上边有介绍到,最多 16 跳,会认为目标不可达),才发现是不可达的
所以 RIP 协议最致命的缺点是:故障信息传递慢
RIP 为什么会有这个特点?
随便相信“隔壁老王”(不管是 B 还是 C,如果说 B 得到了 C 的路由信息,它将会无条件的相信 C。同样,如果是 C,他也会无条件相信 B,因此就会导致循环,直到跳数为 16,才发现不可达)
“自己不思考”、“视野不够”(对于 RIP 协议,每一个路由器只看到相邻路由的信息,看不到更远的信息)
因为网络中经常出现故障,如果每一次故障,都需要这么多跳才能发现的话,会导致整个网络非常不可控,这就是 RIP 协议致命的缺点
在快速变化的技术中寻找不变,才是一个技术人的核心竞争力。知行合一,理论结合实践
版权声明: 本文为 InfoQ 作者【书旅】的原创文章。
原文链接:【http://xie.infoq.cn/article/c8f5609cc55d0093c4746693d】。文章转载请联系作者。
评论