上一篇把七种 LSA 认全了。这篇讲怎么用这些 LSA 算出路由——以及划区域之后,为什么有些路由能算、有些不能算。
OSPF 的路由计算分三种:域内(Intra-area)靠地图算、域间(Inter-area)靠转述算、外部(External)靠 Type 5 算。三种的算法和可信度完全不同,排错时先分清是哪种。
为什么要划区域
单区域网络一大,三件事会同时恶化:
- LSDB 变大:每台路由器都要存全网所有 LSA,内存吃紧;
- SPF 计算变重:拓扑一变全网重算,CPU 打满;
- 故障域变大:核心区抖一下,边缘也跟着重算。
划区域本质上是用"信息隔离"换"规模":区域内用完整地图(Type 1/2),区域间只用摘要(Type 3),外面的事只留一条入口(Type 4/5)。
三条硬规则
- Area 0 是骨干区域,其他区域原则上必须直接挂在 Area 0 上;
- 所有区域间路由必须经过 Area 0 中转——两个非骨干区域之间不能直接互通,必须绕一趟骨干;
- 区域号可以用十进制整数(Area 1)或 IP 形式(Area 0.0.0.1)表示,Area 0 = Area 0.0.0.0。
第 2 条是理解 OSPF 防环的钥匙,下面会展开。
域内路由计算:SPF 分两个阶段
一台 OSPF 路由器在区域内的路由计算,严格来说是两遍:
Phase 1 —— 算拓扑(最短路径树)
只看 Type 1 里的 P2P 和 TransNet 链路,加上 Type 2
→ 得到一棵【无环的最短路径树】,树上每个节点是一台路由器
→ 结果:我知道"到每台路由器,开销是多少、从哪个口出去"
Phase 2 —— 挂前缀
把 Type 1 里的 StubNet 链路、Type 2 里的网段掩码挂到树上
→ 得到具体的路由条目
★ 为什么要分开?因为拓扑信息(谁连谁)和路由信息(哪个网段)
是两类东西。拓扑算一次就够,前缀可以挂很多个。
候选列表:Dijkstra 到底在干什么
Phase 1 用的就是 Dijkstra 算法,工程上叫候选列表(Candidate List)方法:
- 把自己(根)放进最短路径树(SPT),开销 = 0;
- 把自己的所有邻居放进候选列表,记录各自的开销和父节点;
- 从候选列表里挑开销最小的那个,移进 SPT,从候选列表删除;
- 把这个新节点的邻居也加进候选列表(如果已经有记录,就比较开销,小者胜出并更新父节点);
- 重复 3~4,直到候选列表为空。
R1 ──10── R2 ──10── R3
│ │
└──────── 30 ───────┘
初始:SPT = {R1:0}
候选 = {R2: 10(父R1), R3: 30(父R1)}
第1轮:取最小 R2(10) → 进 SPT
候选 = {R3: 30(父R1), R3: 20(父R2)} ← 同一个 R3 两条路径
比较:20 < 30,更新为 R3: 20(父R2)
第2轮:取最小 R3(20) → 进 SPT
候选 = {} 结束
结果:R1→R2 = 10,R1→R3 = 20(经 R2),而不是 30(直连)
关键点:R1 到 R3 明明有直连的 30 开销链路,但最终走的是 R1→R2→R3(20)。SPF 永远选总开销最小的路径,不看跳数、不看直连与否。
顺便回答一个常见问题:OSPF 不是"邻居开销"而是"路径开销"。所以会出现"绕一圈反而更快"的情况,这是正常的。
域间路由计算:Type 3 怎么被算出来的
ABR 从 Area 0 学到一条 Type 3(比如 10.1.1.0/24,开销 5),它转述给 Area 1 时,开销 = 学到的开销 + ABR 到 Area 0 那段链路的开销。
Area 1 内某路由器 R1 看到的 Type 3:
10.1.1.0/24 AdvRouter=ABR Metric=12
这 12 是怎么来的:
ABR 从 Area 0 学到该网段的 Type 3 开销 = 8
+ ABR 到 Area 0 的接口开销 = 4
────────────────────────────────
= 12 转述给 Area 1 时就用这个值
所以域间路由的度量是【累加的】,越远的区域开销越大
防环:三条铁律
Type 3 只带路由信息不带拓扑,一旦转述出错就可能出环。OSPF 用三条规则堵死:
| 规则 | 内容 | 效果 |
|---|---|---|
| ① 骨干中转 | 两个非骨干区域之间的流量必须经过 Area 0 | 区域间的拓扑是"星型",天然无环 |
| ② 只算骨干来的 | ABR 只计算从 Area 0 学到的 Type 3;从非骨干区域学到的 Type 3 只存进 LSDB,不参与路由计算 | 防止非骨干区域之间互相"抄近路"形成环 |
| ③ 不回灌 | ABR 不会把从某个区域学到的 Type 3 再转述回同一个区域 | 避免同一区域内的路由被重复通告 |
┌──── Area 1 ────┐ ┌──── Area 2 ────┐
│ R1 │ │ R2 │
└────────┬───────┘ └───────┬────────┘
│ │
ABR1 ════════ 直连链路 ════════ ABR2
│ │
└────── Area 0 ──────────┘
问题:ABR1 和 ABR2 之间有一条【不属于 Area 0】的直连链路。
如果允许它转发区域间流量,就会出现:
Area 1 → ABR1 → (直连) → ABR2 → Area 2
这条路径绕过了 Area 0,一旦链路状态变化,
两个 ABR 对"去 Area 2 怎么走"的认知可能不一致 → 环
OSPF 的处理:
· ABR1 从 Area 2 学到的 Type 3,不会拿来到 Area 1 里算
· 所有跨区域流量老老实实:Area 1 → ABR1 → Area 0 → ABR2 → Area 2
· 结果:多绕一段,但绝对不会出环
区域间路由汇总:把 Type 3 压扁
一个区域里有几十个网段,ABR 就会产生几十条 Type 3 泛洪给其他区域。用汇总能压成一条:
ospf 1
area 1
abr-summary 10.1.0.0 255.255.0.0 # 把 Area 1 里的 10.1.x.x 汇总
★ 生效条件:被汇总的网段【全都存在】时,汇总路由才产生。
有一条不在,汇总就不生效(除非加 advertise 参数)。
华为可以加:abr-summary 10.1.0.0 255.255.0.0 advertise
表示即使只有部分网段存在也通告汇总路由。
外部路由的汇总在 ASBR 上做,用的是 asbr-summary,它汇总的是 Type 5:
ospf 1
asbr-summary 172.16.0.0 255.255.0.0
asbr-summary 172.16.0.0 255.255.0.0 not-advertise # 只抑制不通告
★ 注意区分:
abr-summary → 在 ABR 上,汇总【区域间】路由(Type 3)
asbr-summary → 在 ASBR 上,汇总【引入的外部】路由(Type 5)
还有一类特殊用法:在 ASBR 上对 Type 3 做汇总(abr-summary 也能用在 ASBR 的 area 0 视图下),用来把从其他区域学来的域间路由再聚合一次。
虚链路:什么时候不得不开这个后门
虚链路(Virtual Link)是两个 ABR 之间建立的一条逻辑上属于 Area 0 的隧道。它存在的意义只有一个:修补不满足"必须直连 Area 0"的组网。
两种典型场景:
- 骨干区域不连续:Area 0 被拆成两段(比如合并网络时),用虚链路把两段 Area 0 接起来;
- 区域没有直连 Area 0:某个区域只挂在另一个非骨干区域上,用虚链路"跳"到 Area 0。
# 拓扑:Area 0 ── R1 ── Area 1 ── R2 ── Area 2
# 目标:让 Area 2 通过虚链路接入 Area 0
# 虚链路的两端必须是【各自区域的 ABR】,且必须穿过一个【普通区域】
# 在 R1(Area 0 与 Area 1 的 ABR)上:
ospf 1
area 1
vlink-peer 2.2.2.2 # 对端 ABR 的 Router ID
# 在 R2(Area 1 与 Area 2 的 ABR)上:
ospf 1
area 1
vlink-peer 1.1.1.1
# 验证
display ospf vlink
虚链路的几个坑:
- 穿越的区域必须是普通区域——不能是 Stub / Totally Stub / NSSA,因为虚链路的报文要在里面泛洪;
- 虚链路的两端必须都能被路由到(一般用 Router ID 指定,所以要有到对端 Router ID 的路由);
- 虚链路是临时修补手段,不是设计手段。生产环境能改拓扑就别用它。
完整配置:三区域组网
Area 1 Area 0 Area 2
R1 ─────────── ABR1 ─────────── ABR2 ─────────── R2
10.1.1.0/24 10.0.0.0/24 10.2.1.0/24
ospf 1 router-id 1.1.1.1
area 0.0.0.0
network 10.0.0.0 0.0.0.255
abr-summary 10.1.0.0 255.255.0.0 # 汇总 Area 1 的网段
area 0.0.0.1
network 10.1.1.0 0.0.0.255
ospf 1 router-id 2.2.2.2
area 0.0.0.2
network 10.2.1.0 0.0.0.255
# 接口下启用(另一种写法)
interface GigabitEthernet0/0/1
ospf enable 1 area 0.0.0.2
验证与排错
display ospf routing # ★ 看路由类型:Intra / Inter / External
display ospf lsdb summary # Type 3 明细(核对 AdvRouter 与 Metric)
display ospf abr-asbr # ★ 看本机认为谁是 ABR / ASBR
display ospf vlink # 虚链路状态
display ospf brief # 各区域统计、SPF 次数
display ospf interface # 接口所属区域
# 路由类型速查
# O → Type 1/2,域内
# O_IA → Type 3,域间
# O_ASE → Type 5,外部(E1/E2)
# O_NSSA → Type 7,NSSA 外部
三个高频问题:
- 跨区域不通,但区域内正常 → 查 ABR 有没有一个接口在 Area 0;
- 两个非骨干区域不通 → 正常现象,必须绕 Area 0。要直通得用虚链路或隧道;
- 汇总路由不生效 → 汇总的网段没全存在;加
advertise参数,或检查 ABR 是否真的学到了这些 Type 3。
一句话总结:域内靠地图(Type 1/2 + SPF 两阶段),域间靠转述(Type 3 + 累加开销 + 只认骨干),外部靠引入(Type 5 + Type 4 指路)。划区域是为了省资源,代价是"跨区域必须绕骨干"——这条规则换来的是绝对不会出环。
📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)
合并了原始笔记中「ospf域内路由计算 / 域间路由计算及防环 / ospf多区域 / 特殊区域(stub和nssa) / 虚链路 / ospf 路由汇总」几页。
原笔记里的 SPF 推演来自胶片截图(含候选列表表格),本文用文字重排了推演过程,并补齐了三条防环铁律的说明。
配置命令保留华为 VRP 原样。