4-6-3 开放最短路径优先OSPF的基本工作原理
本节课我们介绍开放最短路径优先OSPF协议的基本工作原理。
OSPF简介
开放最短路径优先OSPF协议是为克服RIP协议的缺点,在 1989 年开发出来的。
开放:表明OSPF不是受某一厂商控制的,而是公开发表的。
最短路径优先:是因为使用了迪杰斯特拉提出的最短路径算法SPF。
OSPF是基于链路状态的,而不像RIP那样是基于距离向量的。
OSPF 采用最短路径优先算法计算路由,从算法上保证了不会产生路由环路。
OSPF不限制网络规模,更新效率高、收敛速度快。
链路状态是指本路由器都和哪些路由器相邻以及相应链路的“代价”。
- 代价用来表示费用、距离、时延、带宽等等,这些都是由网络管理人员来决定的。
链路状态 =“代价”
我们来举例说明。
在思科路由器中, OSPF计算代价的方法是,用 100 Mbit/s除以链路带宽,计算结果小于 1 的值仍记为1,大于 1 且有小数的舍去小数。

我们来看看图中各路由器的链路状态即“代价”:
- R1 的邻居路由器有R2,相应的链路代价用 100 Mbit/s除以链路带宽 100 Mbit/s,结果是1
- R1 的邻居路由器还有R4。相应的链路代价用 100 Mbit/s除以链路带宽 1G 比特每秒,计算结果小于1,但仍记为1。
- 很容易的得出其他各路由器的链路状态,我们就不再赘述了。
邻居关系
OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。

OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。

- 问候分组需要封装在 IP 数据报中发送,发往组播地址224.0.0.5。
- 问候分组的IP 数据报首部中的协议号字段的取值应为89,来表明 IP 数据报的数据载和为 OSPF 分组。
- 问候分组的发送周期为 10 秒,若 40 秒仍未收到来自邻居路由器的问候分组,则认为该邻居路由器不可达。
因此每个路由器都会建立一张邻居表,例如,这是路由器 R1 的邻居表,其中的每一个条目对应记录其各邻居路由器的相关信息,包括邻居ID、接口以及死亡倒计时。例如:

R2 是 R1 的一个邻居路由器,为简单起见,邻居 ID 就记为R2。实践中应填写相应的路由器ID。
该邻居路由器与自己的接口 1 相连,将接口号记为1
死亡倒计时还剩 36 秒。若在死亡倒计时到达 0 之前再次收到了来自 R2 的问候,分组则重新启动针对该邻居条目的 40 秒死亡倒计时。否则,当死亡倒计时为 0 时,则判定该邻居路由器不可达。
又如,

- R4 是 R1 的另一个邻居路由器,邻居 ID 就记为R4
- 该邻居路由器与自己的接口 0 相连,将接口号记为0
- 死亡倒计时还剩余 18 秒
链路状态通告LSA
使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)
链路状态通告的内容
使用OSPF的每个路由器都会产生链路状态通告,其中包含以下两类内容
- 一类是直连网络的链路状态信息
- 一类是邻居路由器的链路状态信息
假设 N1 是路由器 R4 的直连网络,则 R4 的链路状态通告应包含
- R4 与该直连网络的链路状态信息
- 其邻居路由器 R1 的链路状态信息
- 其邻居路由器 R3 的链路状态信息。

LSA被封装在链路状态更新分组LSU中,采用洪泛法发送
链路状态通告被封装在链路状态更新分组LSU中,采用洪泛法发送。收到链路状态更新分组的路由器将从自己其他所有接口转发该分组,也就是进行洪泛转发,如图所示。

这样自治系统中每个路由器所发送的封装有链路状态通告的链路状态更新分组会传递给系统中其他所有路由器。
使用 OSPF的每个路由器都有一个链路状态数据库,用于存储链路状态通告
- 使用 OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储链路状态通告LSA。
- 通过各路由器洪泛发送封装有自己链路状态通告的链路状态更新分组。各路由器的链路状态数据库最终将达到一致。
例如,这是路由器 R2 的链路状态数据库,其中记录有系统中各路由器的链路状态通告。

使用 OSPF的各路由器基于链路状态数据库进行最短路径优先SPF计算使用 OSPF的各路由器基于链路状态数据库进行最短路径优先计算,就可构建出各自到达其他各路由器的最短路径,即构建出各自的路由表。
例如,有这样一个网络拓扑,各链路旁的数字表示代价。通过各路由器洪泛发送封装有自己链路状态通告的链路状态更新分组,各路由器最终会得出相同的链路状态数据库。有链路状态数据库可以得出带权有向图。

对该图进行基于Dijkstra的最短路径优先算法,就可以得出以各路由器为根的最短路径。如图所示。

对于这样一个比较简单的网络拓扑,即使不懂得最短路径优先算法,也可以很快找出每个路由器到达其他各路由器的最短路径。但是如果网络拓扑比较复杂,该项工作对人类而言就比较复杂了。因此可以按照Dijkstra提出的最短路径优先算法编制程序,让路由器执行该程序。如果对该算法感兴趣,可以自行查阅相关资料,我们就不再赘述了。对于一般的网络工程师,即便不熟悉该算法,也不影响对 OSPF 协议的配置和使用。
OSPF协议的分组类型
OSPF包含以下 5 种分组
- 类型1:问候(Hello)分组,用来发现和维护邻居路由器的可达性
- 类型2:数据库描述(Database Description)分组,用来像邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
- 类型3:链路状态请求(Link State Request)分组,用来向邻居路由器请求发送某些链路状态项目的详细信息
- 类型4:链路状态更新(Link State Update)分组。路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态
- 类型5:链路状态确认(Link State Acknowledgment)分组,是对链路状态更新分组的确认分组
举例说明OSPF协议基本工作过程
接下来我们来举例说明 OSPF协议的基本工作过程。

建立邻居关系
相邻路由器之间周期性发送问候分组,以便建立和维护邻居关系。
交换数据库描述分组
建立邻居关系后,给邻居路由器发送数据库描述分组,也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器。
交互链路状态请求分组及链路状态确认分组
例如
- R1 收到 R2 的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给 R2 发送链路状态请求分组。
- R2 收到后,将 R1 所缺少的链路状态项目的详细信息封装在链路状态更新分组中发送给R1,R1收到后,将这些所缺少的链路状态项目的详细信息添加到自己的链路状态数据库中,并给 R2 发送链路状态确认分组。
同理, R2 也可以向 R1 请求自己所缺少的链路状态项目的详细信息。这里就不再演示该过程了。
链路状态数据库达到同步
最终, R1 和 R2 的链路状态数据库将达到一致,也就是链路状态数据库达到同步。
每 30 分钟或链路状态发生变化时,路由器都会发送链路状态更新分组。收到该分组的其他路由器将洪泛转发该分组,并给该路由器发回链路状态确认分组。这又称为新情况下的链路状态数据库同步。

OSPF在多点接入网络中路由器邻居关系的建立
选举指定路由器DR(designateDRouter)和备用的指定路由器BDR(backup designateDRouter)
所有的非DR/BDR只与DR/BDR建立邻居关系
非DR/BDR之间通过DR/BDR交换信息
当 OSPF 路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组。

例如,这 5 台路由器连接在同一个多点接入网络中,他们周期性的发送问候分组以建立和维护邻居关系。这些路由器中的任意两个路由器都互为邻居关系,如图所示。

邻居关系的数量为n(n-1)/2,其中 n 是路由器的数量,这样每个路由器要向其他 n - 1 个路由器发送问候分组和链路状态更新分组。
为了减少所发送分组的数量, OSPF采用旋局指定路由器DR和备用的指定路由器BDR的方法。如图所示,假设这两台路由器被分别选举为 DR 和 BDR。

所有的非 DR, BDR 只与 DR, BDR 建立邻居关系,如图所示。因此之前的邻居关系数量降低为2(n-2)+1。

非 DR, BDR 之间不能直接交换信息,而必须通过 DR BDR 进行交换。若 DR 出现问题,则由 BDR 顶替 DR 实现。
DR 和 BDR 的选举并不复杂,无非就是各路由器之间交换一些选举参数,例如路由器优先级、路由器 ID 接口、 IP 地址等,然后根据选举规则选出 DR 和BDR。这与交换机生成树协议选举根交换机类似,我们就要不再赘述了。
OSPF把一个自治系统(AS)划分为更小范围的区域(Area)
为了使OSPF协议能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,称为区域。
如图所示,这是一个规模很大的网络,我们将其划分成一个自治系统。在该自治系统内,所有路由器都使用OSPF协议。

OSPF将该自治系统再划分成 4 个更小的区域。

每个区域都有一个 32 比特的区域标识符,可以用点分十进制表示。例如

- 主干区域的标识符必须为0,也可表示成点分十进制形式的0.0.0.0。主干区域用于联通其他区域。
- 其他区域的标识符不能为0,且互不相同。每个区域的规模不应太大,一般所包含的路由器不应超过 200 个。
划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域,而不是整个自治系统,这样就减少了整个网络上的通信量。

区域内路由器IR
如果路由器的所有接口都在同一个区域内,则该路由器称为区域内路由器IR(internal router),如上图中的R1、R2、R8、R9。
区域边界路由器ABR
为了本区域可以和自治系统内的其他区域联通,每个区域都会有一个区域边界路由器ABR(area border router),如上图中的 R3、R4、R7。
区域边界路由器的一个接口用于连接自身所在区域,另一个接口用于连接主干区域,
主干路由器BBR
主干区域内的路由器称为主干路由器BBR(backbone router),如上图中的R3、R4、R5、R6、R7
我们也可以把区域边界路由器看作是主干路由器,
自治系统边界路由器ASBR
在主干区域内还要有一个路由器,专门和本自治系统外的其他自治系统交换路由信息,这样的路由器成为自治系统边界路由器,如上图中的R6
在本例中

区域边界路由器 R3 向主干区域发送自己所在区域 1 的链路状态通告,向自己所在区域发送区域 0、2、3 的链路状态通告。
区域边界路由器 R4 向主干区域发送自己所在区域 2 的链路状态通告,向自己所在区域发送区域 0、1、3 的链路状态通告。
区域边界路由器 R7 向主干区域发送自己所在区域 3 的链路状态通告,向自己所在区域发送区域 0、1、2的链路状态通告。
采用分层次划分区域的方法,虽然使交换信息的种类增多了,同时也使 OSPF协议更加复杂了,但这样做却能使每一个区域内部交换路由信息的通信量大大减小,因而是OSPF协议能够用于规模很大的自治系统中。
本节小结
