2. OSPF协议基础回顾

OSPF(Open Shortest Path First,开放最短路径优先)是一种典型的链路状态路由协议。理解OSPF,不能只停留在“它会自动学路由”这个层面,而要抓住四个相互咬合的核心:每台路由器如何描述自己周围的链路、这些描述如何在全网同步成一份一致的链路状态数据库(LSDB)、SPF算法如何基于这份数据库算出最短路径树、以及区域划分和邻居/邻接关系如何决定信息在哪些路由器之间可靠地交换。这四者共同构成了OSPF从“发现拓扑”到“生成路由表”的完整链条。

一、链路状态数据库:全网拓扑的一致视图

在距离矢量协议中,路由器只知道自己“到某个目的地有多远、下一跳是谁”,邻居告诉什么就信什么。OSPF完全不同:每台路由器都会生成描述自身接口状态的信息,称为LSA(Link State Advertisement,链路状态通告)。LSA不是路由条目,而是“我这条链路连到谁、开销是多少、我是不是区域边界路由器”这类拓扑事实。所有LSA被收集起来,就形成LSDB。

LSDB的关键特征是“区域内一致”。在同一个OSPF区域内,所有路由器的LSDB内容应当完全相同,只是每台路由器自己产生的那条LSA由自己负责。正因为大家看到的是同一张拓扑图,每台路由器独立运行SPF后得到的路径才不会互相矛盾。LSDB中常见的LSA类型包括:Type 1 Router LSA描述路由器自身链路,Type 2 Network LSA描述广播网段上的DR,Type 3 Summary LSA由ABR产生用于区域间路由,Type 4/5用于ASBR和外部路由,Type 7用于NSSA。理解这些类型,是后续排障时判断“为什么这条路由没进来”的基础。

二、SPF算法:从LSDB到最短路径树

SPF(Shortest Path First,最短路径优先)算法即Dijkstra算法。它以本路由器为根,把LSDB中的路由器节点和网段节点作为图的顶点,把链路开销作为边的权重,逐步选出到各节点的最短路径,最终形成一棵以自己为根的最短路径树。树上的分支就是到达各目的网段的出接口和下一跳。

需要强调的是,OSPF的度量值是“开销(Cost)”,默认通常按接口带宽反比计算,公式为参考带宽除以接口带宽。例如参考带宽为100 Mbps时,100 Mbps接口开销为1,10 Mbps接口开销为10,1000 Mbps接口开销仍为1(因为取整后小于1按1计)。这意味着在默认参数下,千兆和百兆可能被算成同一开销,实际工程中常通过auto-cost reference-bandwidth调整参考带宽,让高速链路体现出差异。

SPF计算是分区域的:区域内拓扑变化触发本区域SPF重算;区域间路由变化通常只触发部分计算,不重跑整棵SPF树。这种设计正是OSPF能够支撑大型企业网络的重要原因。

三、区域划分:把大网切成可控的层次

OSPF引入区域(Area)概念,本质是为了限制LSA泛洪范围和SPF计算规模。所有区域必须与骨干区域Area 0相连,Area 0负责在区域间传递汇总信息。路由器按角色可分为:内部路由器(所有接口在同一区域)、骨干路由器(接口在Area 0)、ABR(区域边界路由器,连接Area 0与其他区域)、ASBR(自治系统边界路由器,引入外部路由)。

区域划分的工程原则是:Area 0保持稳定且不承载过多终端网段;非骨干区域通过ABR接入Area 0;对规模较大的区域可使用完全末梢区域(Totally Stubby)减少LSA数量。下图展示了LSDB、SPF、区域与邻居关系之间的整体关系。

OSPF 从链路状态到路由表的协作关系 骨干区域 Area 0 R1 R2 ABR R3 10.0.12.0/30 10.0.23.0/30 普通区域 Area 1 R4 R5 R6 10.1.45.0/30 10.1.56.0/30 ABR 连接 Area 0 与 Area 1 链路状态数据库 LSDB Type1/2 区域内拓扑 Type3/4/5 区域间与外部 SPF 计算 以本机为根 Dijkstra 最短路径树 OSPF 路由表 目的网段 / 下一跳 / 开销 O 区域内 O IA 区域间 邻居与邻接关系建立过程 Down → Init → 2-Way → ExStart → Exchange → Loading → Full LSA 泛洪同步

四、邻居与邻接关系建立过程

OSPF路由器之间并不是一上来就交换完整数据库。它们先通过Hello报文发现彼此,再根据参数协商决定是否建立邻接关系。Hello报文里携带Router ID、Area ID、Hello/Dead时间、网络掩码、认证信息、Stub区域标记等。只有这些参数匹配,双方才可能继续往下走。

邻居状态机是排障时最常用的观察点,典型状态迁移如下:

  • Down:尚未收到对方Hello。
  • Init:收到对方Hello,但对方Hello的邻居列表里还没有自己。
  • 2-Way:双方Hello中都看到对方,邻居关系建立。此时在广播网络中会进行DR/BDR选举。
  • ExStart:协商主从关系,确定DD报文序号。
  • Exchange:交换DD报文,描述各自LSDB摘要。
  • Loading:根据摘要请求缺失的LSA。
  • Full:双方LSDB同步完成,邻接关系建立。

在广播网络中,只有DR/BDR与其他路由器形成Full邻接,DROther之间停留在2-Way。这是正常现象,不是故障。判断邻接是否正常,应看show ip ospf neighbor中状态是否为FULL,以及是否出现FULL/DR、FULL/BDR、FULL/DROTHER等角色标识。

五、一个可观察的示例

假设R1与R2在Area 0中通过10.0.12.0/30互联,R1接口开销为10,R2接口开销为10。R1的LSDB中会有一条描述该网段的Type 1 LSA,R2同样有一条。SPF计算后,R1到R2环回口的最短路径开销为10加R2环回口开销。若把R1接口开销改为100,SPF重算后路径开销变为100加R2环回口开销,路由表下一跳不变但度量值变化。通过show ip ospf database可查看LSA,通过show ip ospf interface可确认开销,通过show ip route ospf可验证最终结果。

排障顺序建议:先看邻居状态是否Full,再看LSDB中LSA是否齐全,最后看SPF结果和路由表。邻居卡在ExStart/Exchange,多与MTU不匹配或单播可达性有关;卡在2-Way且非DR/BDR,通常是广播网络中的正常现象。

把LSDB、SPF、区域和邻居状态放在一起看,就能理解OSPF的完整逻辑:邻居关系是信息交换的前提,LSDB是拓扑的仓库,SPF是计算引擎,区域划分是控制规模的边界。四者缺一不可,任何一环异常,最终都会表现为路由缺失或路径次优。