本文正在参与 “网络协议必知必会”征文活动
书接上文 网络的形成-从原始部落到现代化世界 , 本文讲路由器是怎么寻路的。
路由器的寻路
那么,路由信息是怎么得到的呢?
主机的网关
通过route命令查看主机的路由表
# route
Destination Gateway Genmask Flags Metric Ref Use Iface
default 9.134.64.1 0.0.0.0 UG 0 0 0 eth1
9.0.0.0 9.134.64.1 255.0.0.0 UG 0 0 0 eth1
可以看到这里的网关地址是9.134.64.1 ,也就是会通过这个IP的路由器去寻路。
路由器的配置主要有两种方式。
- 静态配置:通过手动配置路由器的路由
- 动态算法:通过网络的动态算法计算出路由
- 动态算法能感知网络
- 算法复杂,会增加网络的负担
- 可能会存在动荡和一致性的问题
距离向量算法
距离向量算法是网络层路由算法中最简单的一种算法。
路由器将自己的整个路由表转发给相邻的路由器,这个路由表是距离矢量表。 每条记录会记录:
- 目的路由器
- 距离
- 到目的的最短距离
- 通过的路径
- 如果记录了通过的路径就可以寻路,否则没法寻路
- 从一跳到另一跳该怎么走
邻居
路由器可以使用IP广播地址和自己的邻居交换信息
- 每隔30s广播一次自己最新的路由表
- IP层的广播地址为“255.255.255.255”
- 这样的话邻居每30s就可以交换一次消息了
交换并学习
和邻居交换信息,如图是3个节点交换了信息:
图上R0,R1,R2 3个节点
- R0的邻居有R1,R2,R0得到一个这样的距离向量[(R1,1),(R2,1)]
- R0告知R1自己的距离向量表
- 因为R1被通告了一条新的路由(R2,1),该路由在本结点的路由表中不存在,此时本地系统加入这条新的路由,得到(R2,2)
- R2同理
同理,R3,R4,R5 3个节点也这样交换了信息
当这两个子网联通后,也就是R0和R3之间联通了,如下图:
很快,R0和R3作为相邻的节点就交换了信息
- 则R0的距离向量变为了[(R1,1),(R2,1),(R3,1),(R4,2),(R5,2)]
- 注意这里的表达为了简明,并没有将经过的具体路径画上
- (R4,2) 的通过路径是R3,其实是记录了(R4,2,R3)
- R0和R1交换信息,R1更新自己的距离向量,获得了全局的拓扑图
- (R3,2,R0)
- (R4,3,R0|R3),R0|R3表示通过的路径,先经过R0再经过R3到达R4
- R0和R2继续交换信息,R2更新自己的距离向量,也获得了全局的拓扑图
- R3原来的子网同理
选择距离更小的
假设此时又加入了一个路由器R6,R6先和R4联通,如下图左侧所示:
对于R0来说:
- R0的距离向量新增一个记录(R6,3,R3|R4),表示到R6通过的路径,先经过R3再经过R4。 然后,假设在R6和R1之间也加入了一条链路,如上图右侧所示。
- 经过两次间隔时间后,R0从R1处得到自己到R6可以通过R1且跳数是2
- 该路由与当前使用的路由3相比,有较短的距离
- 此种情况下,就用经过发送路由信息的结点的新路由替换路由表中到达那个目的地的现有路由
- R0的距离向量更新R6的记录为(R6,2,R1)
这样之后,通过R0路由器的主机到R6的主机后,会选择(R6,2,R1)这条路由,主机就是这样被路由寻路的。
可能出现的问题
最开始说到动态算法虽然能自发的感知网络,但可能存在一些问题,比如会增加网络的负担,而且在距离向量算法中,最严重的问题是存在动荡和一致性的问题。
动荡
动荡的一个例子,如下图所示,
如果断开R0到R3之间的这条链路,这个时候如果R0需要到R5去,
- 断开之前R0到R5之间的距离是2,而且是通过R3转发的
- 在和R3断开的时候,R0就会失去到R5的路由
- R0可能在一段时间内会失去R5的消息,直到R6告诉R1,然后R1再告诉R0,大概1分钟的延迟。
- 但是经过2次交换信息后,又能发现(R5,5,R1|R6|R4|R3),距离为5。
这种突然失去联系的情况就是动荡。
一致性
- 跳数很多
如下图,这里画了一种极端的情况,R0和R1之间还有14个路由器,
- 30s交换一次消息
- R0如果离开,R1要15*30s也就是7.5分钟之后才能感知到
- 也就是可能的影响时间会有这么长。 可以看出
- 交换信息的间隔越长,一致性越差
- 但是间隔太短,又会造成更大的网络负担。
- 跳数越多,一致性越差。
- 一致性也就是说一个信息或事件全网同步
- 所以一般规定最大跳数是15
总结
在RIP协议中规定的最大跳数为15,16跳或以上则被视为目的网络不可达。 根本原因是因为如果跳数变大,则一致性和动荡将会扩大,使得网络几乎不可用。 就像上面举的例子。
-
所以,距离向量算法只适合小型网络。
-
而大型的网络环境,OSPF协议可以完美的解决。