13. The Flooding Procedure (泛洪过程)
泛洪是 OSPF 实现链路状态数据库同步的核心机制。本章详细描述 LSA 的泛洪、确认和重传过程。
章节概述 (Chapter Overview)
泛洪过程确保:
- 可靠性:每个 LSA 都被确认
- 高效性:避免重复泛洪
- 一致性:所有路由器拥有相同的 LSDB
- 速度:快速传播拓扑变化
13.1 泛洪基本原理 (Flooding Fundamentals)
核心机制
接收 LSA
- 验证 LSA 合法性
- 检查是否比当前数据库更新
- 安装到 LSDB
- 向除源接口外的所有接口泛洪
- 发送确认
泛洪范围
- 区域内 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):
-
序列号比较
- 较大序列号更新
-
校验和比较
- 序列号相同时
- 较大校验和更新
-
年龄比较
- 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 包列表
- 按优先级排序
- 速率控制
发送优先级
- 高优先级:MaxAge LSA
- 正常优先级:其他 LSA
重传队列
每个邻居维护
- 待重传的 LSA 列表
- 按 RxmtInterval 超时
- 重传时添加到接口输出队列
13.9 泛洪例子 (Flooding Examples)
例子 1:新 LSA 产生
场景
- 路由器 R1 产生新的 Router-LSA
- 需要泛洪到所有邻居
步骤
- R1 递增序列号
- R1 将 LSA 添加到 LSDB
- R1 向所有接口泛洪
- R1 添加到每个邻居的重传列表
- 邻居收到后确认
- R1 从重传列表移除
例子 2:LSA 更新传播
场景
- R2 从 R1 接收更新的 LSA
- R2 需要继续泛洪
步骤
- R2 验证 LSA
- R2 比较发现比数据库更新
- R2 更新 LSDB
- R2 向 R1 发送确认
- R2 向除 R1 外的所有邻居泛洪
- R2 添加到重传列表
13.10 泛洪可靠性保证 (Reliability Guarantees)
可靠性机制
确认
- 每个 LSA 必须被确认
- 超时重传
重传
- 未确认的 LSA 定期重传
- 直到收到确认
序列号
- 检测重复和更新
- 避免循环
校验和
- 检测传输错误
- 保证完整性
收敛保证
最终一致性
- 所有路由器最终拥有相同 LSDB
- 即使有链路故障
- 即使有包丢失
快速收敛
- LSA 立即泛洪
- 并行传播
- 不等待定时器
技术要点总结 (Technical Summary)
关键概念
-
可靠泛洪
- 确认机制保证可靠性
- 重传机制处理丢包
- 序列号检测重复
-
高效泛洪
- 避免重复泛洪
- 打包多个 LSA
- 延迟确认
-
快速收敛
- 立即泛洪变化
- 并行传播
- 不等待定时器
实现要点
接收处理
- 严格的验证
- 正确的比较
- 及时的确认
发送处理
- 正确的泛洪范围
- 接口状态检查
- 重传管理
数据结构
- 高效的 LSDB 查找
- 重传列表管理
- 接口输出队列
性能优化
- LSA 打包
- 确认打包
- 速率控制
泛洪流程图 (Flooding Flowchart)
接收 LSA
↓
验证合法性 → 失败 → 丢弃
↓ 成功
查找 LSDB
↓
比较新旧
↓
┌───────────────┬───────────────┬───────────────┐
更旧/相同 没有该实例 更新
↓ ↓ ↓
发送确认 安装到LSDB 替换旧LSA
↓ ↓ ↓
结束 发送确认 发送确认
↓ ↓
泛洪出去 泛洪出去
↓ ↓
添加重传 添加重传
↓ ↓
重算路由 重算路由
参考资料 (References)
- 完整原文:RFC 2328 Section 13
- 泛洪优化:RFC 4222
注意 (Note):泛洪机制是 OSPF 可靠性的基础。正确实现泛洪、确认和重传机制对于协议的正确运行至关重要。