OSPF 协议学习指南
本文面向网络工程新手,从零开始系统讲解 OSPF(Open Shortest Path First,开放最短路径优先)协议。涵盖协议背景、核心作用、报文格式与字段详解、邻居建立流程、LSA 类型、路由计算原理,以及实际配置举例。
一、背景:为什么需要 OSPF
1.1 动态路由协议的演进
在早期网络中,RIP(Routing Information Protocol) 是最常见的动态路由协议。RIP 基于跳数(Hop Count)选路,最大跳数为 15,超过 15 跳就认为网络不可达。这意味着 RIP 只能用于小型网络,无法满足大型企业网和互联网的需求。
OSPF 的诞生背景:
- 20 世纪 80 年代末,互联网规模快速增长,RIP 的跳数限制和慢收敛成为瓶颈
- IETF(互联网工程任务组)开发了 OSPF 作为替代方案
- OSPF 基于 链路状态(Link-State) 算法,克服了 RIP 的距离矢量局限
- 目前广泛使用的是 OSPFv2(RFC 2328),适用于 IPv4 网络
- OSPFv3(RFC 5340)是 OSPF 的 IPv6 版本
1.2 OSPF 与 RIP 的核心对比
| 对比项 | RIP | OSPF |
|---|---|---|
| 算法类型 | 距离矢量(Bellman-Ford) | 链路状态(Dijkstra / SPF) |
| 度量标准 | 跳数(最大 15) | 开销(Cost),基于带宽计算 |
| 收敛速度 | 慢(可能几分钟) | 快(秒级甚至亚秒级) |
| 适用规模 | 小型网络 | 中大型网络 |
| 路由更新 | 定期广播完整路由表(30秒) | 触发更新 + 增量更新 |
| 区域划分 | 不支持 | 支持多区域,层次化设计 |
| 防环机制 | 简单(水平分割、毒性逆转) | 天然无环(SPF 算法保证) |
通俗理解: RIP 就像问路人"去北京怎么走",每到一个路口就问一次;OSPF 就像拥有一张完整的地图,自己计算出最短路线。
1.3 OSPF 在协议体系中的定位
OSPF 属于 IGP(Interior Gateway Protocol,内部网关协议),用于在同一个自治系统(AS)内部进行路由选择。
互联网路由协议体系
├── IGP(自治系统内部)
│ ├── 链路状态协议:OSPF、IS-IS
│ └── 距离矢量协议:RIP、EIGRP
└── EGP(自治系统之间)
└── BGP(Border Gateway Protocol)
二、OSPF 的核心作用
2.1 核心功能
OSPF 在网络中扮演以下关键角色:
1. 自动发现邻居
路由器启动 OSPF 后,会自动通过 Hello 报文发现直连链路上的其他 OSPF 路由器,无需手动配置邻居关系(NBMA 网络除外)。
2. 构建网络拓扑图
每台路由器通过 LSA(链路状态通告)描述自己周围的网络状况,这些 LSA 在整个区域内泛洪传播,最终每台路由器都拥有一份完整的网络拓扑数据库(LSDB)。
3. 计算最短路径
基于 LSDB,每台路由器独立运行 SPF(Shortest Path First)算法,以自己为根节点计算出到达每个目标网络的最短路径树。
4. 快速收敛
当网络拓扑发生变化时(如链路故障),OSPF 能迅速检测到变化并重新计算路由,收敛时间通常在秒级。
5. 层次化网络设计
通过区域(Area)划分,将大型网络分解为多个逻辑区域,每个区域维护独立的 LSDB,减少路由计算开销和 LSA 泛洪范围。
2.2 OSPF 的核心特点
| 特点 | 说明 |
|---|---|
| 基于链路状态 | 每台路由器掌握全网拓扑,而非仅知道"下一跳" |
| 无环路 | SPF 算法天然保证不会产生路由环路 |
| 快速收敛 | 拓扑变化后能迅速重新计算路由 |
| 支持区域划分 | 层次化设计,适合大型网络 |
| 支持 CIDR / VLSM | 支持无类别路由和可变长子网掩码 |
| 支持等价路由 | 支持到达同一目标的多条等开销路径(负载均衡) |
| 支持认证 | 保证路由信息的安全性 |
| 组播发送 | Hello 报文使用组播地址 224.0.0.5,减少对非 OSPF 设备的干扰 |
三、基本概念
3.1 路由器角色
| 角色 | 英文缩写 | 说明 |
|---|---|---|
| 内部路由器 | IR(Internal Router) | 所有接口都在同一个区域内的路由器 |
| 区域边界路由器 | ABR(Area Border Router) | 连接骨干区域和非骨干区域的路由器 |
| 自治系统边界路由器 | ASBR(AS Boundary Router) | 将外部路由引入 OSPF 的路由器 |
| 骨干路由器 | BR(Backbone Router) | 至少有一个接口在 Area 0 的路由器 |
路由器角色位置示意图:
┌─────────────────────────────────────────────┐
│ 外部网络(其他 AS / Internet) │
└──────────────────┬──────────────────────────┘
│
┌──────┴──────┐
│ R6 │ ← ASBR(自治系统边界路由器)
│ (ASBR+BR) │ 引入外部路由,同时在 Area 0
└──────┬──────┘
│
┌──────────────────────────────────────────────────────────────────────────┐
│ Area 0(骨干区域 Backbone) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ R1 │──────────────│ R2 │──────────────│ R3 │ │
│ │ (IR+BR) │ │ (ABR+BR)│ │ (ABR+BR)│ │
│ │ 内部路由 │ │ 区域边界 │ │ 区域边界 │ │
│ │ 器,只在 │ │ 路由器, │ │ 路由器, │ │
│ │ Area 0 │ │ 连接0和1 │ │ 连接0和2 │ │
│ └──────────┘ └─────┬────┘ └─────┬────┘ │
│ │ │ │
└────────────────────────────────────┼─────────────────────────┼───────────┘
│ │
┌───────────┴────────┐ ┌───────────┴────────┐
│ Area 1 │ │ Area 2 │
│ │ │ │
│ ┌──────┐ ┌──────┐│ │ ┌──────┐ ┌──────┐│
│ │ R4 │ │ R5 ││ │ │ R7 │ │ R8 ││
│ │(IR) │──│(IR) ││ │ │(IR) │──│(IR) ││
│ │ 只在 │ │ 只在 ││ │ │ 只在 │ │ 只在 ││
│ │Area1 │ │Area1 ││ │ │Area2 │ │Area2 ││
│ └──────┘ └──────┘│ │ └──────┘ └──────┘│
└────────────────────┘ └────────────────────┘
角色对照说明:
| 路由器 | 角色 | 说明 |
|---|---|---|
| R1 | IR + BR | 所有接口都在 Area 0,是骨干路由器也是内部路由器 |
| R2 | ABR + BR | 连接 Area 0 和 Area 1,负责区域间路由转发 |
| R3 | ABR + BR | 连接 Area 0 和 Area 2,负责区域间路由转发 |
| R4, R5 | IR | 所有接口都在 Area 1,只知道本区域内的拓扑 |
| R6 | ASBR + BR | 位于 Area 0,负责将外部路由(如 BGP、静态路由)引入 OSPF |
| R7, R8 | IR | 所有接口都在 Area 2,只知道本区域内的拓扑 |
注意: 一台路由器可以同时具有多个角色。例如 R2 既是 ABR(因为连接了多个区域)又是 BR(因为有接口在 Area 0);R6 既是 ASBR(因为引入了外部路由)又是 BR(因为接口在 Area 0)。
3.2 区域(Area)
OSPF 将自治系统划分为多个逻辑区域:
┌─────────────┐
│ Area 0 │ ← 骨干区域(必须存在)
│ (Backbone) │
└──┬───┬───┬──┘
│ │ │
┌──────┘ │ └──────┐
│ │ │
┌──────┴───┐ ┌───┴────┐ ┌───┴──────┐
│ Area 1 │ │ Area 2 │ │ Area 3 │
│ (常规) │ │ (Stub) │ │ (NSSA) │
└──────────┘ └────────┘ └──────────┘
区域类型:
| 区域类型 | 说明 |
|---|---|
| 骨干区域(Area 0) | 所有非骨干区域必须与 Area 0 相连,区域间路由通过 Area 0 中转 |
| 标准区域 | 接收所有类型的 LSA |
| Stub 区域 | 不允许 Type-5(外部路由)LSA 进入,ABR 注入默认路由 |
| Totally Stub 区域 | 不允许 Type-3/4/5 LSA 进入,ABR 仅注入一条默认路由 |
| NSSA 区域 | 不允许 Type-5 LSA 进入,但允许本区域引入外部路由(Type-7 LSA) |
| Totally NSSA 区域 | 结合 Totally Stub 和 NSSA 的特点 |
3.3 Router ID
Router ID 是 OSPF 中唯一标识一台路由器的 32 位数值,通常以 IP 地址格式表示。选举规则:
- 优先使用手动配置的 Router ID
- 其次选择 Loopback 接口中最大的 IP 地址
- 最后选择物理接口中最大的 IP 地址
3.4 Cost(开销)
OSPF 使用 Cost 作为路由度量值,计算公式:
接口 Cost = 参考带宽 / 接口实际带宽
华为设备默认参考带宽为 100 Mbps:
| 接口类型 | 带宽 | 默认 Cost |
|---|---|---|
| 10GE | 10 Gbps | 1 |
| GE | 1 Gbps | 1 |
| 100M FE | 100 Mbps | 1 |
| 10M 以太网 | 10 Mbps | 10 |
| 串行链路(64K) | 64 Kbps | 1562 |
四、OSPF 报文格式与字段详解
OSPF 使用 IP 报文直接封装协议报文,协议号为 89。共有 5 种报文类型,它们共享一个 24 字节的公共报文头。
4.1 公共报文头(24 字节)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | Type | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详解:
| 字段 | 长度 | 说明 |
|---|---|---|
| Version | 8 比特 | OSPF 版本号。OSPFv2 的值为 2 |
| Type | 8 比特 | 报文类型(1~5,见下表) |
| Packet length | 16 比特 | 报文总长度(含报文头),单位字节 |
| Router ID | 32 比特 | 发送该报文的路由器标识 |
| Area ID | 32 比特 | 发送该报文的路由器所属区域 |
| Checksum | 16 比特 | 校验和(不含认证字段) |
| AuType | 16 比特 | 认证类型:0=不认证,1=简单认证,2=MD5 认证 |
| Authentication | 64 比特 | 认证数据(根据认证类型而定) |
4.2 五种报文类型总览
| Type | 名称 | 英文缩写 | 作用 | 发送方式 | 对应阶段 |
|---|---|---|---|---|---|
| 1 | Hello 报文 | Hello | 发现邻居、建立/维护邻居关系、选举 DR/BDR | 组播 :广播/P2P 网络发往 224.0.0.5(AllSPFRouters);NBMA 网络为单播 | Init → 2-Way |
| 2 | 数据库描述报文 | DD / DBD | 交换 LSDB 摘要信息、协商主从关系 | 单播:在已建立邻接的两台路由器之间逐对发送 | ExStart → Exchange |
| 3 | 链路状态请求报文 | LSR | 请求缺失的 LSA 完整信息 | 单播:发送给特定的邻居路由器(即与之交换 DD 的那台) | Loading |
| 4 | 链路状态更新报文 | LSU | 携带完整 LSA,响应 LSR 或触发更新泛洪 | 响应 LSR 时为单播 ;主动泛洪更新时在广播网络发往 224.0.0.5 (DR 泛洪)或 224.0.0.6(DROther 发给 DR/BDR) | Loading |
| 5 | 链路状态确认报文 | LSAck | 对收到的 LSU 进行确认,保证可靠传输 | 组播 :广播网络发往 224.0.0.5;也可单播给发送 LSU 的路由器 | Loading |
发送方式总结: Hello 和 LSAck 主要使用组播(减少不必要的邻居交互),DD 和 LSR 始终使用单播(邻居间一对一交互),LSU 根据场景不同------响应请求时单播,主动泛洪更新时组播。
组播地址说明:
- 224.0.0.5(AllSPFRouters):所有 OSPF 路由器都监听
- 224.0.0.6(AllDRouters):仅 DR 和 BDR 监听。DROther 发送 LSU 时用此地址发给 DR/BDR,再由 DR 用 224.0.0.5 泛洪给所有路由器
4.3 Hello 报文详解
Hello 报文是 OSPF 中最常用的报文,周期性发送,用于发现和维护邻居关系。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HelloInterval | Options | Rtr Pri |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RouterDeadInterval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Backup Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详解:
| 字段 | 长度 | 说明 |
|---|---|---|
| Network Mask | 32 比特 | 发送接口的子网掩码。邻居双方必须一致(P2P 网络除外) |
| HelloInterval | 16 比特 | Hello 报文发送间隔(秒)。广播网络默认 10 秒,NBMA 默认 30 秒 |
| Options | 8 比特 | 可选项标志位(E=外部路由、MC=组播、N/P=NSSA、DC=按需链路) |
| Rtr Pri | 8 比特 | DR 优先级,默认 1。设为 0 表示不参与 DR/BDR 选举 |
| RouterDeadInterval | 32 比特 | 失效时间,超过此时间未收到邻居 Hello 则认为邻居失效。通常为 HelloInterval 的 4 倍 |
| Designated Router | 32 比特 | 当前 DR 的接口 IP 地址 |
| Backup Designated Router | 32 比特 | 当前 BDR 的接口 IP 地址 |
| Neighbor | 32 比特 | 已知邻居的 Router ID 列表(可多个) |
Hello 报文参数匹配要求: 以下参数必须在邻居之间一致,否则无法建立邻居关系:
- Area ID
- 认证类型和密码
- Hello Interval / Dead Interval
- Network Mask(广播和 NBMA 网络)
- Options 中的 E 位(Stub 标志必须一致)
4.4 DD(Database Description)报文详解
DD 报文用于描述本地 LSDB 的摘要信息(LSA 头部列表),在邻居建立初期交换。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Interface MTU | Options |0|0| |I|M|MS|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DD sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详解:
| 字段 | 长度 | 说明 |
|---|---|---|
| Interface MTU | 16 比特 | 接口的 MTU 值。ExStart 阶段协商时检查 |
| Options | 8 比特 | 可选项,与 Hello 报文相同 |
| I (Init) | 1 比特 | 置 1 表示这是第一个 DD 报文(ExStart 阶段) |
| M (More) | 1 比特 | 置 1 表示后面还有更多 DD 报文 |
| MS (Master/Slave) | 1 比特 | 置 1 表示自己是 Master,置 0 表示是 Slave |
| DD sequence number | 32 比特 | DD 报文序列号,Master 定义初始值并递增 |
主从协商: Router ID 较大的路由器成为 Master,负责定义 DD 序列号并先发送 DD 报文。
4.5 LSR(Link State Request)报文
LSR 用于向邻居请求特定的 LSA 完整信息。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段详解:
| 字段 | 长度 | 说明 |
|---|---|---|
| LS type | 32 比特 | 请求的 LSA 类型(如 1=Router-LSA,2=Network-LSA) |
| Link State ID | 32 比特 | LSA 的标识符 |
| Advertising Router | 32 比特 | 产生该 LSA 的路由器 Router ID |
这三个字段可以唯一标识一个 LSA。
4.6 LSU(Link State Update)报文
LSU 报文携带一个或多个完整的 LSA,用于响应 LSR 请求或主动泛洪更新的 LSA。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of LSAs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- One or more complete LSAs -+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 字段 | 长度 | 说明 |
|---|---|---|
| Number of LSAs | 32 比特 | 本 LSU 报文包含的 LSA 数量 |
| LSAs | 可变 | 完整的 LSA 数据(含 LSA 头部和 LSA 内容) |
4.7 LSAck(Link State Acknowledgment)报文
LSAck 报文用于对收到的 LSU 中的 LSA 进行确认,每个 LSAck 可确认多个 LSA。其内容是被确认 LSA 的头部列表(每个 LSA 头部 20 字节)。
4.8 LSA格式
4.8.1 LSA头部格式(20 字节)
所有类型的 LSA 都共享一个 20 字节的公共头部:
| 字段 | 长度 | 说明 |
|---|---|---|
| LS age | 16 比特 | LSA 产生后经过的时间(秒),最大值 3600(1 小时) |
| Options | 8 比特 | 可选项标志 |
| LS type | 8 比特 | LSA 类型(1~11) |
| Link State ID | 32 比特 | LSA 的标识符 |
| Advertising Router | 32 比特 | 产生此 LSA 的路由器 Router ID |
| LS sequence number | 32 比特 | 序列号,用于判断 LSA 新旧(越大越新) |
| LS checksum | 16 比特 | 校验和(不含 LS age 字段) |
| Length | 16 比特 | LSA 的总长度(含头部) |
4.8.2 LSA 内容结构(LSA Body)
一条完整的 LSA 由两部分组成:LSA 头部,LSA Body。
不同类型的 LSA,其 Body 结构完全不同,但仍有规律可循:
| LSA 类型 | Body 中的核心内容 |
|---|---|
| Type-1 Router-LSA | Router 标志位、链路数量、每条链路的 Link ID / Link Data / 类型 / Metric |
| Type-2 Network-LSA | 网络掩码、该网段连接的所有路由器 Router ID |
| Type-3 Summary-LSA | 汇总的网络前缀、子网掩码、到达该网络的 Metric |
| Type-4 ASBR-Summary-LSA | ASBR 的 Router ID、到达该 ASBR 的 Metric |
| Type-5 External-LSA | 外部网络前缀、子网掩码、Metric 类型(E1/E2)、转发地址、外部路由 Tag |
下面以最典型的 Type-1 Router-LSA 为例,说明内容体结构。它的 Body 大致包含:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 |V|E|B| 0 | Links |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link ID (#1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Data (#1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | # TOS | Metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link ID (#N) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link Data (#N) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | # TOS | Metric |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中:
- Flags:V/E/B 分别表示虚链路端点、ASBR、ABR。
- Links:本条 Router-LSA 包含的链路数量。
- 紧跟着的 Link ID / Link Data / Type / # TOS / Metric 组成一个链路描述块(共 12 字节)。
# Links的值是多少,后面就会重复出现多少个链路描述块,因此会有多个 Link ID 和 Link Data,每个都对应一条链路。
可见,Router-LSA 的内容体就是一张"链路清单":路由器把每个启用了 OSPF 的接口抽象成一条链路记录,再附上类型和 Cost,这样其他路由器拿到后就能拼出完整拓扑。
R1 的 Router-LSA (Body 示例)
├── Link 1: Link ID=10.0.1.0, Link Data=255.255.255.0, Type=3(Stub), Metric=1
├── Link 2: Link ID=2.2.2.2, Link Data=10.0.1.1, Type=1(P2P), Metric=1
└── Link 3: Link ID=172.16.0.0, Link Data=255.255.0.0, Type=3(Stub), Metric=1
因此,理解 LSA 内容的关键是:先用 20 字节头部确认"这是谁发出的、什么类型、是否最新",再由 Body 中的类型特定字段读取真正的链路或路由信息。
五、OSPF 工作流程
5.1 总体流程概述
OSPF 路由计算分为三个阶段:
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 第一阶段 │ │ 第二阶段 │ │ 第三阶段 │
│ 建立邻居关系 │ ──→ │ 同步 LSDB │ ──→ │ 路由计算(SPF) │
│ Hello 报文 │ │ DD/LSR/LSU/LSAck │ │ Dijkstra 算法 │
└──────────────────┘ └──────────────────┘ └──────────────────┘
5.2 邻居状态机(8 种状态)
这是 OSPF 最核心的流程。两台路由器从陌生到完全邻接,需要经历以下状态转换:
Down ──(收到Hello)──→ Init ──(Hello中看到自己的RID)──→ 2-Way
│
(需要建立邻接) │
↓
Full ←──(LSDB同步完成)── Loading ←──(DD交换完成)── Exchange ←── ExStart
各状态详解:
| 状态 | 类型 | 说明 |
|---|---|---|
| Down | 稳定 | 初始状态。没有在 Dead Interval 内收到邻居的 Hello 报文 |
| Attempt | 不稳定 | 仅用于 NBMA 网络,定期向手工配置的邻居发送 Hello 报文 |
| Init | 不稳定 | 收到了邻居的 Hello 报文,但对方的 Neighbor 列表中还没有自己的 Router ID |
| 2-Way | 稳定 | 双方在彼此的 Hello 报文中看到了自己的 Router ID,双向通信建立。广播/NBMA 网络在此状态选举 DR/BDR |
| ExStart | 不稳定 | 协商主从关系。Router ID 大的成为 Master,确定 DD 报文初始序列号 |
| Exchange | 不稳定 | 互相交换 DD 报文,描述各自 LSDB 中的 LSA 摘要列表 |
| Loading | 不稳定 | 根据 DD 交换结果,用 LSR 请求缺失的 LSA,对端用 LSU 回应 |
| Full | 稳定 | LSDB 完全同步,邻接关系建立完成 |
记忆口诀: Down 底 → Init 初识 → 2-Way 握手 → ExStart 争主 → Exchange 换目录 → Loading 装数据 → Full 全同步
5.3 DR 和 BDR 选举
在广播网络(如以太网)和 NBMA 网络中,为了避免 N 台路由器之间两两建立邻接关系(需要 N(N-1)/2 条邻接),OSPF 引入了 DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 机制。
选举规则:
- 比较 DR 优先级(Router Priority),数值越大越优,默认值为 1
- 优先级相同时,比较 Router ID,越大越优
- 优先级为 0 的路由器不参与选举
- DR/BDR 一旦选出,除非 DR 故障,否则不会重新选举(非抢占)
选举后的邻接关系:
网络中有 R1(DR)、R2(BDR)、R3(DROther)、R4(DROther)
R1(DR) ←──Full──→ R2(BDR)
R1(DR) ←──Full──→ R3(DROther)
R1(DR) ←──Full──→ R4(DROther)
R2(BDR) ←──Full──→ R3(DROther)
R2(BDR) ←──Full──→ R4(DROther)
R3 ←──2-Way──→ R4 (DROther 之间不建立 Full 邻接)
组播地址:
| 组播地址 | 用途 |
|---|---|
| 224.0.0.5 | AllSPFRouters,所有 OSPF 路由器监听 |
| 224.0.0.6 | AllDRouters,仅 DR 和 BDR 监听 |
DROther 发送 LSU 时使用 224.0.0.6(发给 DR/BDR),DR 泛洪时使用 224.0.0.5(发给所有路由器)。
5.4 LSDB 同步详细过程
两台路由器建立邻接的完整报文交互过程:
R1 R2
│ │
│──── Hello (Neighbors: 空) ────→ │ [Down → Init]
│ ←── Hello (Neighbors: R1) ──── │ [Init → 2-Way]
│──── Hello (Neighbors: R2) ────→ │
│ │
│ ═══════ DR/BDR 选举(广播网络)═══════ │
│ │
│──── DD (I=1, M=1, MS=1) ────→ │ [ExStart: R1 发送空 DD,MS=1 表示"我想当 Master"]
│ ←── DD (I=1, M=1, MS=1) ──── │ [ExStart: R2 也发送空 DD,MS=1 表示"我也想当 Master"]
│ ←── DD (I=0, M=1, MS=0, Seq=X) ─│ [R2 比较 Router ID:
│ │ R1 的 RID > R2 的 RID → R1 胜出当 Master
│ │ R2 认输当 Slave(MS=0)]
│──── DD (I=0, M=1, MS=1, Seq=X+1) ──→ │ [Exchange: 开始交换 LSA 摘要]
│ ←── DD (I=0, M=1, MS=0, Seq=X+1)│
│──── DD (I=0, M=0, MS=1, Seq=X+2) ──→ │ [M=0 表示摘要发送完毕]
│ ←── DD (I=0, M=0, MS=0, Seq=X+2)│
│ │
│──── LSR (请求缺失的 LSA) ────→ │ [Loading]
│ ←── LSU (携带完整 LSA) ──── │
│──── LSAck ────→ │
│ │
│ ←── LSR (请求缺失的 LSA) ──── │
│──── LSU (携带完整 LSA) ────→ │
│ ←── LSAck ──── │
│ │
│ ═══════ LSDB 同步完成 ═══════ │ [Full]
主从协商规则详解:
ExStart 阶段的核心目的是确定谁来控制 DD 报文的交换节奏。协商依据如下:
- 双方都发送空的 DD 报文(I=1, M=1, MS=1),宣告"我想当 Master"
- 比较 Router ID :Router ID 数值更大的一方胜出,成为 Master;另一方成为 Slave
- Master 的职责 :
- 定义 DD 报文的初始序列号
- 每次发送 DD 报文时,序列号 +1
- 先发送 DD 报文,Slave 再回应
- Slave 的职责 :
- 使用 Master 定义的序列号进行确认
- 回应 Master 的 DD 报文
为什么要选 Master? 为了保证 DD 报文交换有序、可靠。Master 控制序列号和发送节奏,避免双方同时发送导致混乱。这就像两个人对话,总得有一个人先说。
示例: 假设 R1 的 Router ID 是 3.3.3.3,R2 的 Router ID 是 2.2.2.2,则 R1 成为 Master(3.3.3.3 > 2.2.2.2)。
5.5 SPF 路由计算
当 LSDB 同步完成后,每台路由器以自己为根节点,运行 Dijkstra 算法计算最短路径树:
计算步骤:
- 将自己放入"已计算"集合
- 检查所有直连链路,将邻居和开销放入"候选"集合
- 从候选集合中选出开销最小的节点,移入"已计算"集合
- 将新加入节点的所有链路展开,更新候选集合
- 重复步骤 3-4,直到所有节点都被计算
- 根据最短路径树生成路由表
六、LSA 类型详解
LSA 是 OSPF 的"灵魂"。如果 OSPF 是一个分布式数据库系统,那么 LSA 就是数据库中的一条条记录。
6.1 核心 LSA 类型速览
| 类型 | 名称 | 产生者 | 传播范围 | 核心功能 |
|---|---|---|---|---|
| Type-1 | Router-LSA | 每台路由器 | 本区域内 | 描述路由器直连链路状态和开销 |
| Type-2 | Network-LSA | DR | 本区域内 | 描述广播/NBMA 网络的掩码和所有连接的路由器 |
| Type-3 | Network-Summary-LSA | ABR | 区域间 | 通告其他区域的网络前缀 |
| Type-4 | ASBR-Summary-LSA | ABR | 区域间(排除 ASBR 所在区域) | 通告 ASBR 的位置 |
| Type-5 | AS-External-LSA | ASBR | 整个 AS(Stub/NSSA 除外) | 通告外部路由 |
| Type-7 | NSSA-External-LSA | NSSA 区域的 ASBR | 仅 NSSA 区域内 | 在 NSSA 中通告外部路由,由 ABR 转为 Type-5 |
6.2 各类型 LSA 详解
Type-1 Router-LSA(路由器 LSA)
这是 OSPF 拓扑的基石。每台路由器都会生成一个 Router-LSA,列出所有启用了 OSPF 的接口、链路类型、连接的对端路由器以及每条链路的 Cost。
Router-LSA 中的链路类型:
| 类型值 | 描述 | Link ID | Link Data |
|---|---|---|---|
| 1 | 点到点连接 | 对端路由器 Router ID | 接口 IP 地址 |
| 2 | 连接到传输网络 | DR 的接口 IP 地址 | 接口 IP 地址 |
| 3 | 连接到 Stub 网络 | 网段/子网号 | 子网掩码 |
| 4 | 虚连接 | 对端路由器 Router ID | 接口 IP 地址 |
Type-2 Network-LSA(网络 LSA)
由广播/NBMA 网络中的 DR 产生,描述该网段上连接了哪些路由器,包含子网掩码和所有相连路由器的 Router ID 列表。
Type-3 Network-Summary-LSA(网络汇总 LSA)
由 ABR 产生,用于将一个区域内的网络信息通告给其他区域。跨区域传播时,Metric 会逐区域累加。
Type-4 ASBR-Summary-LSA(ASBR 汇总 LSA)
由 ABR 产生,用于告诉其他区域的路由器"ASBR 在哪里"。以主机掩码(/32)的形式存在。没有 Type-4,其他区域的路由器就找不到外部路由的出口。
Type-5 AS-External-LSA(AS 外部 LSA)
由 ASBR 产生,通告从 OSPF 域外引入的路由。外部路由的 Metric 类型分为:
- E1(Type 1):总开销 = 外部开销 + 内部开销(到达 ASBR 的开销)
- E2(Type 2):总开销 = 仅外部开销(默认类型)
Type-7 NSSA-External-LSA
NSSA 区域不允许 Type-5 LSA 进入,但允许本区域的 ASBR 引入外部路由。这些外部路由以 Type-7 LSA 形式在 NSSA 内传播,由 ABR 转换为 Type-5 后泛洪到其他区域。
6.3 LSA 的生存周期
| 参数 | 值 | 说明 |
|---|---|---|
| MaxAge | 3600 秒(1 小时) | LSA 最大生存时间 |
| LSRefreshTime | 1800 秒(30 分钟) | 始发路由器定期刷新 LSA 的时间 |
| MinLSInterval | 5 秒 | 同一 LSA 两次产生的最小间隔 |
| MinLSArrival | 1 秒 | 同一 LSA 两次接收的最小间隔 |
每条 LSA 的 LS age 从 0 开始不断增长,达到 MaxAge 后会被清除。始发路由器每 30 分钟重新发送一次 LSA(LS age 重新归零),以保持 LSA 的有效性。
七、OSPF 网络类型
| 网络类型 | 典型链路 | Hello 间隔 | DR/BDR | 报文发送方式 |
|---|---|---|---|---|
| 广播(Broadcast) | 以太网 | 10 秒 | 需要选举 | 组播 |
| NBMA | 帧中继、X.25 | 30 秒 | 需要选举 | 单播 |
| P2P(点到点) | PPP、HDLC | 10 秒 | 不需要 | 组播 |
| P2MP(点到多点) | 部分网格帧中继 | 30 秒 | 不需要 | 组播 |
九、常见故障排查
9.1 邻居建立失败
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 状态卡在 Down | 链路不通 / 未宣告正确网段 | 检查接口状态、OSPF network 命令 |
| 状态卡在 Init | 参数不匹配 | 检查 Hello/Dead 间隔、Area ID、认证 |
| 状态卡在 2-Way | DR/BDR 选举问题 | 检查 Priority、网络类型是否一致 |
| 状态卡在 ExStart | MTU 不匹配 | 检查接口 MTU,华为默认不检测 MTU |
| 状态卡在 Exchange | DD 序列号问题 | 检查 Router ID 是否冲突 |
| 状态卡在 Loading | LSA 请求未响应 | 检查 LSDB 差异、链路质量 |
9.2 邻居建立必要条件清单
建立 OSPF 邻居需要满足以下所有条件:
- Router ID 不能相同
- Area ID 必须一致
- 认证类型和密码必须一致
- Hello Interval 和 Dead Interval 必须一致
- Network Mask 必须一致(广播和 NBMA 网络)
- Options 中的 E 位(Stub 标志)必须一致
- 接口未被配置为 Silent-Interface
- 网络类型兼容
十、OSPF 完整工作过程举例
以下用一个具体例子串联整个 OSPF 工作流程:
拓扑: 三台路由器 R1、R2、R3 通过交换机连接在同一个以太网段(10.0.1.0/24),都属于 Area 0。
R1 (10.0.1.1, RID=1.1.1.1)
│
│ 10.0.1.0/24 (以太网)
│
R2 (10.0.1.2, RID=2.2.2.2) ──── 10.0.2.0/24 ──── R3 (10.0.2.1, RID=3.3.3.3)
第一阶段:发现邻居
- R1、R2、R3 启动 OSPF 后,各自向 224.0.0.5 发送 Hello 报文
- R1 收到 R2 的 Hello → 进入 Init → R1 在下次 Hello 中携带 R2 的 RID → R2 收到后看到自己的 RID → 双方进入 2-Way
- 同理 R1-R2、R2-R3、R1-R3 都进入 2-Way
第二阶段:DR/BDR 选举
- 在 2-Way 状态下,三台路由器选举 DR/BDR
- 假设优先级都是默认 1,则 Router ID 最大的 R2(2.2.2.2)成为 DR,R1(1.1.1.1)成为 BDR,R3 为 DROther
第三阶段:建立邻接
- R1(BDR) 与 R2(DR) 建立 Full 邻接
- R3(DROther) 与 R2(DR) 建立 Full 邻接
- R3(DROther) 与 R1(BDR) 建立 Full 邻接
- 如果有两个DROther, DROther之间不建立 Full邻接
第四阶段:LSDB 同步
- R2 产生 Router-LSA 描述自己的链路(10.0.1.0/24 和 10.0.2.0/24)
- R1 产生 Router-LSA 描述自己的链路
- R3 产生 Router-LSA 描述自己的链路
- DR(R2)产生 Network-LSA 描述以太网段
- 通过 DD → LSR → LSU → LSAck 交换,三台路由器的 LSDB 达到一致
第五阶段:SPF 计算
- R1 运行 SPF 算法,计算出:
- 到达 10.0.1.0/24:直连,Cost = 1
- 到达 10.0.2.0/24:经过 R2,Cost = 2
第六阶段:网络变化
- 如果 R2-R3 之间的链路故障:
- R2 检测到链路 Down,产生新的 Router-LSA
- R2 向 224.0.0.6 发送 LSU(因为 R2 是 DR)
- 其他路由器收到 LSU 后更新 LSDB,重新运行 SPF
- R1 发现 10.0.2.0/24 不可达(如果没有其他路径)
十一、知识图谱总结
OSPF 协议
├── 基础概念
│ ├── 链路状态路由协议(vs 距离矢量 RIP)
│ ├── IGP(自治系统内部网关协议)
│ ├── Router ID 选举
│ ├── Cost 计算(参考带宽 / 接口带宽)
│ └── 协议号 89,封装在 IP 报文中
│
├── 核心角色
│ ├── IR(内部路由器)
│ ├── ABR(区域边界路由器)
│ ├── ASBR(自治系统边界路由器)
│ └── BR(骨干路由器)
│
├── 五种报文
│ ├── Hello → 发现/维护邻居,选举 DR/BDR
│ ├── DD → 交换 LSDB 摘要,协商主从
│ ├── LSR → 请求缺失的 LSA
│ ├── LSU → 携带完整 LSA
│ └── LSAck → 确认 LSU
│
├── 八种邻居状态
│ ├── Down → Attempt → Init → 2-Way(邻居关系)
│ └── ExStart → Exchange → Loading → Full(邻接关系)
│
├── DR/BDR 机制
│ ├── 广播/NBMA 网络需要选举
│ ├── 优先级 + Router ID 决定
│ ├── 非抢占机制
│ └── DROther 只与 DR/BDR 建立 Full
│
├── LSA 类型
│ ├── Type-1 Router-LSA(每台路由器产生)
│ ├── Type-2 Network-LSA(DR 产生)
│ ├── Type-3 Summary-LSA(ABR 产生,区域间路由)
│ ├── Type-4 ASBR-Summary-LSA(ABR 产生,定位 ASBR)
│ ├── Type-5 External-LSA(ASBR 产生,外部路由)
│ └── Type-7 NSSA-LSA(NSSA 区域内的外部路由)
│
├── 区域类型
│ ├── 骨干区域(Area 0)
│ ├── 标准区域
│ ├── Stub / Totally Stub
│ └── NSSA / Totally NSSA
│
├── 路由计算
│ ├── SPF(Dijkstra)算法
│ ├── 以自己为根计算最短路径树
│ └── 生成无环路由表
│
└── 应用场景
├── 企业园区网
├── 数据中心
├── 运营商网络
└── MPLS TE / OSPF-TE 扩展
内容由 AI 生成