ospfv3部分路由丢失问题定位及处理
OSPFv3 部分路由丢失问题定位分析
1. 问题背景
在实现和调试 OSPFv3 路由功能时,遇到一个比较隐蔽的问题:
当新增一个 OSPFv3 邻居设备后,部分设备出现 边界路由器(ASBR)丢失,同时依赖该边界路由器学习到的外部路由也同步消失。
该问题只在特定拓扑下触发,初步判断与 OSPFv3 的 SPF 计算、区域边界路由器(ABR)处理以及外部路由更新流程有关。
2. 网络拓扑
Backbone Area
SW1 ---------------- SW2
||
||
Non-Backbone Area
FW1 / FW2
拓扑说明:
-
SW1、SW2:
- 启用 OSPFv3
- 同属于 Backbone Area(Area 0)
-
SW2、FW1、FW2:
- 同属于非骨干区域
-
四台设备均进行了路由重发布:
- 生成外部路由(Type-5 LSA)
- 存在 ASBR 角色
特殊情况:
- FW1 与 FW2 二层不可达
- 但是通过 SW2 共享 OSPFv3 LSDB
- FW1、FW2 可以学习到相同的区域拓扑信息
3. 问题现象
初始状态:
SW1
|
|
SW2
|
+---- FW1
|
+---- FW2
FW1、FW2 均能够正常学习:
- Area 内 Router LSA
- Network LSA
- Inter-Area-Prefix-LSA
- AS External LSA
同时可以看到 SW1 的边界路由器信息。
当启动 FW1 的 OSPFv3 后:
异常出现:
FW2:
- SPF计算完成
- LSDB中仍然存在相关 LSA
但是:
show ospfv3 border-router
发现:
SW1 对应的边界路由器消失。
同时:
依赖该 ASBR 的外部路由:
Type-5 LSA
↓
ASBR
↓
External Route
也从 RIB 中删除。
表现为:
- 边界路由器丢失
- 外部路由消失
4. 初步定位过程
通过抓包以及调试 SPF 计算流程发现:
LSDB 是完整的。
例如:
Type-4 LSA
存在:
Link State ID:
ASBR Router-ID
Advertising Router:
ABR Router-ID
表示:
ABR 已经正确通告 ASBR 可达信息。
Type-5 LSA
存在:
AS External LSA
Advertising Router:
ASBR Router-ID
表示:
外部路由仍然存在。
因此排除:
- LSA丢失
- LSA老化
- 邻居异常
- 数据库同步失败
问题集中在:
SPF计算完成后的边界路由器处理逻辑。
5. 根因分析
5.1 SPF完整性检查导致错误删除
代码中存在如下逻辑:
SPF计算完成
|
|
检查SPF Tree是否完整
|
|
如果不完整
|
|
删除所有Border Router
|
|
删除依赖的外部路由
也就是说:
只要 SPF Tree 被认为“不完整”,代码会认为:
当前拓扑无法保证边界路由器可达,因此清空所有ABR/ASBR计算结果。
但是这个处理方式存在问题。
6. RFC行为分析
根据 OSPFv3 RFC 规定:
SPF计算的目标是:
根据LSDB计算当前可达拓扑,并生成最短路径树。
其中:
- SPF Tree 是一个计算结果
- Border Router 是 SPF Tree 中可达节点
并不是:
SPF Tree必须完整,否则所有边界路由器失效。
实际情况:
如果某个节点无法加入 SPF Tree:
应该:
- 删除该节点相关路径
而不是:
- 删除整个边界路由器数据库。
例如:
SPF Tree:
SW2
|
FW2
FW1
X
如果 FW1 不可达:
正确处理:
保留:
SW2
|
FW2
对应的Border Router
删除:
FW1相关路径
而不是:
删除全部Border Router
7. 第二个问题:LSA更新没有触发Border Router重新计算
进一步分析发现:
收到新的:
Type-4 LSA
或者:
Type-5 LSA
流程:
Receive LSA
|
|
Update LSDB
|
|
Flood
|
|
结束
但是缺少:
LSA Update
|
|
重新检查ASBR/ABR
|
|
更新Border Router
|
|
重新计算External Route
|
|
更新RIB
导致:
即使 LSDB 已经包含正确的信息:
内部维护的 Border Router 表仍然是旧状态。
最终表现:
LSDB正确
↓
SPF Tree正确
↓
Border Router数据库错误
↓
External Route缺失
8. 最终问题总结
该问题实际上由两个BUG共同导致:
BUG 1:错误的SPF完整性判断
错误逻辑:
SPF Tree != Complete
↓
删除所有Border Router
↓
删除所有外部路由
正确逻辑:
SPF Tree计算完成
↓
检查每个节点可达性
↓
仅删除不可达节点相关路径
↓
保留有效Border Router
BUG 2:LSA更新流程缺少Border Router刷新
收到:
- Type-4 LSA
- Type-5 LSA
应该触发:
LSDB Update
↓
Border Router Check
↓
ASBR Reachability Calculation
↓
External Route Calculation
↓
RIB Update
否则:
LSDB 和 SPF计算结果不一致。
9. 修复方案
修改1:调整SPF Tree完整性判断
修改前:
if (!spf_tree_complete)
{
delete_all_border_router();
delete_external_route();
}
修改后:
spf_calculate();
for(each border_router)
{
if(border_router reachable)
{
keep();
}
else
{
remove();
}
}
update_external_route();
原则:
SPF树局部不完整,不影响已经确认可达的边界路由器。
修改2:增加LSA触发机制
针对:
Type-4 LSA
增加:
lsa4_receive()
|
|
update_asbr_reachability()
|
|
refresh_border_router()
|
|
calculate_external_route()
Type-5 LSA
增加:
lsa5_receive()
|
|
find_asbr()
|
|
check_border_router()
|
|
install_route()
10. 修复后的验证结果
重新测试:
拓扑:
SW1
|
SW2
|
+----FW1
|
+----FW2
启动 FW1:
结果:
FW2:
Border Router:
SW1 Active
外部路由:
AS External Route:
Installed
同时:
- SPF Tree保持稳定
- LSDB同步正常
- RIB正常更新
问题消失。
11. 总结
本次问题本质不是 OSPFv3 协议本身的问题,而是实现过程中对 RFC 语义理解偏差导致。
核心错误:
-
错误认为 SPF Tree 必须完整才能保留 Border Router
实际:
SPF只需要保证当前计算节点的有效性,不应该因为局部拓扑异常删除全部边界信息。
-
LSA更新没有驱动边界路由器重新计算
OSPF状态维护不仅依赖LSDB,还依赖:
LSDB ↓ SPF Tree ↓ Border Router Table ↓ Route Calculation ↓ RIB
任何一层没有同步,都会造成:
LSDB正常,但是路由异常。

浙公网安备 33010602011771号