1、基本介绍

开放最短路径优先 OSPF(Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的。“开放”表明 OSPF 协议不是受某一家厂商控制,而是公开发表的。

“最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法 SPFOSPF 是基于链路状态的,而不像RIP那样是基于距离向量的。

OSPF 采用 SPF 算法计算路由,从算法上保证了不会产生路由环路。OSPF 不限制网络规模,更新效率高,收敛速度快。

链路状态是指本路由器都和哪些路由器相邻,以及相应链路的“代价”(cost)。

  • “代价” 用来表示费用、距离、时延、带宽,等等。这些都由网络管理人员来决定。

例如:如下,R1 的邻居路由器有 R2,相应的链路代价用 ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样 / 链路带宽 ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样,结果:ospf的o_ase开销全部一样 ospf开销值计算_数据库_03

  • R1 的邻居路由器有 R4,相应的链路代价用 ospf的o_ase开销全部一样 ospf开销值计算_链路_04 / 链路带宽 ospf的o_ase开销全部一样 ospf开销值计算_网络_05,结果小于 ospf的o_ase开销全部一样 ospf开销值计算_网络_06 ,记为 ospf的o_ase开销全部一样 ospf开销值计算_网络_06

ospf的o_ase开销全部一样 ospf开销值计算_OSPF_08


2、问候分组(封装到 IP 数据报(端口:89))/邻居表

OSPF 相邻路由器之间通过交互ospf的o_ase开销全部一样 ospf开销值计算_数据库_09,建立和维护ospf的o_ase开销全部一样 ospf开销值计算_链路_10

  • Hello 分组封装在 IP 数据报中,发往组播地址 ospf的o_ase开销全部一样 ospf开销值计算_OSPF_11

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_12

IP 数据报首部中的协议号字段的取值应为 89,来表明 IP 数据报的数据载荷为 OSPF 分组

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_13

  • 发送周期为 10
  • 40 秒未收到来自邻居路由器的 Hello 分组,则认为该邻居路由器不可达

每个路由器都会建立一张邻居表

例如:

ospf的o_ase开销全部一样 ospf开销值计算_链路_14

若在 “死亡” 倒计时到达 ospf的o_ase开销全部一样 ospf开销值计算_OSPF_15 之前再次收到了来自 R2 的问候分组

  • 则重新启动针对该邻居条目的 40 秒 “死亡” 倒计时

否则,当 “死亡” 倒计时为 ospf的o_ase开销全部一样 ospf开销值计算_OSPF_15

  • 则判断该邻居路由器不可达

ospf的o_ase开销全部一样 ospf开销值计算_网络_17


3、链路状态通告 LAS / 链路状态更新分组 LSU

使用 OSPF 的每个路由器都会产生ospf的o_ase开销全部一样 ospf开销值计算_数据库_18

LSA 中包含以下内容:

  • 直连网络的链路状态信息
  • 邻居网络的链路状态信息

例如:

ospf的o_ase开销全部一样 ospf开销值计算_链路_19

LSA 被封装到ospf的o_ase开销全部一样 ospf开销值计算_数据库_20

例如:

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_21

这样,自治系统中每个路由器所发送的封装有链路状态通告的链路状态更新分组,会传递给系统中其他所有路由器。


4、链路状态数据库 LSDB

使用 OSPF 的每个路由器都有一个ospf的o_ase开销全部一样 ospf开销值计算_网络_22 ,用于存储 LSA

通过各路由器洪泛发送封装有自己 LSALSU 分组,各路由器的 LSDB 最终将达到一致。

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_23


使用 OSPF 的各路由器ospf的o_ase开销全部一样 ospf开销值计算_OSPF_24,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。

例如:以下各链路旁的数字表示代价,通过各路由器洪泛发送封装有自己链路状态通告的链路状态更新分组

  • 各路由器最终会得出相同的链路状态数据库
  • 有链路状态数据库可以得出带权有向图

ospf的o_ase开销全部一样 ospf开销值计算_数据库_25

ospf的o_ase开销全部一样 ospf开销值计算_网络_26


5、5大类型

类型 ospf的o_ase开销全部一样 ospf开销值计算_数据库_03问候(Hello)分组

  • 用来发现和维护邻居路由器的可达性。

类型 ospf的o_ase开销全部一样 ospf开销值计算_网络_28数据库描述(Database Description)分组

  • 向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息

类型 ospf的o_ase开销全部一样 ospf开销值计算_网络_29链路状态请求(Link State Request)分组

  • 向邻居路由器请求发送某些链路状态项目的详细信息。

类型 ospf的o_ase开销全部一样 ospf开销值计算_链路_30链路状态更新(Link State Update)分组

  • 路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态。

类型 ospf的o_ase开销全部一样 ospf开销值计算_数据库_31链路状态确认(Link State Acknowledgment)分组

  • 这是对链路状态更新分组的确认分组。

6、OSPF 的基本工作过程

OSPF 的基本工作过程

相邻路由器之间周期性发送问候分组,以便建立和维护邻居关系

建立邻居关系后,给邻居路由器发送数据库描述分组

也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器

例如 R1 收到 R2数据库描述分组后,发现自己缺少其中的某些链路状态项目

  • 于是就给 R2 发送链路状态请求分组

R2 收到后,将 R1 所缺少的链路状态项目的详细信息封装链路状态更新分组中发送给 R1

R1 收到后,将这些所缺少的链路状态项目的详细信息添加到自己的链路状态数据库中

  • 并给 R2 发送链路状态确认分组

说明:R2 也可以向 R1 请求自己所缺少的链路状态项目的详细信息

ospf的o_ase开销全部一样 ospf开销值计算_数据库_32


最终 R1R2 的状态数据库到达一致,也就是链路数据库达到同步

30 分钟或链路状态发生变化时,路由器都会发送链路状态更新分组

收到该分组的其他路由器将洪泛转发该分组,并给该路由器发回链路状态确认分组

  • 新情况下的链路状态数据库同步

ospf的o_ase开销全部一样 ospf开销值计算_OSPF_33


7、多点接入造成的广播风暴

OSPF 路由器再多点接入网络中建立邻居关系时

  • 若不采用其他机制,将会长生大量的多播分组

例如:如下 ospf的o_ase开销全部一样 ospf开销值计算_数据库_31

  • 它们周期性地发送问候分组已建立和维护邻居关系

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_35

这些路由器中的任意两个路由器都互为邻居关系

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_36

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_37

这样每个路由器要向其他 (ospf的o_ase开销全部一样 ospf开销值计算_数据库_38) 个路由器发送问候分组链路状态更新分组


8、指定路由器 DR / 备用路由器 BDR

为了减少所发送分组的数量

  • OSPF 采用选举指定路由器 DR (designated router)
  • 和备用路由器 BDR(backup designated router)

ospf的o_ase开销全部一样 ospf开销值计算_链路_39

ospf的o_ase开销全部一样 ospf开销值计算_OSPF_40


ospf的o_ase开销全部一样 ospf开销值计算_数据库_41

DR/BDR 之间通过 DR/BDR 交换信息

DR 出现问题,则由 BDR 顶替 DR


实现 DR/BDR 的选举并不复杂,无非就是各路由器之间交换一些选举参数

  • 例如:路由器优先级、路由器 ID、接口 IP 地址等
  • 然后根据选举规则选出 DRBDR

这与交换机生成树协议选举根交换机类似


9、区域(Area)划分

为了使 OSPF 能够用于规模很大的网络,OSPF 把一个自治系统再划分为若干个更小的范围

  • 叫做区域(Area

例如:如下所示的很大的网络,将其划分成一个自治系统

  • 在该自治系统以内,所有路由器都是用 OSPF 协议

ospf的o_ase开销全部一样 ospf开销值计算_链路_42

OSPF 将该自治系统划分成 ospf的o_ase开销全部一样 ospf开销值计算_链路_30


每个区域都有一个 ospf的o_ase开销全部一样 ospf开销值计算_链路_44

例如:主干区域的标识符必须为 ospf的o_ase开销全部一样 ospf开销值计算_数据库_45

  • 主干区域用于连通其他区域,其他区域的标识符不能为 ospf的o_ase开销全部一样 ospf开销值计算_网络_46

ospf的o_ase开销全部一样 ospf开销值计算_数据库_47

每个区域的规模不能太大,一般所包含的路由器不应超过 ospf的o_ase开销全部一样 ospf开销值计算_网络_48


划分区域的好处就是:

  • 把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个自治系统
  • 这样就减少了整个网络上的通信量

若一个路由器的所有接口都在一个区域内

  • 则成为区域内路由器 IR(internal router):R1R2R8R9

为了本区域可以和自治系统内的其他区域连通。

每个区域都会有一个区域边界路由器(area border router)

  • 其一个接口用于连接自身所在区域,另一个接口用于连接主干区域
  • R3R4R7

主干路由器(包含区域边界路由器)BBR(backbone router)

自治系统边界路由器 ASBR(AS border router)

  • 专门和本自治系统外的其他自治系统交换路由信息

ospf的o_ase开销全部一样 ospf开销值计算_链路_49


以上中,区域边界路由器 R3 向主干区域发送自己所在区域 ospf的o_ase开销全部一样 ospf开销值计算_数据库_03

  • 向自己所在区域发送区域 ospf的o_ase开销全部一样 ospf开销值计算_网络_46ospf的o_ase开销全部一样 ospf开销值计算_网络_52ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_53的链路状态通告

其他同理

ospf的o_ase开销全部一样 ospf开销值计算_ospf的o_ase开销全部一样_54


采用分层次划分区域的方法,虽然使交换信息的种类多了,同时也使 OSPF 协议更加复杂了

  • 却能使每个区域内部交换信息的通信量大大减少
  • 因而使 OSPF 协议能够用于规模很大的自治系统中

10、小结

ospf的o_ase开销全部一样 ospf开销值计算_网络_55