OSPF协议学习

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 地址格式表示。选举规则:

  1. 优先使用手动配置的 Router ID
  2. 其次选择 Loopback 接口中最大的 IP 地址
  3. 最后选择物理接口中最大的 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 报文。

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。

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 内容)

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,备份指定路由器) 机制。

选举规则:

  1. 比较 DR 优先级(Router Priority),数值越大越优,默认值为 1
  2. 优先级相同时,比较 Router ID,越大越优
  3. 优先级为 0 的路由器不参与选举
  4. 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 报文的交换节奏。协商依据如下:

  1. 双方都发送空的 DD 报文(I=1, M=1, MS=1),宣告"我想当 Master"
  2. 比较 Router ID :Router ID 数值更大的一方胜出,成为 Master;另一方成为 Slave
  3. Master 的职责 :
    • 定义 DD 报文的初始序列号
    • 每次发送 DD 报文时,序列号 +1
    • 先发送 DD 报文,Slave 再回应
  4. 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 算法计算最短路径树:

计算步骤:

  1. 将自己放入"已计算"集合
  2. 检查所有直连链路,将邻居和开销放入"候选"集合
  3. 从候选集合中选出开销最小的节点,移入"已计算"集合
  4. 将新加入节点的所有链路展开,更新候选集合
  5. 重复步骤 3-4,直到所有节点都被计算
  6. 根据最短路径树生成路由表

六、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 邻居需要满足以下所有条件:

  1. Router ID 不能相同
  2. Area ID 必须一致
  3. 认证类型和密码必须一致
  4. Hello Interval 和 Dead Interval 必须一致
  5. Network Mask 必须一致(广播和 NBMA 网络)
  6. Options 中的 E 位(Stub 标志)必须一致
  7. 接口未被配置为 Silent-Interface
  8. 网络类型兼容

十、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)

第一阶段:发现邻居

  1. R1、R2、R3 启动 OSPF 后,各自向 224.0.0.5 发送 Hello 报文
  2. R1 收到 R2 的 Hello → 进入 Init → R1 在下次 Hello 中携带 R2 的 RID → R2 收到后看到自己的 RID → 双方进入 2-Way
  3. 同理 R1-R2、R2-R3、R1-R3 都进入 2-Way

第二阶段:DR/BDR 选举

  1. 在 2-Way 状态下,三台路由器选举 DR/BDR
  2. 假设优先级都是默认 1,则 Router ID 最大的 R2(2.2.2.2)成为 DR,R1(1.1.1.1)成为 BDR,R3 为 DROther

第三阶段:建立邻接

  1. R1(BDR) 与 R2(DR) 建立 Full 邻接
  2. R3(DROther) 与 R2(DR) 建立 Full 邻接
  3. R3(DROther) 与 R1(BDR) 建立 Full 邻接
  4. 如果有两个DROther, DROther之间不建立 Full邻接

第四阶段:LSDB 同步

  1. R2 产生 Router-LSA 描述自己的链路(10.0.1.0/24 和 10.0.2.0/24)
  2. R1 产生 Router-LSA 描述自己的链路
  3. R3 产生 Router-LSA 描述自己的链路
  4. DR(R2)产生 Network-LSA 描述以太网段
  5. 通过 DD → LSR → LSU → LSAck 交换,三台路由器的 LSDB 达到一致

第五阶段:SPF 计算

  1. R1 运行 SPF 算法,计算出:
    • 到达 10.0.1.0/24:直连,Cost = 1
    • 到达 10.0.2.0/24:经过 R2,Cost = 2

第六阶段:网络变化

  1. 如果 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 生成

相关推荐
梦帮科技2 小时前
基于幺正李代数连续归一化流的混合量子生成模型 (HQNN-Flow) 完整技术指南(上部分)
网络·人工智能·算法·量子计算
云老大-阿里云国际站代理商2 小时前
阿里云国际站渠道代理商:ECS 怎么对接 OSS?权限、域名、网络路径怎么配置?
网络·阿里云·php
Multipath7122 小时前
上车即入院,链路先到院——乾元通多链路聚合,为智慧救护车守住移动中的生命线
网络·人工智能·网络协议·udp·无人机
2401_868534782 小时前
论智慧医院网络建设
服务器·网络
pt10433 小时前
Cisco设备网络安全系列-17:AI驱动安全应用与量子计算安全影响
网络·人工智能·安全
mennekes3 小时前
暗装插座箱 VS 明装插座箱,工地和车间怎么取舍
运维·网络·科技·安全·制造
HackTwoHub3 小时前
红队低成本 IP 轮换方案 ProxyCat升级版,自动扩容代理池、负载分摊转发,一键部署,告别高价隧道代理
网络·人工智能·网络协议·tcp/ip·安全·web安全·网络安全
andxe4 小时前
算力网络融合下的 5G 承载升级:高速光模块,构筑稳定光承载底座
网络·5g·光模块·光通信
lazy H4 小时前
【计算机网络】第 12 篇:IPv6 详解——地址格式、地址类型与双栈网络
网络·经验分享·后端·学习·计算机网络·408