Skip to main content

13. The Flooding Procedure (泛洪过程)

泛洪是 OSPF 实现链路状态数据库同步的核心机制。本章详细描述 LSA 的泛洪、确认和重传过程。


章节概述 (Chapter Overview)

泛洪过程确保:

  • 可靠性:每个 LSA 都被确认
  • 高效性:避免重复泛洪
  • 一致性:所有路由器拥有相同的 LSDB
  • 速度:快速传播拓扑变化

13.1 泛洪基本原理 (Flooding Fundamentals)

核心机制

接收 LSA

  1. 验证 LSA 合法性
  2. 检查是否比当前数据库更新
  3. 安装到 LSDB
  4. 向除源接口外的所有接口泛洪
  5. 发送确认

泛洪范围

  • 区域内 LSA (Type 1, 2, 3, 4, 7):单个区域内
  • AS 外部 LSA (Type 5):整个 AS(除末梢区域)
  • 本地链路 LSA:单个链路

13.2 接收 LSA (Receiving LSAs)

步骤 1:验证 (Validation)

检查项目

  • LS Checksum 正确
  • LS Age < MaxAge 或 = MaxAge
  • LS Type 已知
  • 不是由本路由器产生的

验证失败

  • 丢弃 LSA
  • 不进行后续处理

步骤 2:查找实例 (Lookup)

在 LSDB 中查找

  • 按 (LS Type, Link State ID, Advertising Router) 查找
  • 三种情况:
    • 数据库中没有该 LSA
    • 数据库中有相同实例
    • 数据库中有不同实例

步骤 3:比较 (Comparison)

判断哪个更新

使用 LSA 比较规则(详见 Section 13.1):

  1. 序列号比较

    • 较大序列号更新
  2. 校验和比较

    • 序列号相同时
    • 较大校验和更新
  3. 年龄比较

    • MaxAge 总是更新
    • 年龄差 > MaxAgeDiff (900秒) 才算更新

步骤 4:处理 (Processing)

情况 A:接收的 LSA 更旧或相同

  • 发送确认
  • 如果邻居处于 Exchange/Loading 状态
    • 可能需要发送更新的 LSA

情况 B:数据库中没有该 LSA

  • 安装到 LSDB
  • 发送确认
  • 泛洪到其他接口
  • 可能需要重新计算路由

情况 C:接收的 LSA 更新

  • 替换数据库中的旧 LSA
  • 发送确认
  • 泛洪到其他接口
  • 可能需要重新计算路由

13.3 发送 LSA (Sending LSAs)

泛洪决策

对于每个接口

判断是否需要泛洪:

不泛洪的情况

  • 接口状态 Down
  • 接口状态 Loopback
  • LSA 从该接口接收
  • 接口是虚拟链路且 LSA 不是 Type 1/2
  • 接口属于末梢区域且 LSA 是 Type 5
  • 接口处于 Backup 状态且 LSA 从 DR 接收

泛洪的情况

  • 其他所有情况

泛洪机制

LS Update 包

  • 包含一个或多个 LSA
  • 发送到 AllSPFRouters (224.0.0.5) 或单播
  • 需要确认

多个 LSA 打包

  • 减少包数量
  • 提高效率
  • 不超过 MTU

13.4 确认机制 (Acknowledgment)

确认类型

直接确认 (Direct ACK)

  • 单播发送
  • 立即发送
  • 用于 Point-to-Point 和 Point-to-Multipoint

延迟确认 (Delayed ACK)

  • 组播发送到 AllSPFRouters
  • 延迟最多 RxmtInterval/2
  • 多个确认打包
  • 用于广播网络

确认规则

何时发送直接确认

  • LSA 是重复的(数据库已有更新或相同实例)
  • LSA 年龄 = MaxAge 且数据库中没有该实例
  • 在 Exchange 或 Loading 状态接收 LSA

何时发送延迟确认

  • LSA 被安装到数据库
  • LSA 被泛洪到该接口(作为 implied ACK)

确认包格式

  • LS Acknowledge 包
  • 包含 LSA Header(不含 LSA Body)

13.5 重传机制 (Retransmission)

重传列表 (Retransmission List)

每个邻居维护一个列表

  • 包含已发送但未确认的 LSA
  • 按 RxmtInterval 超时重传
  • 收到确认后从列表移除

添加到重传列表

  • 泛洪 LSA 到邻居时
  • 仅在 Full 或更高邻接状态

重传超时

RxmtInterval

  • 默认 5 秒
  • 可配置
  • 超时后重传 LSA

重传条件

  • LSA 仍在数据库中
  • LSA 未被确认
  • 邻居仍在 Full 状态

13.6 泛洪优化 (Flooding Optimizations)

避免重复泛洪

机制

  • 记录从哪个接口接收 LSA
  • 不向源接口泛洪

Implied Acknowledgment

  • 如果邻居泛洪相同 LSA 回来
  • 视为确认
  • 从重传列表移除

打包优化

多 LSA 打包

  • 一个 LS Update 包含多个 LSA
  • 减少包数量
  • 减少开销

延迟确认打包

  • 一个 LS Acknowledge 确认多个 LSA
  • 减少确认包数量

13.7 特殊情况处理 (Special Cases)

MaxAge LSA

接收 MaxAge LSA

  • 如果数据库中没有该实例

    • 立即确认
    • 不安装到数据库
    • 不泛洪
  • 如果数据库中有该实例

    • 安装 MaxAge LSA
    • 泛洪到所有接口
    • 从数据库删除

生成 MaxAge LSA

  • 需要删除自己产生的 LSA 时
  • 设置 LS Age = MaxAge
  • 泛洪到所有接口

自己产生的 LSA

接收到自己的 LSA

  • 比较序列号
  • 如果接收的更新
    • 可能是重启后的旧 LSA
    • 产生新的 LSA 覆盖

接口类型差异

点到点接口

  • 单播发送
  • 直接确认

广播网络

  • DR/BDR 特殊处理
  • 组播发送
  • 延迟确认

NBMA 网络

  • 手动配置邻居
  • 单播发送

13.8 泛洪状态机 (Flooding State Machine)

接口输出队列

每个接口维护

  • 待发送的 LS Update 包列表
  • 按优先级排序
  • 速率控制

发送优先级

  1. 高优先级:MaxAge LSA
  2. 正常优先级:其他 LSA

重传队列

每个邻居维护

  • 待重传的 LSA 列表
  • 按 RxmtInterval 超时
  • 重传时添加到接口输出队列

13.9 泛洪例子 (Flooding Examples)

例子 1:新 LSA 产生

场景

  • 路由器 R1 产生新的 Router-LSA
  • 需要泛洪到所有邻居

步骤

  1. R1 递增序列号
  2. R1 将 LSA 添加到 LSDB
  3. R1 向所有接口泛洪
  4. R1 添加到每个邻居的重传列表
  5. 邻居收到后确认
  6. R1 从重传列表移除

例子 2:LSA 更新传播

场景

  • R2 从 R1 接收更新的 LSA
  • R2 需要继续泛洪

步骤

  1. R2 验证 LSA
  2. R2 比较发现比数据库更新
  3. R2 更新 LSDB
  4. R2 向 R1 发送确认
  5. R2 向除 R1 外的所有邻居泛洪
  6. R2 添加到重传列表

13.10 泛洪可靠性保证 (Reliability Guarantees)

可靠性机制

确认

  • 每个 LSA 必须被确认
  • 超时重传

重传

  • 未确认的 LSA 定期重传
  • 直到收到确认

序列号

  • 检测重复和更新
  • 避免循环

校验和

  • 检测传输错误
  • 保证完整性

收敛保证

最终一致性

  • 所有路由器最终拥有相同 LSDB
  • 即使有链路故障
  • 即使有包丢失

快速收敛

  • LSA 立即泛洪
  • 并行传播
  • 不等待定时器

技术要点总结 (Technical Summary)

关键概念

  1. 可靠泛洪

    • 确认机制保证可靠性
    • 重传机制处理丢包
    • 序列号检测重复
  2. 高效泛洪

    • 避免重复泛洪
    • 打包多个 LSA
    • 延迟确认
  3. 快速收敛

    • 立即泛洪变化
    • 并行传播
    • 不等待定时器

实现要点

接收处理

  • 严格的验证
  • 正确的比较
  • 及时的确认

发送处理

  • 正确的泛洪范围
  • 接口状态检查
  • 重传管理

数据结构

  • 高效的 LSDB 查找
  • 重传列表管理
  • 接口输出队列

性能优化

  • LSA 打包
  • 确认打包
  • 速率控制

泛洪流程图 (Flooding Flowchart)

接收 LSA

验证合法性 → 失败 → 丢弃
↓ 成功
查找 LSDB

比较新旧

┌───────────────┬───────────────┬───────────────┐
更旧/相同 没有该实例 更新
↓ ↓ ↓
发送确认 安装到LSDB 替换旧LSA
↓ ↓ ↓
结束 发送确认 发送确认
↓ ↓
泛洪出去 泛洪出去
↓ ↓
添加重传 添加重传
↓ ↓
重算路由 重算路由

参考资料 (References)


注意 (Note):泛洪机制是 OSPF 可靠性的基础。正确实现泛洪、确认和重传机制对于协议的正确运行至关重要。