OSPF 进阶
OSPF(Open Shortest Path First)是典型的链路状态型路由协议。本文聚焦 OSPF 的高级核心内容——LSA 类型体系、报文交互机制、网络优化及不规则区域解决方案。
一、OSPF LSA 详解
1.1 LSA 与 LSDB
链路状态(Link State) 是每台路由器对自己激活了 OSPF 协议的接口信息的描述。路由器将网络中所有洪泛的链路状态信息收集起来,存入 LSDB(链路状态数据库) 中。所有路由器的 LSDB 在同一个区域内是相同的。每台路由器独立运行 SPF 算法,以自己为根节点,得到一棵无环的最短路径树。
在 OSPFv2 中,LSA 共有 11 种类型,本文重点学习最核心的 6 种。
1.2 LSA 头部格式
LSA 头部共 20 字节,每个字段含义如下:
| 字段 | 说明 |
|---|---|
| 链路状态老化时间 (LS Age) | LSA 的生存时间,初始为 0,最大 3600 秒 |
| 链路状态类型 (LS Type) | LSA 的类型编号 |
| 链路状态 ID (Link State ID) | 根据类型不同含义不同 |
| 通告路由器 (Advertising Router) | 产生该 LSA 的路由器的 Router-ID |
| 链路状态序列号 (LS Sequence Number) | 初始 0x80000001,每次更新 +1,终点 0x7FFFFFFF |
| 链路状态校验和 (Checksum) | 用于校验 LSA 完整性 |
| 长度 (Length) | LSA 的总字节长度 |
“链路状态类型”、“链路状态 ID”、“通告路由器” 三个字段唯一标识了一个 LSA(LSA 三元组)。
1.3 判断 LSA 新旧关系
- 序列号越大,LSA 越新
- 序列号相同,校验和更大的更新
- 校验和也相同,则比较老化时间:
- 若某 LSA 老化时间为 3600 秒,则无条件加载
- 若差值大于 15 分钟,老化时间小的更新
- 若差值小于 15 分钟,则两条相同
周期链路刷新机制:每 30 分钟向外通告本地产生的 LSA 信息。当老化时间到达 1800 秒时,始发路由器重新创建并向外洪泛。
1.4 Type-1 LSA:Router LSA
- 产生者:每台运行 OSPF 的路由器
- 传播范围:区域内
- 携带信息:路由器直连接口状况和接口 Cost
- LS ID:通告者的 Router-ID
每台路由器都会产生 Type-1 LSA,描述自己的”家门口的状况”。如果路由器有多个接口属于不同区域,将为每个区域单独产生一个 Type-1 LSA。
关键标志位:
| 比特位 | 含义 |
|---|---|
| V 位 (Virtual Link Endpoint) | 该路由器为虚链路端点 |
| E 位 (External) | 该路由器为 ASBR |
| B 位 (Border) | 该路由器为 ABR(区域边界路由器) |
Router LSA 中通过 Link(链路) 来描述直连接口,每个 Link 包含:
| 参数 | 说明 |
|---|---|
| 链路类型 (Link Type) | P2P、TransNet、StubNet、Virtual Link |
| 链路 ID (Link ID) | 根据链路类型不同含义不同 |
| 链路数据 (Link Data) | 根据链路类型不同含义不同 |
| 度量值 (Metric) | Cost 值 |
1.5 Type-2 LSA:Network LSA
- 产生者:MA 网络中的 DR
- 传播范围:区域内
- 携带信息:MA 网络的掩码及接入该网络的所有路由器的 Router-ID
- LS ID:DR 接口的 IP 地址
在 MA 网络中,DR 负责产生 Type-2 LSA,列出连接到该 MA 网络的所有路由器,补充 Type-1 LSA 无法描述的 MA 网络掩码信息。Type-1 LSA + Type-2 LSA 共同完整描述了区域内部拓扑。
1.6 Type-3 LSA:Network Summary LSA
- 产生者:ABR(区域边界路由器)
- 传播范围:ABR 相邻的单区域
- 携带信息:域间路由信息(目标网段和开销)
- LS ID:路由信息的目标网络号
3 类 LSA 传递的是域间路由信息。关键点:
- 传递方式类似距离矢量型协议,通告者就是到达目标网段的下一跳
- 跨区域传递时需要通告者转换(由下一个 ABR 重新产生)
- 需要通过 1 类和 2 类 LSA 计算拓扑来寻找通告者位置
1.7 Type-5 LSA:AS External LSA
- 产生者:ASBR
- 传播范围:整个 OSPF 域(除特殊区域外)
- 携带信息:域外路由信息
- LS ID:外部路由的目标网络号
5 类 LSA 传递域外路由信息。通过重发布(import-route)将其他协议路由导入 OSPF 网络。
种⼦度量值(seed-metric):路由导入后,舍弃原网络开销,赋予一个规定值。OSPF 默认种⼦度量值为 1,可在重发布时修改。
度量值类型:
| 类型 | E 位 | 计算方式 |
|---|---|---|
| Metric-Type-1 | E=0 | 本地到达 ASBR 开销 + 种子度量值 |
| Metric-Type-2 | E=1(默认) | 所有设备都等于种子度量值 |
转发地址(Forwarding Address, FA):当 FA 不为 0.0.0.0 时,流量发往 FA 而非通告 ASBR,用于规避次优路径问题。
1.8 Type-4 LSA:ASBR Summary LSA
- 产生者:与 ASBR 同区域的 ABR
- 传播范围:除去 ASBR 所在区域的单区域
- 携带信息:ASBR 的位置信息
- LS ID:ASBR 的 Router-ID
4 类 LSA 格式与 3 类 LSA 一致,但通告的是 ASBR 的 RID 而非目标网段,掩码为全 0。用于其他区域寻找 ASBR 的位置。
1.9 Type-7 LSA:NSSA External LSA
- 产生者:NSSA 区域的 ASBR
- 传播范围:NSSA 区域内
- 携带信息:域外路由信息(与 5 类格式一致)
- LS ID:域外路由的目标网络号
7 类 LSA 是 5 类 LSA 在 NSSA 区域中的”马甲”,离开 NSSA 区域后由 ABR 转换成 5 类 LSA。路由标记为 O_NSSA,优先级 150。
7 类 LSA 的 FA 地址默认使用通告者(ASBR)的环回接口地址。
1.10 LSA 总结表
| LSA 类型 | 名称 | LS ID | 通告者 | 传播范围 | 携带信息 |
|---|---|---|---|---|---|
| Type-1 | Router | 通告者 RID | 区域内每台路由器 | 单区域 | 直连拓扑 |
| Type-2 | Network | DR 接口 IP | DR | 单区域 | MA 网络拓扑补充 |
| Type-3 | Sum-Net | 目标网络号 | ABR(跨区转换) | ABR 相邻单区域 | 域间路由 |
| Type-4 | Sum-Asbr | ASBR 的 RID | ABR(跨区转换) | 除 ASBR 所在区域 | ASBR 位置 |
| Type-5 | External | 域外目标网络号 | ASBR | 整个 OSPF 域 | 域外路由 |
| Type-7 | NSSA | 域外目标网络号 | ASBR(NSSA 内) | NSSA 区域 | 域外路由(NSSA) |
二、OSPF 报文格式
2.1 OSPF 协议概述
OSPF 是跨层封装的协议,没有四层封装,报文内容直接包含在 IP 协议的数据内容中。OSPF 的协议号是 89。
OSPF 报文共分为五种:Hello、DBD、LSR、LSU、LSAck。
2.2 OSPF 报文头部
五种 OSPF 报文共有的参数信息,24 字节:
| 字段 | 说明 |
|---|---|
| Version | OSPFv2 恒为 2 |
| Type | 1-Hello, 2-DD, 3-LSR, 4-LSU, 5-LSAck |
| Packet Length | 整个报文长度(字节数) |
| Router ID | 路由器的 OSPF Router-ID |
| Area ID | 所属区域 ID(32 bit) |
| Checksum | 校验和 |
| Authentication Type | 认证类型 |
| Authentication Data | 认证数据 |
2.3 Hello 报文
Hello 报文完成周期性的发现、建立以及保活邻居关系,包括 DR 和 BDR 的选举。
限制邻居关系建立的参数:
- 子网掩码(MA 网络中需一致,华为特有检查)
- Hello 间隔(缺省 P2P/Broadcast 为 10s,NBMA/P2MP 为 30s)
- Dead 间隔(缺省为 Hello 间隔的 4 倍)
- Options 字段(特殊区域标记)
- 认证
DR/BDR 选举:通过 Router Priority 字段决定,缺省为 1。优先级为 0 则不参与选举。
2.4 DBD 报文(DD)
数据库描述报文,三个作用:
- 使用未携带数据的 DBD 包进行主从关系选举
- 使用携带数据的 DBD 包进行目录信息共享(LSA 头部)
- 进行隐式确认
关键字段:
| 字段 | 说明 |
|---|---|
| I 位 (Initial) | 主从选举时为 1,选举完成后置 0 |
| M 位 (More) | 后续还有 DD 报文 |
| MS 位 (Master) | Master 置 1,Slave 置 0 |
| DD Sequence Number | 由 Master 决定序列号 |
2.5 LSR 报文
链路状态请求报文,基于 DBD 包请求本地未知的 LSA 信息。通过 LSA 三元组(链路状态类型、链路状态 ID、通告路由器)唯一标识请求的 LSA。
2.6 LSU 报文
链路状态更新报文,真正携带 LSA 信息的数据包。一个 LSU 报文可包含多个 LSA。
MA 网络中组播地址:
- 224.0.0.6:非 DR/BDR 向 DR、BDR 发送 LSU
- 224.0.0.5:DR 向所有 OSPF 路由器泛洪 LSU
2.7 LSAck 报文
链路状态确认报文,完成显性确认工作。包含所确认的 LSA 的头部。
2.8 OSPF 接口网络类型
| 网络类型 | OSPF 工作方式 | Hello | Dead | DR/BDR |
|---|---|---|---|---|
| Broadcast(以太网) | Broadcast | 10s | 40s | 需要选举 |
| P2P(PPP、HDLC) | P2P | 10s | 40s | 不需要 |
| 环回接口 | P2P(华为) | - | - | 不需要 |
| P2MP | P2MP | 30s | 120s | 不需要 |
| NBMA(帧中继) | NBMA | 30s | 120s | 需要选举 |
互通接口的网络类型必须一致,否则可能导致路由计算错误。
三、OSPF 优化
3.1 路由汇总
OSPF 的汇总称为区域汇总,分为两类:
域间路由汇总:在 ABR 上对 3 类 LSA 进行汇总。
[r1-ospf-1-area-0.0.0.2]abr-summary 192.168.0.0 255.255.252.0
域间路由汇总只能汇总 ABR 自身通过 1 类、2 类 LSA 学习到的路由。
域外路由汇总:在 ASBR 上对 5 类/7 类 LSA 进行汇总。
[r4-ospf-1]asbr-summary 172.16.0.0 255.255.252.0
汇总后开销:
- Type 2:等于明细路由最大开销值 +1
- Type 1:等于明细路由最大开销值
3.2 特殊区域
OSPF 特殊区域分为两大类、四小类:
第一大类条件
- 不能是骨干区域
- 不能存在虚链路
- 不能存在 ASBR
末梢区域(Stub):拒绝 4 类和 5 类 LSA,自动生成指向骨干的 3 类缺省路由。
[r5-ospf-1-area-0.0.0.2]stub # 区域内所有设备都需配置
完全末梢区域(Totally Stub):在 Stub 基础上进一步拒绝 3 类 LSA,仅保留 3 类缺省。
[r1-ospf-1-area-0.0.0.2]stub no-summary # 仅 ABR 配置
第二大类条件
- 不能是骨干区域
- 不能存在虚链路
- 存在 ASBR
非完全末梢区域(NSSA):拒绝 4 类和 5 类 LSA,域外路由以 7 类 LSA 形式传递,自动生成 7 类缺省。
[r4-ospf-1-area-0.0.0.1]nssa # 区域内所有设备都需配置
完全 NSSA(Totally NSSA):在 NSSA 基础上进一步拒绝 3 类 LSA,产生 3 类缺省。
[r3-ospf-1-area-0.0.0.1]nssa no-summary # 仅 ABR 配置
3.3 各区域允许的 LSA 类型
| 区域类型 | 1 类 | 2 类 | 3 类 | 4 类 | 5 类 | 7 类 |
|---|---|---|---|---|---|---|
| 普通区域 | 有 | 有 | 有 | 有 | 有 | 无 |
| Stub | 有 | 有 | 有 | 无 | 无 | 无 |
| Totally Stub | 有 | 有 | 仅缺省 | 无 | 无 | 无 |
| NSSA | 有 | 有 | 有 | 无 | 无 | 有 |
| Totally NSSA | 有 | 有 | 仅缺省 | 无 | 无 | 有 |
四、不规则区域解决方案
4.1 问题场景
OSPF 要求所有非骨干区域必须与 Area 0 直接相连,骨干区域唯一且不能被分割。实际部署中可能出现:
- 远离骨干的非骨干区域
- 不连续的骨干区域
4.2 虚链路(Virtual Link)
虚链路是专门解决 OSPF 不规则区域的技术,是一种虚拟的、逻辑的链路。
配置方法:
[r2-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3
[r3-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2
注意:
- 虚链路只跨越一个非骨干区域
- 虚链路建立的邻居关系不在 OSPF 邻居表中存放
- 基于开销值小的物理链路建立,本地存在物理链路则虚链路永不中断
- Vlink 所在的非骨干区域不能传递聚合路由(避免环路)
4.3 多进程双向重发布
这是解决不规则区域最常用的方式。在 ASBR 上将不同 OSPF 进程的路由信息互相导入。
[r3]ospf 1
[r3-ospf-1]import-route ospf 2
[r3]ospf 2
[r3-ospf-2]import-route ospf 1
经过双向重发布后全网设备均能学习到所有 OSPF 路由,不存在选路不佳和环路问题。
五、OSPF 选路原则
5.1 路由优先级
OSPF 内部路由默认优先级 10;域外路由(O_ASE / O_NSSA)默认优先级 150。
5.2 选路规则
- 域内优于域间:1 类/2 类 LSA 学习到的 > 3 类 LSA 学习到的(即使开销更大)
- 域间优于域外:3 类 LSA > 5 类/7 类 LSA(即使开销更大)
- Type 1 永远优于 Type 2
- Type 2 选路:先比较种子度量值 → 再比较沿途累加开销
- Type 1 选路:比较总开销(种子度量值 + 沿途累加开销)
- 5 类和 7 类 LSA 在华为体系中的选路规则相同
5.3 开销值计算
Cost = 参考带宽 / 真实带宽
修改开销值的方法:
# 修改参考带宽(全网需要一致)
[r3-ospf-1]bandwidth-reference 1000
# 直接修改接口开销值(推荐)
[r3-GigabitEthernet0/0/0]ospf cost 1000
六、OSPF 防环机制
6.1 域间防环
- 要求按星型拓扑部署(所有非骨干区域必须与 Area 0 直连)
- 区域间水平分割:ABR 不会将从某个区域收到的 3 类 LSA 再注入回该区域
- ABR 从非骨干区域收到的 3 类 LSA 不能用于区域间路由计算
6.2 域内防环
得益于 SPF(最短路径优先)算法。根据 LSDB 中的 LSA 信息转化为有向图,以本设备为根节点转化为最短路径树(无环树形结构),将路径信息加载到路由表中。
七、拓展配置
7.1 手工认证
# 接口认证
[r5-GigabitEthernet0/0/0]ospf authentication-mode md5 1 cipher 123456
# 区域认证
[r3-ospf-1-area-0.0.0.0]authentication-mode md5 1 cipher 123456
# 虚链路认证
[r4-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3 md5 1 cipher 123456
7.2 加快收敛
# 修改 Hello 时间(死亡时间自动 4 倍匹配)
[r5-GigabitEthernet0/0/0]ospf timer hello 5
# 修改死亡时间
[r1-GigabitEthernet0/0/0]ospf timer dead 20
7.3 缺省路由
| 缺省类型 | 产生方式 | 标记 | 优先级 |
|---|---|---|---|
| 3 类缺省 | 特殊区域自动生成 | OSPF | 10 |
| 5 类缺省 | default-route-advertise | O_ASE | 150 |
| 7 类缺省 | NSSA 区域自动或手动下发 | O_NSSA | 150 |
# 下发 5 类缺省
[r2-ospf-1]default-route-advertise always
# 下发 7 类缺省
[r4-ospf-1-area-0.0.0.1]nssa default-route-advertise