mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
5214 字
15 分钟
域内路由:组织内部如何转发
2022-04-04

数据包经过 ARP与首跳路由 找到了第一跳路由器,又被 IP地址与子网 的最长前缀匹配逐跳转发。但一个组织内部可能有几十甚至上百台路由器——它们之间怎么知道该把包往哪送?路由表里的那些”下一跳”是谁填进去的?

答案就是域内路由协议(IGP,Interior Gateway Protocol)。路由器之间通过 IGP 交换网络拓扑信息,各自计算出最短路径,填入路由表。没有 IGP,每台路由器的路由表都得人工配置——在规模稍大的网络里,这和手工管理每台主机的 /etc/hosts 一样不现实。

本章从路由问题的图论本质出发,先看距离向量路由(RIP)的简单与局限,再深入链路状态路由(OSPF)的核心机制——LSDB 同步、区域划分、LSA 类型、SPF 计算,然后对比运营商偏好的 IS-IS,最后追踪一次链路故障后 OSPF 网络的收敛过程。

一、路由问题:网络内部如何找到路径#

1.1 图论视角:最短路径问题#

把网络抽象成一个带权有向图:路由器是节点,链路是边,链路的度量值(metric,比如延迟、带宽、跳数)是边的权重。路由问题本质上就是单源最短路径问题——每台路由器都需要算出自己到所有其他路由器的最短路径。

graph LR R1["R1"] -->|10| R2["R2"] R1 -->|30| R3["R3"] R2 -->|20| R3 R2 -->|15| R4["R4"] R3 -->|5| R4 R4 -->|10| R5["R5"] R3 -->|25| R5 style R1 fill:#e3f2fd,stroke:#1565c0 style R2 fill:#e8f5e9,stroke:#2e7d32 style R3 fill:#fff3e0,stroke:#e65100 style R4 fill:#fce4ec,stroke:#c62828 style R5 fill:#f3e5f5,stroke:#6a1b9a

以 R1 为源,最短路径是:

目的最短路径总代价
R2R1→R210
R3R1→R2→R330
R4R1→R2→R425
R5R1→R2→R4→R535

注意 R1→R3 的直连链路代价是 30,但经 R2 中转的总代价也是 30——等价路径,可以负载分担。

两种经典算法可以解决这个问题:

  • Bellman-Ford 算法:逐轮松弛边,时间复杂度 O(VE)。距离向量路由(RIP)的理论基础。
  • Dijkstra 算法:贪心扩展最近节点,时间复杂度 O(V²) 或 O(E + V log V)(用优先队列)。链路状态路由(OSPF/IS-IS)的理论基础。

1.2 为什么需要动态路由#

最简单的方案是静态路由——管理员手动在每台路由器上配置”目的网络 → 下一跳”的映射。小型网络里这没问题:

# 在 R1 上配置静态路由
ip route 10.0.2.0/24 via 10.0.1.2 # 经 R2 到达 10.0.2.0/24
ip route 10.0.3.0/24 via 10.0.1.3 # 经 R3 到达 10.0.3.0/24
ip route 0.0.0.0/0 via 10.0.1.1 # 默认路由

但静态路由有三个致命问题:

  1. 不可扩展:50 台路由器的网络,一条链路断开可能需要改 30 多台路由器的配置
  2. 无故障自愈:链路断开时不会自动切换到备用路径
  3. 无法感知拓扑变化:新增路由器、度量值变化、负载均衡需求——静态路由一无所知

动态路由协议解决的就是这三个问题:自动发现拓扑、自动计算路径、自动响应变化

1.3 IGP 与 EGP 的分工#

维度IGP(域内路由)EGP(域间路由)
作用范围单个组织/AS 内部AS 之间
核心目标找到最短路径执行策略路由
典型协议OSPF、IS-IS、RIPBGP
路由数量几十到几千条几十万到上百万条
策略需求少(主要看代价)多(商业关系、流量工程)

IGP 关心”怎么走最快”,EGP 关心”允不允许走这条路”。本章聚焦 IGP,BGP与域间路由 中再展开 EGP。

二、距离向量路由:RIP 的简单与局限#

2.1 Bellman-Ford 与距离向量#

距离向量路由的核心思想极其简洁:每台路由器把自己的路由表发给邻居,邻居据此更新自己的路由表。这就是 Bellman-Ford 算法的分布式版本:

D(x, y) = min over all neighbors v { c(x, v) + D(v, y) }

每台路由器只需要知道到邻居的代价和邻居通告的距离,就能算出自己的最短距离。RIP(RFC 2453)是距离向量路由的经典实现:

# FRR 中配置 RIP(仅作演示,生产环境不推荐)
vtysh
configure terminal
router rip
network 10.0.0.0/8
network 192.168.1.0/24

2.2 RIP 的工作过程#

假设三台路由器线性连接:R1 — R2 — R3,每条链路代价为 1。

graph LR R1["R1<br/>10.0.1.0/24"] -->|1| R2["R2<br/>10.0.2.0/24"] R2 -->|1| R3["R3<br/>10.0.3.0/24"] style R1 fill:#e3f2fd,stroke:#1565c0 style R2 fill:#e8f5e9,stroke:#2e7d32 style R3 fill:#fff3e0,stroke:#e65100

初始状态每台路由器只知道自己直连的网络。第一轮交换后,R1 从 R2 学到 10.0.2.0/24(距离 1),R2 从 R1 和 R3 分别学到 10.0.1.0/24 和 10.0.3.0/24(距离 1)。第二轮交换后,R1 从 R2 学到 10.0.3.0/24(距离 2)。收敛完成。

2.3 计数到无穷:RIP 的致命缺陷#

距离向量路由有一个著名的问题——计数到无穷(Count-to-Infinity)。假设 R2→R3 的链路断开:

1. R3 发现 10.0.3.0/24 不可达,将距离设为 16
2. R2 的路由表里:10.0.3.0/24 → 下一跳 R3,距离 2
3. R3 收到 R2 的更新:"我到 10.0.3.0/24 距离是 2"
4. R3 想:经 R2 可以到 10.0.3.0/24,距离 2+1=3
5. R2 收到 R3 的更新,距离变成 3+1=4
6. ... 如此循环,直到距离达到 16(RIP 的无穷大)

RIP 用了两种修补手段:

  • 水平分割(Split Horizon):从某个接口学到的路由,不再从该接口发回去
  • 毒性逆转(Poison Reverse):从某个接口学到的路由,从该接口发回时将距离设为 16

这两种方法只能解决两个路由器之间的循环,三个以上路由器的循环仍然无法避免。

Warning

RIP 的计数到无穷不是”偶尔出现的小 bug”,而是距离向量算法的结构性缺陷。任何基于”我只告诉邻居我的距离”的协议,都无法在所有拓扑下避免路由环路。这是链路状态协议取代距离向量协议的根本原因。

2.4 RIP 被淘汰但概念重要#

RIP 在现代网络中几乎绝迹,但理解它仍然重要:

  1. 距离向量的思想无处不在:BGP 的路径矢量是”增强版距离向量”——通告的不是距离而是完整路径,从而避免了计数到无穷。理解 RIP 的缺陷,才能理解 BGP 为什么要设计 AS_PATH 属性。
  2. 协议设计的反面教材:RIP 的每个缺陷都催生了更好的设计——计数到无穷催生了链路状态,慢收敛催生了触发更新,最大 15 跳催生了无跳数限制的协议。

三、链路状态路由:OSPF 的核心思想#

3.1 Dijkstra 与全局视角#

链路状态路由的核心思想与距离向量完全不同:每台路由器都掌握完整的网络拓扑,各自独立运行 Dijkstra 算法计算最短路径。从”我问邻居怎么走”变成”我自己看地图找路”。

flowchart TB subgraph 距离向量["距离向量:问路模式"] DV1["R1: 我到 R3 多远?"] DV2["R2: 我到 R3 是 1 跳"] DV3["R1: 那我经 R2 到 R3 是 2 跳"] end subgraph 链路状态["链路状态:看地图模式"] LS1["每台路由器通告自己的链路状态"] LS2["所有路由器拼出完整拓扑图"] LS3["各自运行 Dijkstra 计算最短路径"] LS1 --> LS2 --> LS3 end style 距离向量 fill:#ffebee,stroke:#c62828 style 链路状态 fill:#e8f5e9,stroke:#2e7d32
维度距离向量链路状态
信息交换路由器只通告距离向量路由器通告本地链路状态
拓扑认知只知道邻居告诉你的知道完整拓扑
计算方式分布式迭代(Bellman-Ford)本地独立计算(Dijkstra)
收敛速度慢(计数到无穷)快(拓扑变化立即泛洪)
路由环路可能产生不会产生(计算无环)
资源消耗低(只存路由表)较高(存完整 LSDB)
典型协议RIPOSPF、IS-IS

3.2 LSDB:链路状态数据库#

OSPF 中,每台路由器生成链路状态通告(LSA,Link-State Advertisement),描述自己的链路信息。所有 LSA 的集合构成链路状态数据库(LSDB)。同一个区域内所有路由器的 LSDB 必须完全一致。

# 查看 OSPF 链路状态数据库
vtysh
show ip ospf database
# 典型输出:
# OSPF Router with ID (1.1.1.1)
# Router Link States (Area 0.0.0.0)
# Link ID ADV Router Age Seq# CkSum Link count
# 1.1.1.1 1.1.1.1 364 0x80000004 0x00a5 2
# 2.2.2.2 2.2.2.2 365 0x80000004 0x00b7 2
# 3.3.3.3 3.3.3.3 360 0x80000003 0x00c9 1

序列号和年龄机制保证 LSDB 的同步和老化:新 LSA 的序列号更大,旧 LSA 的年龄达到 MaxAge(3600 秒)后自动失效。

3.3 LSA 泛洪与同步#

当路由器检测到拓扑变化,它生成新的 LSA 并**泛洪(flooding)**到整个区域:

sequenceDiagram participant R1 as R1<br/>检测到变化 participant R2 as R2<br/>DR participant R3 as R3 participant R4 as R4 R1->>R2: LSU(包含新LSA) Note over R2: R2 是 DR,负责转发 R2->>R3: LSU(转发新LSA) R2->>R4: LSU(转发新LSA) R3->>R2: LSAck(确认) R4->>R2: LSAck(确认) R2->>R1: LSAck(确认) Note over R1,R4: 所有路由器 LSDB 同步完成

泛洪的关键机制:

  1. 可靠泛洪:每条 LSA 都必须被确认(LSAck),未确认的重传
  2. DR/BDR 机制:在广播网络上选举指定路由器(DR)和备份指定路由器(BDR),非 DR 路由器只向 DR 发送 LSA,DR 负责向全网转发——减少泛洪流量
  3. 序列号比较:收到 LSA 后比较序列号——比本地新则更新并继续泛洪,比本地旧则丢弃
  4. 老化机制:LSA 的 Age 字段每秒递增,达到 MaxAge(3600 秒)后从 LSDB 中删除
# 查看 OSPF 接口状态,确认 DR/BDR
show ip ospf interface
# 典型输出:
# eth0 is up
# Internet Address 10.0.1.1/24, Area 0.0.0.0
# Router ID 1.1.1.1, Network Type BROADCAST, Cost: 10
# Transmit Delay is 1 sec, State DR, Priority 1
# Designated Router (ID) 1.1.1.1, Interface address 10.0.1.1
# Backup Designated Router (ID) 2.2.2.2, Interface address 10.0.1.2
# Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5

3.4 OSPF 区域划分#

当网络规模增长,LSDB 也会膨胀。OSPF 的解决方案是区域划分(Area)

graph TB subgraph Area0["Area 0 — 骨干区域"] ABR1["ABR1<br/>1.1.1.1"] ABR2["ABR2<br/>2.2.2.2"] R_BACK1["R-B1"] R_BACK2["R-B2"] ABR1 --- R_BACK1 --- R_BACK2 --- ABR2 end subgraph Area1["Area 1 — 非骨干区域"] R1A["R1-A"] R1B["R1-B"] R1C["R1-C"] R1A --- R1B --- R1C end subgraph Area2["Area 2 — 非骨干区域"] R2A["R2-A"] R2B["R2-B"] R2A --- R2B end ABR1 --- R1A ABR2 --- R2A style Area0 fill:#e3f2fd,stroke:#1565c0 style Area1 fill:#e8f5e9,stroke:#2e7d32 style Area2 fill:#fff3e0,stroke:#e65100

区域划分的规则:

  1. Area 0 是骨干区域:所有非骨干区域必须直接连接到 Area 0
  2. 区域内 LSDB 独立:每个区域有自己的 LSDB,SPF 计算在区域内独立进行
  3. ABR 桥接区域:区域边界路由器(ABR)连接多个区域,传递的是路由摘要而非原始 LSA
  4. 区域间流量必须经过 Area 0:非骨干区域之间不能直接交换流量
Note

OSPF 的区域划分和 IP地址与子网 中的路由聚合是配合使用的。Area 1 内部可能有几十条 /24 的路由,ABR 只需向 Area 0 通告一条聚合后的 /16 汇总路由——大大减少区域间的路由信息量。

3.5 LSA 类型详解#

LSA 类型名称生成者泛洪范围携带信息
Type 1Router LSA每台路由器区域内路由器的链路状态(连着谁、代价多少)
Type 2Network LSADR区域内广播网段上的所有路由器列表
Type 3Summary LSAABR区域间区域间的网络路由摘要
Type 4ASBR Summary LSAABR区域间到 ASBR 的路由
Type 5AS External LSAASBR全 AS到 AS 外部的路由
Type 7NSSA External LSANSSA 内的 ASBRNSSA 区域内NSSA 区域的外部路由(离开 NSSA 时转换为 Type 5)

Type 1 Router LSA——最基础的 LSA,每台路由器生成一条,描述自己的所有链路:

Router LSA (Type 1) from Router 1.1.1.1:
Link 1: connected to network 10.0.1.0/24, cost 10
Link 2: connected to router 2.2.2.2 (point-to-point), cost 20
Link 3: connected to stub network 10.0.10.0/24, cost 1

Type 2 Network LSA——只在广播网段上由 DR 生成,列出该网段上所有路由器的 Router ID。Type 1 + Type 2 一起构成区域的完整拓扑——SPF 计算的输入。

Type 3 Summary LSA——ABR 将一个区域内的路由摘要后通告到另一个区域。注意 Type 3 传递的是路由(目的网络 + 代价),不是拓扑。收到 Type 3 的路由器直接将其作为叶子节点挂到 ABR 上,不纳入 SPF 计算。

Type 5 AS External LSA——由 ASBR 生成,通告 AS 外部的路由。外部路由有两种度量类型:E1(外部代价 + 内部代价)和 E2(只看外部代价,默认)。

Type 7 NSSA External LSA——NSSA 区域不允许 Type 5 LSA 进入,但 NSSA 内部可能有 ASBR 需要引入外部路由。Type 7 只在 NSSA 内泛洪,ABR 将其转换为 Type 5 后再传播到其他区域。

# 查看各类 LSA 的详细信息
show ip ospf database router # Type 1
show ip ospf database network # Type 2
show ip ospf database summary # Type 3
show ip ospf database external # Type 5
show ip ospf database nssa-external # Type 7

3.6 LSDB 同步的完整过程#

# 查看 OSPF 邻居状态
show ip ospf neighbor
# 典型输出:
# Neighbor ID Pri State Dead Time Address Interface
# 2.2.2.2 1 Full/DR 38.314s 10.0.1.2 eth0
# 3.3.3.3 1 Full/BDR 37.892s 10.0.1.3 eth0

邻居状态机的关键转换:

状态含义触发条件
Down未收到 Hello初始状态
Init收到对方 Hello(但对方没列自己)收到 Hello
2-Way双向通信确认对方 Hello 包含自己的 Router ID
ExStart协商主从关系在广播网上只有 DR/BDR 进入
Exchange交换 DBD 报文(LSA 头部摘要)主从关系确定后
Loading请求和传输缺失的 LSA发现 LSDB 差异后
FullLSDB 完全同步Loading 完成

ExStart 阶段 Router ID 更大的路由器成为 Master。Exchange 阶段交换 DBD(不是完整 LSA,而是头部摘要),通过比较发现差异后,Loading 阶段用 LSR 请求缺失的 LSA,对方用 LSU 发送完整 LSA。

3.7 OSPF 配置实战#

# R1 的 OSPF 配置
vtysh
configure terminal
router ospf
ospf router-id 1.1.1.1
network 10.0.1.0/24 area 0
network 10.0.10.0/24 area 0
interface eth0
ip ospf cost 10
ip ospf hello-interval 10
ip ospf dead-interval 40
# 查看 OSPF 路由
show ip route ospf
# 典型输出:
# O 10.0.2.0/24 [110/20] via 10.0.1.2, eth0, 00:05:32
# O 10.0.3.0/24 [110/30] via 10.0.1.2, eth0, 00:05:32
# O IA 10.0.20.0/24 [110/40] via 10.0.1.2, eth0, 00:03:15
# ↑ O = OSPF 区域内, IA = 区域间

路由条目解读:O = 区域内路由(Type 1/2 LSA),O IA = 区域间路由(Type 3 LSA),O E1/O E2 = 外部路由(Type 5 LSA)。[110/20] = 管理距离 110 / 总代价 20。

四、IS-IS:运营商的选择#

4.1 IS-IS vs OSPF#

IS-IS(Intermediate System to Intermediate System)最初为 OSI 的 CLNP 协议设计,后来扩展支持 IP(Integrated IS-IS,RFC 1195)。在功能上与 OSPF 非常相似——都是链路状态协议,都用 Dijkstra 算法,都支持区域划分。但细节差异决定了各自的适用场景。

维度OSPFIS-IS
协议栈位置IP 层之上(协议号 89)链路层之上(Ethertype 0x22F4)
区域边界在路由器上(ABR)在链路上(L1/L2 路由器)
LSA/LSP 类型6+ 种(Type 1-5, 7)2 种(L1 LSP, L2 LSP)
扩展性TLV 支持有限原生 TLV 结构,扩展灵活
典型部署企业网运营商骨干网
认证明文/MD5/SHA明文/MD5/HMAC-SHA

4.2 为什么运营商偏好 IS-IS#

运营商选择 IS-IS 而非 OSPF,原因不是算法更优——两者都用 Dijkstra——而是工程实践中的差异:

  1. IS-IS 运行在链路层:不依赖 IP 就能工作。即使 IP 层配置错误导致 IP 不通,IS-IS 仍然可以交换路由信息。OSPF 封装在 IP 中,IP 不通则 OSPF 也不通——排错时是鸡生蛋的问题。

  2. 区域边界在链路上:OSPF 的 ABR 同时属于多个区域,维护多份 LSDB。IS-IS 的 L1 和 L2 是独立的拓扑——L1 的 LSP 和 L2 的 LSP 完全分离,区域扩展更灵活。

  3. TLV 结构更易扩展:IS-IS 的所有信息都用 TLV(Type-Length-Value)编码,新增功能只需定义新的 TLV 类型。OSPF 的 LSA 格式固定,新增功能往往需要定义新的 LSA 类型,实现复杂度上升。

  4. 大规模网络更稳定:IS-IS 的 LSP 泛洪机制比 OSPF 的 LSA 泛洪更高效——LSP 分片机制、SRM 标志位等设计减少了不必要的泛洪。

4.3 IS-IS 的 Level 1/Level 2 路由#

IS-IS 的层次结构比 OSPF 更简洁——只有两层:

graph TB subgraph Level2["Level 2 — 骨干"] L2R1["L2 R1"] L2R2["L2 R2"] L2R3["L2 R3"] L2R1 --- L2R2 --- L2R3 end subgraph Area1["Area 1 (Level 1)"] L1R1["L1 R1"] L1R2["L1 R2"] L1R1 --- L1R2 end subgraph Area2["Area 2 (Level 1)"] L1R3["L1 R3"] L1R4["L1 R4"] L1R3 --- L1R4 end L1R1 --- L2R1 L1R3 --- L2R3 style Level2 fill:#e3f2fd,stroke:#1565c0 style Area1 fill:#e8f5e9,stroke:#2e7d32 style Area2 fill:#fff3e0,stroke:#e65100
  • Level 1 路由:区域内路由。L1 路由器只知道本区域拓扑,到其他区域的流量发给最近的 L1/L2 路由器
  • Level 2 路由:区域间路由。L2 路由器组成骨干,知道所有区域的可达信息
  • L1/L2 路由器:同时运行 L1 和 L2,将 L1 路由注入 L2,将 L2 默认路由注入 L1

与 OSPF 的关键区别:IS-IS 的 L1 路由器使用最近 L1/L2 路由器作为出口(attach-bit 机制),而 OSPF 的区域内路由器使用计算出的最短路径经过 ABR 到达其他区域。IS-IS 的区域间路径可能不是全局最优的——但换来了更简单的计算和更低的资源消耗。

4.4 IS-IS 的 TLV 结构与配置#

IS-IS 的所有协议信息都用 TLV 编码,扩展极其方便:

TLV 格式: Type (1B) | Length (1B) | Value (Length bytes)
常见 TLV 类型:
Type 1: Area Address Type 129: Protocols Supported
Type 2: IS Neighbors (LSP) Type 128: IP Internal Reachability
Type 6: IP Interface Address Type 130: IP External Reachability
Type 10: Authentication Type 135: Extended IP Reachability

对比 OSPF:OSPF 的 Router LSA 格式固定——每个 Link 描述长度固定。新增信息(比如 MPLS TE 需要的链路带宽)不得不定义新的 LSA 类型(Opaque LSA),而 IS-IS 只需新增一个 TLV。

# FRR 中配置 IS-IS
vtysh
configure terminal
router isis BACKBONE
net 49.0001.0000.0000.0001.00
is-type level-1-2
interface eth0
ip router isis BACKBONE
isis circuit-type level-1-2
isis metric 10 level-1
isis metric 20 level-2

NET(Network Entity Title)格式为 Area-ID.System-ID.SEL

49.0001.0000.0000.0001.00
│ │ │
│ │ └── SEL (00 = 路由器)
│ └────────────────── System ID (6 字节)
└───────────────────────── Area ID (49 = 私有区域)

五、路由收敛:网络变化后多久恢复#

5.1 收敛时间的影响因素#

**收敛(Convergence)**是指网络拓扑变化后,所有路由器的路由表达到一致状态的过程。影响收敛时间的因素:

  1. 故障检测时间:物理层检测(毫秒级),OSPF Hello 超时(默认 40 秒),BFD(可缩短到 50 毫秒)
  2. LSA/LSP 泛洪时间:取决于网络直径和链路延迟
  3. SPF 计算时间:取决于 LSDB 规模和算法效率
  4. RIB/FIB 更新时间:取决于路由条目数量和硬件转发能力
sequenceDiagram participant LINK as 链路故障 participant DETECT as 故障检测 participant FLOOD as LSA泛洪 participant SPF as SPF计算 participant RIB as RIB/FIB更新 participant DATA as 数据转发恢复 LINK->>DETECT: 物理层/Hello超时/BFD Note over DETECT: 1ms ~ 40s DETECT->>FLOOD: 生成新LSA Note over FLOOD: 1ms ~ 数十ms FLOOD->>SPF: LSDB更新触发SPF Note over SPF: 1ms ~ 数百ms SPF->>RIB: 更新路由表 Note over RIB: 1ms ~ 数十ms RIB->>DATA: FIB更新完成 Note over LINK,DATA: 总收敛时间: 几十ms ~ 几十秒

5.2 OSPF SPF 调度与节流#

OSPF 不会在每次 LSDB 变化时立即运行 SPF——短时间内多条 LSA 变化时频繁运行 SPF 会浪费 CPU。OSPF 使用**SPF 节流(throttling)**机制:

# 配置 SPF 节流参数
router ospf
timers throttle spf 50 200 5000
# ↑ ↑ ↑
# │ │ └── 最大间隔(ms)
# │ └────── 增量间隔(ms)
# └────────── 初始间隔(ms)

SPF 节流的工作方式:第一次 LSDB 变化后等待 50ms 再运行 SPF(给其他 LSA 到达的时间),50ms 内又有变化也只运行一次。后续 SPF 间隔逐步增大直到 5000ms 上限,一段时间无新变化则重置回初始值。单次故障快速收敛,频繁抖动时保护 CPU。

5.3 IS-IS PRC 与部分路由计算#

IS-IS 比 OSPF 更进一步——它支持部分路由计算(PRC,Partial Route Calculation)。收到新 LSP 时先判断变化类型:

  • 拓扑变化(链路 up/down):需要重新运行 SPF
  • 叶子变化(IP 前缀增删):只需更新路由表中的前缀,不需要重新运行 SPF

这在运营商网络中非常有价值——一个 LSP 可能携带几百条 IP 前缀,新增一个前缀不应该触发全网 SPF 重算。OSPF 也有类似概念(Type 3/5/7 LSA 变化不触发 SPF),但 IS-IS 的 TLV 结构使得”拓扑信息”和”前缀信息”天然分离,PRC 实现更自然。

5.4 链路故障后 OSPF 收敛追踪#

假设以下拓扑中 R2→R4 的链路断开:

10 10 10
R1 ------ R2 ------ R3
| | |
10 20 10
| | |
R5 ------ R4 ------ R6
10 10

R2→R4 链路断开前的 R2 路由表:

目的下一跳代价
R1直连10
R3直连10
R4直连20
R5R120
R6R320

链路断开后的收敛过程:

  1. T+0ms:R2 检测到链路故障(物理层载波丢失或 BFD 超时)
  2. T+5ms:R2 生成 Type 1 LSA 更新,开始泛洪
  3. T+10ms:R1、R3 收到新 LSA,确认并继续泛洪
  4. T+15ms:R5、R6 收到新 LSA
  5. T+55ms:R2 的 SPF 节流延迟到期(50ms),运行 SPF
  6. T+56ms:R2 计算出新路径:到 R4 经 R1→R5→R4,代价 30
  7. T+57ms:R2 更新 RIB 和 FIB
  8. T+60ms:其他路由器也完成 SPF 计算和路由表更新

收敛后 R2 的新路由表:

目的下一跳代价变化
R1直连10不变
R3直连10不变
R4R130代价增大,路径切换
R5R120不变
R6R320不变

从数据包的角度看:T+0 到 T+57ms 之间,发往 R4 的数据包可能被丢弃。T+57ms 后,数据包改走 R1→R5→R4 的新路径。

Note

现代运营商网络通过 BFD(50ms 检测)+ OSPF/IS-IS 快速收敛优化,可以将收敛时间控制在 100-200ms 以内。在 运营商骨干网 中会看到 MPLS Fast Reroute 如何将收敛时间进一步压缩到 50ms 以下。

六、实战追踪:一个 OSPF 网络的数据包转发#

6.1 搭建小型 OSPF 网络#

用 GNS3 + FRR 搭建一个 5 路由器的双区域 OSPF 网络:

Area 0 (骨干) Area 1
┌──────────────────────┐ ┌──────────────┐
│ R1 ──── R2 ──── R3 ─┼────┼ R4 ──── R5 │
│ 10.0.12.0/24 │ │ │ 10.0.45.0/24 │
│ 10.0.23.0/24 │ │ │ │
└──────────────────────┘ └──────────────┘
│ │
R2-R4: 10.0.24.0/24
R3-R4: 10.0.34.0/24

R1、R2、R3 在 Area 0,R4、R5 在 Area 1。R2 和 R3 都是 ABR,提供冗余路径。

# ===== R1 配置 =====
vtysh
configure terminal
interface eth0
ip address 10.0.12.1/24
interface lo
ip address 1.1.1.1/32
router ospf
ospf router-id 1.1.1.1
network 10.0.12.0/24 area 0
passive-interface lo
# ===== R2 配置(ABR)=====
vtysh
configure terminal
interface eth0
ip address 10.0.12.2/24
interface eth1
ip address 10.0.23.2/24
interface eth2
ip address 10.0.24.2/24
interface lo
ip address 2.2.2.2/32
router ospf
ospf router-id 2.2.2.2
network 10.0.12.0/24 area 0
network 10.0.23.0/24 area 0
network 10.0.24.0/24 area 1
passive-interface lo
# ===== R4 配置 =====
vtysh
configure terminal
interface eth0
ip address 10.0.24.4/24
interface eth1
ip address 10.0.34.4/24
interface eth2
ip address 10.0.45.4/24
interface lo
ip address 4.4.4.4/32
router ospf
ospf router-id 4.4.4.4
network 10.0.24.0/24 area 1
network 10.0.34.0/24 area 1
network 10.0.45.0/24 area 1
passive-interface lo
# ===== R5 配置 =====
vtysh
configure terminal
interface eth0
ip address 10.0.45.5/24
interface lo
ip address 5.5.5.5/32
router ospf
ospf router-id 5.5.5.5
network 10.0.45.0/24 area 1
passive-interface lo

6.2 验证邻居与路由#

# 在 R2 上查看 OSPF 邻居
show ip ospf neighbor
# 预期输出:
# Neighbor ID Pri State Dead Time Address Interface
# 1.1.1.1 1 Full/DR 35s 10.0.12.1 eth0
# 3.3.3.3 1 Full/DR 37s 10.0.23.3 eth1
# 4.4.4.4 1 Full/DR 36s 10.0.24.4 eth2
# 在 R1 上查看 LSDB
show ip ospf database
# 预期输出(节选):
# Router Link States (Area 0.0.0.0): 1.1.1.1, 2.2.2.2, 3.3.3.3
# Summary Link States (Area 0.0.0.0): 10.0.24.0, 10.0.34.0, 10.0.45.0

注意 R1 的 LSDB 中有 Summary Link States(Type 3 LSA)——ABR R2 和 R3 从 Area 1 注入到 Area 0 的路由摘要。

6.3 traceroute 追踪路径#

# 在 R1 上执行 traceroute
traceroute 10.0.45.5
# 预期输出:
# 1 10.0.12.2 (R2) 1.234 ms 1.156 ms 1.089 ms
# 2 10.0.24.4 (R4) 2.345 ms 2.267 ms 2.198 ms
# 3 10.0.45.5 (R5) 3.456 ms 3.378 ms 3.312 ms
# 查看 R1 的 OSPF 路由表
show ip route ospf
# O 10.0.23.0/24 [110/20] via 10.0.12.2, eth0, 00:15:32
# O IA 10.0.24.0/24 [110/20] via 10.0.12.2, eth0, 00:12:15
# O IA 10.0.34.0/24 [110/20] via 10.0.12.2, eth0, 00:12:15
# O IA 10.0.45.0/24 [110/30] via 10.0.12.2, eth0, 00:12:15

6.4 模拟链路故障观察收敛#

模拟 R2→R4 链路故障:

# 在 R2 上关闭 eth2
configure terminal
interface eth2
shutdown
# 在 R1 上持续 ping R5
ping 10.0.45.5 count 100 interval 0.1

预期观察:

64 bytes from 10.0.45.5: icmp_seq=1 ttl=62 time=3.2 ms
64 bytes from 10.0.45.5: icmp_seq=2 ttl=62 time=3.1 ms
... (链路断开,几个包丢失)
Request timeout for icmp_seq=15
Request timeout for icmp_seq=16
... (OSPF 收敛中)
64 bytes from 10.0.45.5: icmp_seq=22 ttl=61 time=5.8 ms

收敛后路径自动切换到 R1→R2→R3→R4→R5:

traceroute 10.0.45.5
# 1 10.0.12.2 (R2) 1.234 ms
# 2 10.0.23.3 (R3) 2.345 ms
# 3 10.0.34.4 (R4) 3.456 ms
# 4 10.0.45.5 (R5) 4.567 ms
# 用 tcpdump 抓取 OSPF 事件
sudo tcpdump -i eth0 -vv ip proto 89
# 观察到的关键事件:
# 1. R2 发送 LSU(包含更新的 Type 1 LSA,移除到 R4 的链路)
# 2. R1 回复 LSAck
# 3. R3 发送 LSU(作为 ABR,更新 Type 3 Summary LSA)
# 4. R1 运行 SPF,更新路由表

6.5 OSPF 抓包分析#

# 抓取 OSPF Hello 包
sudo tcpdump -i eth0 -vv -c 5 ip proto 89 and ip[20:1] = 0x01
# 典型输出:OSPFv2, Hello, length 44, Router-ID 1.1.1.1, Area 0.0.0.0
# Hello Timer 10s, Dead Timer 40s, DR 10.0.12.1, BDR 10.0.12.2
# 抓取 OSPF LSU(链路状态更新)
sudo tcpdump -i eth0 -vv -c 3 ip proto 89 and ip[20:1] = 0x04
# 典型输出:OSPFv2, LS-Update, Router-ID 2.2.2.2, Area 0.0.0.0
# Type: Router (1), Links: 2, cost 10 each

Hello 包的关键字段:Hello Interval(10 秒)、Dead Interval(40 秒)、DR/BDR、Neighbor List。

七、本章小结#

概念要点
路由问题带权图最短路径,Bellman-Ford(DV)vs Dijkstra(LS)
静态路由局限不可扩展、无故障自愈
距离向量(RIP)只通告距离给邻居,有计数到无穷缺陷
链路状态(OSPF)掌握完整拓扑,独立 Dijkstra,收敛快无环路
OSPF 区域Area 0 骨干 + 非骨干,ABR 桥接,区域间传摘要
LSA 类型Type 1/2 建拓扑,Type 3 跨区域,Type 5 跨 AS
LSDB 同步Down→2-Way→ExStart→Exchange→Loading→Full
IS-IS vs OSPFIS-IS 链路层/TLV/运营商首选;OSPF IP 层/多 LSA/企业首选

数据包跨越组织边界时,IGP 就不够用了——那是 BGP与域间路由 的领域。


参考#

  • RFC 1195 — Use of OSI IS-IS for Routing in TCP/IP and Dual Environments
  • RFC 2453 — OSPF Version 2

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

域内路由:组织内部如何转发
https://blog.souloss.com/posts/internet-architecture/intra-domain-routing/
作者
Souloss
发布于
2022-04-04
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时