Appearance
OSPF 路由协议(链路状态)
考情分析
OSPF 是 408 网络层的重要考点,和 RIP 经常放在一起对比考。选择题侧重考 OSPF 的特性(链路状态、使用 Dijkstra、洪泛法等),大题有时会给一个拓扑让你用 Dijkstra 算法计算最短路径。
考频:★★★★
OSPF 的基本思想
OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态路由协议。
和 RIP 的距离向量思路不同,OSPF 的每个路由器都掌握整个网络的拓扑信息,然后独立地用 Dijkstra 算法计算到每个目的网络的最短路径。
核心流程:
- 每个路由器发现自己的邻居和到邻居的链路代价
- 构造一条 LSA(Link State Advertisement,链路状态通告),描述自己和邻居的连接关系
- 通过**洪泛法(Flooding)**将 LSA 发送给网络中的所有路由器
- 每个路由器收集所有 LSA,构建出完整的链路状态数据库(LSDB)
- 在 LSDB 基础上,用 Dijkstra SPF 算法计算到每个目的网络的最短路径树
五种报文类型
OSPF 定义了五种报文,直接封装在 IP 数据报中(协议号 89),不使用 TCP 或 UDP。
| 类型 | 名称 | 功能 |
|---|---|---|
| 1 | Hello | 发现和维护邻居关系,周期性发送 |
| 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 算法的基本过程:
- 初始化:将自己放入已确认集合
,到自己的距离为 0 - 从
的邻居中选出距离最小的节点 ,加入 - 更新
的所有邻居的距离(松弛操作) - 重复步骤 2-3 直到所有节点都加入
计算示例
给定拓扑(链路代价标注在边上):
R1 ---5--- R2 ---2--- R4
| | |
3 1 4
| | |
R3 ---6--- R5 ---1--- R6从 R1 出发,Dijkstra 计算过程:
| 步骤 | 加入S | 到R2 | 到R3 | 到R4 | 到R5 | 到R6 |
|---|---|---|---|---|---|---|
| 初始 | R1 | 5 | 3 | |||
| 1 | R3 | 5 | 3 | 9 | ||
| 2 | R2 | 5 | 3 | 7 | 6 | |
| 3 | R5 | 5 | 3 | 7 | 6 | 7 |
| 4 | R4 | 5 | 3 | 7 | 6 | 7 |
| 5 | R6 | 5 | 3 | 7 | 6 | 7 |
最短路径:
- 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
在多路访问网络(如以太网)中,如果有
OSPF 引入了 DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 来解决这个问题。
三种角色
| 角色 | 功能 |
|---|---|
| DR | 负责收集本网段所有路由器的 LSA 并统一分发,充当 LSA 交换的"中心节点" |
| BDR | DR 的备份,DR 故障时自动接替,避免重新选举的开销 |
| DROther | 普通路由器,只与 DR 和 BDR 建立邻接关系,不与其他 DROther 建立邻接 |
引入 DR 后,
DR/BDR 选举规则
- 比较优先级(Priority):优先级最高的成为 DR,次高的成为 BDR。优先级范围 0~255,默认值为 1
- 优先级相同时比较 Router ID:Router ID 大的优先。Router ID 通常是路由器上最大的 IP 地址(或手动配置的值)
- 优先级为 0 不参与选举:将优先级设为 0 可以确保该路由器不会成为 DR 或 BDR
- 非抢占式:DR/BDR 选举完成后,即使有优先级更高的新路由器加入网络,也不会抢占当前的 DR/BDR。只有当 DR 故障时,BDR 才会升级为 DR,然后重新选举 BDR
邻居 vs 邻接
这两个概念容易混淆:
| 概念 | 含义 | 建立条件 |
|---|---|---|
| 邻居(Neighbor) | 通过 Hello 报文互相发现的路由器 | 交换 Hello 报文即可 |
| 邻接(Adjacency) | 完成了 LSDB 同步的路由器对 | 需要完整的 DBD/LSR/LSU 交换过程 |
在多路访问网络中,所有路由器都是邻居,但只有与 DR/BDR 之间才会建立邻接关系。在点对点链路中,没有 DR/BDR 选举,直连的两个路由器直接建立邻接。
OSPF vs RIP 对比
| 对比项 | RIP | OSPF |
|---|---|---|
| 算法类型 | 距离向量 | 链路状态 |
| 度量标准 | 跳数 | 链路代价(可以基于带宽等) |
| 最大规模 | 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 的代价可以根据链路带宽、延迟等因素设置。不同厂商的默认计算方式可能不同(常见的是
高频考点清单
- OSPF 是链路状态协议,每个路由器掌握全网拓扑
- 五种报文类型:Hello、DBD、LSR、LSU、LSAck
- 洪泛法传播 LSA,只在状态变化时洪泛
- 用 Dijkstra 算法计算最短路径
- OSPF 直接封装在 IP 中,协议号 89
- 区域划分:骨干区域 Area 0,ABR 负责区域间路由
- OSPF vs RIP 的各项对比