精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

OSPF 路由协议(链路状态) ​

考情分析 ​

OSPF 是 408 网络层的重要考点,和 RIP 经常放在一起对比考。选择题侧重考 OSPF 的特性(链路状态、使用 Dijkstra、洪泛法等),大题有时会给一个拓扑让你用 Dijkstra 算法计算最短路径。

考频:★★★★

OSPF 的基本思想 ​

OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态路由协议。

和 RIP 的距离向量思路不同,OSPF 的每个路由器都掌握整个网络的拓扑信息,然后独立地用 Dijkstra 算法计算到每个目的网络的最短路径。

核心流程:

  1. 每个路由器发现自己的邻居和到邻居的链路代价
  2. 构造一条 LSA(Link State Advertisement,链路状态通告),描述自己和邻居的连接关系
  3. 通过洪泛法(Flooding)将 LSA 发送给网络中的所有路由器
  4. 每个路由器收集所有 LSA,构建出完整的链路状态数据库(LSDB)
  5. 在 LSDB 基础上,用 Dijkstra SPF 算法计算到每个目的网络的最短路径树

五种报文类型 ​

OSPF 定义了五种报文,直接封装在 IP 数据报中(协议号 89),不使用 TCP 或 UDP。

类型名称功能
1Hello发现和维护邻居关系,周期性发送
2数据库描述(DBD)向邻居概述自己的 LSDB 内容
3链路状态请求(LSR)向邻居请求特定的 LSA
4链路状态更新(LSU)向邻居发送 LSA(洪泛的核心报文)
5链路状态确认(LSAck)对收到的 LSU 进行确认

邻居关系建立过程:

LSA 与洪泛 ​

LSA 的内容 ​

每个路由器产生的 LSA 描述了它与哪些网络/路由器直接相连,以及链路的代价。

例如,路由器 R1 的 LSA 可能是:

  • R1 ↔ Net1,代价 1
  • R1 ↔ R2,代价 5
  • R1 ↔ R3,代价 3

洪泛法(Flooding) ​

路由器收到一条新的 LSA 后,将其从除接收接口外的所有接口转发出去。这样,一条 LSA 最终会传遍整个网络(或整个区域)。

洪泛的特点:

  • 每条 LSA 都有序列号,防止旧的 LSA 覆盖新的
  • 收到 LSA 后要发送 LSAck 确认,保证可靠传输
  • 只在链路状态发生变化时才洪泛新的 LSA(不像 RIP 定期广播整张路由表)

Dijkstra SPF 计算 ​

每个路由器收集到完整的 LSDB 后,以自己为根节点运行 Dijkstra 算法,计算到所有目的网络的最短路径树。

Dijkstra 算法的基本过程:

  1. 初始化:将自己放入已确认集合 S,到自己的距离为 0
  2. 从 S 的邻居中选出距离最小的节点 u,加入 S
  3. 更新 u 的所有邻居的距离(松弛操作)
  4. 重复步骤 2-3 直到所有节点都加入 S

计算示例 ​

给定拓扑(链路代价标注在边上):

R1 ---5--- R2 ---2--- R4
|          |          |
3          1          4
|          |          |
R3 ---6--- R5 ---1--- R6

从 R1 出发,Dijkstra 计算过程:

步骤加入S到R2到R3到R4到R5到R6
初始R153∞∞∞
1R353∞9∞
2R25376∞
3R553767
4R453767
5R653767

最短路径:

  • R1→R2:距离 5,路径 R1→R2
  • R1→R3:距离 3,路径 R1→R3
  • R1→R4:距离 7,路径 R1→R2→R4
  • R1→R5:距离 6,路径 R1→R2→R5
  • R1→R6:距离 7,路径 R1→R2→R5→R6

区域划分 ​

大型网络中如果所有路由器都互相洪泛 LSA,开销会很大。OSPF 引入了区域(Area)的概念来控制洪泛范围。

  • 骨干区域(Area 0):所有区域都必须连接到骨干区域
  • 非骨干区域:编号非 0 的区域,内部的 LSA 只在本区域洪泛
  • 区域边界路由器(ABR):连接两个区域的路由器,负责在区域间传递路由摘要

区域划分的好处:

  • 减少了 LSA 洪泛的范围,降低网络开销
  • 每个区域内的路由器只需要维护本区域的完整 LSDB
  • 区域之间通过 ABR 交换路由摘要信息

DR 与 BDR ​

为什么需要 DR/BDR ​

在多路访问网络(如以太网)中,如果有 N 个路由器,两两建立邻接关系需要 N(N−1)2 对,LSA 交换量会非常大。

OSPF 引入了 DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 来解决这个问题。

三种角色 ​

角色功能
DR负责收集本网段所有路由器的 LSA 并统一分发,充当 LSA 交换的"中心节点"
BDRDR 的备份,DR 故障时自动接替,避免重新选举的开销
DROther普通路由器,只与 DR 和 BDR 建立邻接关系,不与其他 DROther 建立邻接

引入 DR 后,N 个路由器只需建立 2(N−1) 个邻接关系(每个 DROther 与 DR 和 BDR 各一个),远少于 N(N−1)2。

DR/BDR 选举规则 ​

  1. 比较优先级(Priority):优先级最高的成为 DR,次高的成为 BDR。优先级范围 0~255,默认值为 1
  2. 优先级相同时比较 Router ID:Router ID 大的优先。Router ID 通常是路由器上最大的 IP 地址(或手动配置的值)
  3. 优先级为 0 不参与选举:将优先级设为 0 可以确保该路由器不会成为 DR 或 BDR
  4. 非抢占式:DR/BDR 选举完成后,即使有优先级更高的新路由器加入网络,也不会抢占当前的 DR/BDR。只有当 DR 故障时,BDR 才会升级为 DR,然后重新选举 BDR

邻居 vs 邻接 ​

这两个概念容易混淆:

概念含义建立条件
邻居(Neighbor)通过 Hello 报文互相发现的路由器交换 Hello 报文即可
邻接(Adjacency)完成了 LSDB 同步的路由器对需要完整的 DBD/LSR/LSU 交换过程

在多路访问网络中,所有路由器都是邻居,但只有与 DR/BDR 之间才会建立邻接关系。在点对点链路中,没有 DR/BDR 选举,直连的两个路由器直接建立邻接。

OSPF vs RIP 对比 ​

对比项RIPOSPF
算法类型距离向量链路状态
度量标准跳数链路代价(可以基于带宽等)
最大规模15 跳无限制
更新方式定期广播完整路由表(30秒)只在变化时洪泛 LSA
传输方式UDP 端口 520直接封装在 IP 中(协议号 89)
路由环路可能(无穷计数)不会(每个路由器有全局视图)
收敛速度慢快
支持区域不支持支持(Area 划分)
路由表来源邻居的距离向量全网的链路状态数据库
负载均衡不支持支持等价多路径

交互可视化 ​

加载可视化中...

易错点 ​

1. OSPF 不使用 TCP 或 UDP

OSPF 报文直接封装在 IP 数据报中,协议号为 89。这和 RIP(UDP)、BGP(TCP)都不一样。

2. OSPF 的"洪泛"不是"广播"

洪泛是将 LSA 从所有接口(除接收接口)转发出去,让整个区域的路由器都收到。广播是数据链路层的概念。虽然效果类似"传遍所有节点",但实现机制不同。

3. 每个路由器独立计算路由

所有路由器的 LSDB 相同,但每个路由器以自己为根运行 Dijkstra,所以得到的最短路径树不同。最终生成的路由表也不同。

4. 区域 0 是骨干区域,不可或缺

所有非骨干区域必须直接与 Area 0 相连。如果某个区域无法直连 Area 0,需要通过虚链路(virtual link)连接。

5. OSPF 链路代价不是跳数

OSPF 的代价可以根据链路带宽、延迟等因素设置。不同厂商的默认计算方式可能不同(常见的是 代价=108带宽(bps))。

本文对应考点 ​

  • OSPF 是链路状态协议,每个路由器掌握全网拓扑
  • 五种报文类型:Hello、DBD、LSR、LSU、LSAck
  • 洪泛法传播 LSA,只在状态变化时洪泛
  • 用 Dijkstra 算法计算最短路径
  • OSPF 直接封装在 IP 中,协议号 89
  • 区域划分:骨干区域 Area 0,ABR 负责区域间路由
  • OSPF vs RIP 的各项对比

真题练习 ​