计算机网络:网络层 - 路由选择协议
路由器的结构
如图所示,路由器被分为路由选择
与分组转发
两个部分:
在分组转发
中:
当一个数据报从端口进入,要依次被物理层
,数据链路层
,网络层
层层解析,得到数据报。随后根据转发表
,决定从哪一个端口传出,再依次被网络层
,数据链路层
,网络层
层层封装。
转发的核心就是这个转发表
,而转发表
是由路由选择
的路由表
得出的!
路由器通过路由选择协议
来构建路由表
,从而得出转发表
,才能合理转发数据报。本博客就讲解路由选择协议
,来了解路由表
是如何得出的。
路由选择协议概述
路由选择协议分为静态路由选择
和动态路由选择
。
静态路由选择
:由人工配置的路由,不能及时适应网络的变化,一般来说只在小规模网络中使用动态路由选择
:路由器自己获取路由信息,能够及时适应网络变化,一般大型网络使用
因特网作为全球最大的网络,毫无疑问要使用动态路由选择
,动态路由选择有以下特点:
自适应
:动态路由选择能较好适应网络状态变化分布式
:将一个系统或任务分解成多个部分,并将其分配到多个节点上执行,这些节点之间通过网络互相通信,最终协作完成整个任务。路由器之间就是这样完成任务的。分层次
:整个因特网被划分为很多自治系统
,按层次管理
接下来本博客就讲解这个动态路由选择
。
自治系统 AS
由于互联网的规模非常大,如果让所有的路由器知道所有的网络应怎样到达,则路由表将会非常大,处理起来花费的时间也会很多,所以互联网采用分层次的路由选择协议
。
该协议将互联网划分为许多个较小的自治系统 AS
,如下图:
每个
AS
对其它的AS
表现为一个单一的,一致的路由
比如上图中,左上角的AS
只通过R1
连接外部,所以该AS
内部的报文,都要通过R1
传输。
- 每个
AS
内部,使用内部网关协议
- 不同的
AS
之间,使用的是外部网关协议
如上图,自治系统 A
内部使用了内部网关协议RIP
,而自治系统 B
内部使用了内部网关协议OSFP
。也就是说,不同的AS
使用不同的内部网关协议,也可以进行通信。在两个AS
之间,使用了外部网关协议BGP-4
。
内部网关协议
路由信息协议 RIP
RIP
是一种基于距离向量
的路由选择协议
所谓距离向量,计算规则如下:
- 路由器到直连网络的距离为
1
- 路由器到非直连网络的距离,为经过的路由器数目加
1
如下图:
网络N1
与R1
直连,那么R1
到N1
的距离向量就是1
;而R3
与N2
并不直连,途径一个路由器R2
,那么距离向量就是路由器数目 + 1 = 2
。
距离向量
的最大值为15
,当大于等于16
时,表示不可达
,即不能通过该路由连接到对应的网络。
在RIP
路由表中,主要包含以下信息:
目的网络
:目的网络的地址距离
:到达该网络的距离向量下一跳路由
:到达该网络,要把数据报传输给哪一个路由
那么路由器如何构建自己的路由表呢?
- 路由器仅和
相邻路由器
交换信息 - 交换的信息为本路由器知道的
所有信息
- 路由器按照固定的时间间隔交换信息,然后根据
距离向量算法
更新自己的路由表
距离向量算法
当路由器接收到来自相邻路由器的RIP报文
,就要通过距离向量算法更新自己的路由表,规则如下:
- 收到报文后,先修改报文的内容,将
距离
字段加一,下一跳
字段变为发送该报文的路由器
如下图:
现在R2
给R1
发送了一个RIP报文
,内部包含到net2
的信息,其中:距离字段要+1
,表示R1
想要到达该网络,需要再经过R2
路由器;而下一跳
要变为R2
,表示到达该网络需要将数据报转发给R2
。
- 将修改后的数据报,与自己原先的路由表对比,更新路由表
- 如果原先路由表中没有目的网络,那么将该网络添加到自己的路由表中
- 如果原先路由表有相同的目的网络,那么根据以下规则更新:
- 如果报文中的
下一跳
的地址与原先下一跳
相同:那么更新路由表的距离
,这是因为网络随时都有可能变化,有可能同一个路由器到一个网络的距离变了,此时要用最新的,确保信息正确 - 如果报文中的
下一跳
的地址与原先下一跳
不相同:此时比较距离
,保留距离
比较小的那一条
- 如果报文中的
示例:
R1
收到了R2
发来的RIP报文
,修改后如右图。
net1
:原先R1
中没有对应的网络,将该条目添加到路由表中net2
:原先R1
有该网络,并且下一跳
同为R2
,此时就算距离
变长了,也要更新报文,距离从3
变为8
net3
:原先R1
有该网络,但是下一跳
不相同,此时比较距离11 > 8
,说明R2
比R3
距离短,选用R2
,更新路由net4
:原先R1
有该网络,但是下一跳
不相同,此时比较距离3 < 6
,说明R4
比R2
距离短,选用R4
,不更新路由
最后R1
路由表变为:
另外的:如果三分钟没有收到相邻路由器的RIP报文
,则把该路由器记为不可达,把距离设置为16
RIP报文格式
RIP报文
格式如下:
如图所示,RIP报文
被封装在UDP数据报
后,在被封装进了IP数据报
,其实RIP
本质是一个应用层协议。
在RIP
的路由部分
中,包含了最重要的网络(网络地址+子网掩码)
,下一跳
,距离
这三个字段。一个报文中最多包含25
个这样的路由信息。
收敛问题
RIP
协议的优点是实现非常简单,开销很小。
但是RIP
也有不少缺点:
- 限制了自治系统的大小 :
RIP
限制最大距离为16
,这也决定了使用RIP
的自治系统不能太大 - 收敛时间长:也叫做"坏消息传播慢"
收敛
:自治系统中所有节点都得到正确的路由信息的过程
接下来我们就看看为什么存在收敛时间长
的问题:
现在R1
直连网络net1
,R2
通过R1
间接连接到net1
,突然R1
断开了与net1
的连接,此时把距离改为16
:
当R1
还没来得及告诉R2
自己的路由表,R2
就给R1
发送了RIP报文
:
此时R1
误以为可以通过R2
连接到net1
,于是更新自己的路由表:
此时就已经产生了错误信息了,过一会R1
又给R2
发送RIP报文
:
此时R2
以为R1
的链路变长了,于是把自己的距离更新为4
,随后R2
给R1
发送报文:
此时R1
再更新,以此类推,直到两边距离都为16
:
此时路由器R1
和R2
才直到,net1
是不可达的。这就是为什么RIP
的收敛速度慢。
开放最短路径优先 OSPF
开放最短路径优先OSPF
,是为了克服RIP
的缺点而开发出来的。
开放
:表明OSPF
不是受公司控制的,而是公开发表的协议最短路径优先
:使用了最短路径算法SFP
先前的
RIP
是基于距离
的协议,而OSPF
是基于链路状态
的,路由器会维护一个整个网络的拓扑图,并基于此图计算最优路径
OSFP
不会限制网络的规模,而且收敛速度快。
基本工作原理
OSPF
需要先建立和维护邻居关系
,这个过程是通过问候分组 hello
实现的:
如图所示,每个路由器都有自己的邻居表
,R1
的邻居就是R2
和R4
。每隔十秒钟,路由器就会发送一次hello 分组
,如果连续40
秒没有收到对应的hello 分组
,那么认为该路由器不可达。
路由器会通过数据交换,让每个路由器都由一个
链路状态数据库 LSDB
,并基于这个数据库,计算出自己到达各个路由器的最短路径,从而构建效率最高的路由表。
数据交换过程通过五种分组维护:
问候分组
:用来构建和维护邻居路由
数据库描述分组
:向邻居路由给出自己的链路状态数据库的摘要信息链路状态请求分组
:向邻居路由请求更加详细的信息链路状态更新分组
:将自己的详细信息发送出去,通过泛洪法,让自治系统的所有路由器都可以更新状态链路状态确认分组
:当路由器通过链路状态更新分组
,更新了自己的数据库后,通过该报文确认
如图所示,一开始路由器之间交换问候分组,维护邻居关系:
当满足一定条件,路由器R1
发送自己的数据库描述分组
:
在数据库描述分组
中,记录了R1
的数据库的概括信息。如果R2
检查数据库描述分组
后发现,有一些信息自己没有,或者不太一样,就向R1
发出链路状态请求分组
,以获取更加详细的信息:
当R1
收到链路状态请求分组
后,通过泛洪法向所有路由器发送链路状态更新分组
,==该分组详细描述了R1
自己的数据库,其他路由器就可以根据这个分组更新自己的数据库,以获取最新的信息。==收到链路状态更新分组
的路由器,还要往回发送链路状态确认分组
,对之前的分组确认。
自治系统分区
?为了使OSFP
可以作用与规模很大的网络,OSFP
会把一个自治系统划分为若干个更小的范围,叫做区域
每个自治系统都包含一个主干区域
,其它区域都通过主干区域
连接自治系统外部。
每个区域都有自己的标识符,该编号为32
位,以点分十进制表示,主干区域的标识符固定为0.0.0.0
。每个区域都要通过一个区域边界路由器
来连接主干区域,比如上图中R3
,R4
,R7
都是区域边界路由器。
利用泛洪法交换链路状态信息时,是在每个区域之间,而非整个自治系统
这样就可以避免路由器太多,导致太多的链路状态信息被发送到网络中,导致网络拥挤了。
外部网关协议
BGP-4
由于不同的自治系统使用不同的内部路由选择协议并使用不同的度量,所以必须在不同的自治系统之间使用另外的路由选择协议。目前使用最多的是边界网关协议 BGP
, 其最新版本是 BGP-4
)。
BGP
只能是力求寻找一条能够到达目的网络且比较好的路由,而并非要寻找一条最佳路由。
本博客不详细讲解BGP-4
协议,只是简单的讲解其作用。