在 OSPF 这种基于链路状态(Link-State)的协议中,LSDB(链路状态数据库)的一致性是算法运行的基础。一旦不同路由器的 LSDB 同步出现偏差,SPF 计算就会得出完全不同的路径,进而导致环路或流量黑洞。
为了保证全网 LSDB 的 强一致性 ,OSPF 设计了 MaxAge(生存时间) 、Checksum(校验和) 与 LSAck(确认机制) 三位一体的保障机制。
1. Checksum:确保 LSA “内容”的完整性
Checksum(校验和)用于检测 LSA 在传输或存储过程中是否发生了位错误。
- 计算范围: Checksum 涵盖了除了
LS Age字段以外的所有 LSA 头部及数据内容(因为LS Age在传输过程中是动态变化的,不能参与校验)。 - 周期性校验: 路由器每隔 10 分钟 会对 LSDB 中的每一条 LSA 进行一次 Checksum 验证。
- 触发同步: 如果路由器发现某条 LSA 的校验和失效,它会立即从 LSDB 中删除该 LSA,并向邻居请求最新的 LSA 副本。
2. MaxAge 与 LS Refresh:确保 LSA 的“时效性”
OSPF 并不是一个完全触发更新的协议,它具备周期性刷新机制来防止数据库条目过时或僵死。
- LS Age(生存时间): * LSA 被产生时,
LS Age为 0。- 在 LSDB 中存储时,该值每秒加 1;在链路上传输时,会增加一个
InfTransDelay。
- 在 LSDB 中存储时,该值每秒加 1;在链路上传输时,会增加一个
- LSRefreshTime (1800s/30min): LSA 的始发路由器每 30 分钟会重新生成一个新的序列号(Sequence Number)并泛洪该 LSA。
- MaxAge (3600s/60min): * 如果一条 LSA 的
LS Age达到了 3600s 且没有收到刷新报文,说明该 LSA 已失效,路由器会将其从 LSDB 中剔除。- 强制删除机制: 当 ABR/ASBR 想要主动删除一条 LSA 时(例如接口断开),它会故意将该 LSA 的
LS Age设置为 MaxAge 并泛洪。邻居收到后,会通过这个特殊的 Age 值立即从数据库中清除该条目,而不是等待其自然超时。
- 强制删除机制: 当 ABR/ASBR 想要主动删除一条 LSA 时(例如接口断开),它会故意将该 LSA 的
3. LSAck:确保 LSA “传递”的可靠性
由于 OSPF 直接封装在 IP 报文(协议号 89)之上,没有 TCP 这种可靠传输层支持,因此必须在应用层实现自己的确认机制。
- 显式确认 (Explicit Acknowledgment): 路由器接收到 LSU (Link State Update) 后,会返回一个 LSAck 报文,其中包含接收到的 LSA 头部信息,告知发送方:“我已经收到了这部分更新”。
- 隐式确认 (Implicit Acknowledgment): 在多路访问网络中,如果 DR 发送了一个更新,收到的路由器反馈了相同的 LSA 信息给 DR(通过 LSU),这也可以被视为一种确认。
- 重传定时器 (RxmtInterval): 如果发送方在指定时间内(默认 5s)没有收到 LSAck,会重新发送 LSU 报文,直到收到确认为止。
4. 三者协同:LSDB 同步的逻辑链路
我们可以通过一个 LSA 更新的生命周期来串联这三个机制:
- 触发: 链路状态变化,产生新 LSA(
LS Age=0,Seq++,Checksum已计算)。 - 传输: 通过 LSU 泛洪,接收方收到后校验 Checksum 。
- 若校验失败:丢弃,不返回确认。
- 若校验成功:对比序列号。若序列号更新,则更新 LSDB 并返回 LSAck 。
- 存储: LSA 驻留在 LSDB 中,LS Age 递增。
- 若达到 1800s:始发者执行 LS Refresh 。
- 若达到 3600s:该条目被认定为 MaxAge ,从数据库清除并全网泛洪。
5. HCIE 深度考点:序列号与校验和的溢出处理
作为专家,你可能还会遇到两种极端情况:
- 序列号回绕: OSPF 采用的是线性序列号空间($0x80000001$ 到 $0x7FFFFFFF$)。如果序列号达到了最大值,始发路由器会将该 LSA 置为 MaxAge 提前让其失效,然后重新从起始值开始计数。
- Checksum 错误攻击: 如果由于内存损坏或恶意攻击导致 LSA 头部 Checksum 错误,路由器会通过泛洪一条 MaxAge LSA 来清除这种错误的拓扑信息,触发全网重新同步。
这一套机制保证了 OSPF 在大规模、不稳定网络环境下的鲁棒性。