上一篇把七种 LSA 认全了。这篇讲怎么用这些 LSA 算出路由——以及划区域之后,为什么有些路由能算、有些不能算。

OSPF 的路由计算分三种:域内(Intra-area)靠地图算、域间(Inter-area)靠转述算、外部(External)靠 Type 5 算。三种的算法和可信度完全不同,排错时先分清是哪种。

为什么要划区域

单区域网络一大,三件事会同时恶化:

划区域本质上是用"信息隔离"换"规模":区域内用完整地图(Type 1/2),区域间只用摘要(Type 3),外面的事只留一条入口(Type 4/5)。

三条硬规则

  1. Area 0 是骨干区域,其他区域原则上必须直接挂在 Area 0 上;
  2. 所有区域间路由必须经过 Area 0 中转——两个非骨干区域之间不能直接互通,必须绕一趟骨干;
  3. 区域号可以用十进制整数(Area 1)或 IP 形式(Area 0.0.0.1)表示,Area 0 = Area 0.0.0.0。

第 2 条是理解 OSPF 防环的钥匙,下面会展开。

域内路由计算:SPF 分两个阶段

一台 OSPF 路由器在区域内的路由计算,严格来说是两遍:

SPF 两阶段
Phase 1 —— 算拓扑(最短路径树)
  只看 Type 1 里的 P2P 和 TransNet 链路,加上 Type 2
  → 得到一棵【无环的最短路径树】,树上每个节点是一台路由器
  → 结果:我知道"到每台路由器,开销是多少、从哪个口出去"

Phase 2 —— 挂前缀
  把 Type 1 里的 StubNet 链路、Type 2 里的网段掩码挂到树上
  → 得到具体的路由条目

★ 为什么要分开?因为拓扑信息(谁连谁)和路由信息(哪个网段)
  是两类东西。拓扑算一次就够,前缀可以挂很多个。

候选列表:Dijkstra 到底在干什么

Phase 1 用的就是 Dijkstra 算法,工程上叫候选列表(Candidate List)方法:

  1. 把自己(根)放进最短路径树(SPT),开销 = 0;
  2. 把自己的所有邻居放进候选列表,记录各自的开销和父节点;
  3. 从候选列表里挑开销最小的那个,移进 SPT,从候选列表删除;
  4. 把这个新节点的邻居也加进候选列表(如果已经有记录,就比较开销,小者胜出并更新父节点);
  5. 重复 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 泛洪给其他区域。用汇总能压成一条:

huawei · 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:

huawei · ASBR 上汇总 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"的组网。

两种典型场景:

  1. 骨干区域不连续:Area 0 被拆成两段(比如合并网络时),用虚链路把两段 Area 0 接起来;
  2. 区域没有直连 Area 0:某个区域只挂在另一个非骨干区域上,用虚链路"跳"到 Area 0。
huawei · 虚链路配置
# 拓扑: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

虚链路的几个坑:

完整配置:三区域组网

huawei · 拓扑
    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
huawei · ABR1
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
huawei · R2(Area 2 内部)
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

验证与排错

huawei
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 外部

三个高频问题:

一句话总结:域内靠地图(Type 1/2 + SPF 两阶段),域间靠转述(Type 3 + 累加开销 + 只认骨干),外部靠引入(Type 5 + Type 4 指路)。划区域是为了省资源,代价是"跨区域必须绕骨干"——这条规则换来的是绝对不会出环。

📌 本篇整理自 2024–2025 的「数通」学习笔记(HCIE-Datacom 方向)

合并了原始笔记中「ospf域内路由计算 / 域间路由计算及防环 / ospf多区域 / 特殊区域(stub和nssa) / 虚链路 / ospf 路由汇总」几页。
原笔记里的 SPF 推演来自胶片截图(含候选列表表格),本文用文字重排了推演过程,并补齐了三条防环铁律的说明。
配置命令保留华为 VRP 原样。