第68篇:OSPF 邻接震荡典型案例分析

关键词

OSPF、邻接震荡、Flapping、故障排查、链路不稳定、路由抖动


一、什么是邻接震荡?

邻接震荡(Adjacency Flapping) 是指 OSPF 邻居在 Full 状态和其他状态(Down/Init/ExStart)之间频繁切换的现象。

震荡的影响

影响 说明
路由频繁变更 路由表随邻居状态变化而不断更新
CPU 高负载 频繁运行 SPF 计算,消耗路由器 CPU
业务中断 流量在链路切换过程中丢包
全网影响 LSA 泛洪传递到全网,可能引发级联效应

案例一:光模块故障导致邻接震荡

1.1 现象

某企业网络,两台核心交换机之间的 OSPF 邻居每 5~10 分钟 Down 一次,然后重新建立。

# 查看日志
%OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on GE0/0/0 from FULL to DOWN, Neighbor Down: Dead timer expired
%OSPF-5-ADJCHG: Process 1, Nbr 2.2.2.2 on GE0/0/0 from LOADING to FULL, Loading done
# 以上日志每 5 分钟重复出现

1.2 排查过程

# Step 1: 查看接口状态
display interface GigabitEthernet0/0/0
 物理状态: Up         ← 接口是 UP 的
 链路协议: Up

# Step 2: 查看接口错误统计
display interface GigabitEthernet0/0/0
 Input:  CRC: 1250       ← CRC 错误异常高!
         Frame: 0
 Output: CRC: 0

# Step 3: 查看光模块信息
display transceiver interface GigabitEthernet0/0/0
 光功率: -28.5 dBm       ← 光功率过低(正常应在 -15 ~ -3 dBm)
 温度: 65°C             ← 温度偏高

1.3 根因

光模块老化导致光功率不稳定,偶尔出现 CRC 错误包。OSPF Hello 报文恰好被损坏时,对端收不到 Hello → Dead Timer 超时 → 邻居 Down → 很快又恢复。

1.4 解决

# 更换光模块后确认
display transceiver interface GigabitEthernet0/0/0
 光功率: -5.2 dBm        ← 恢复正常
# 邻居状态稳定在 Full

案例二:BFD 误检测导致 OSPF 震荡

2.1 现象

启用 BFD 后,OSPF 邻居开始频繁抖动。

display ospf peer
  Neighbor ID     State     Duration
  2.2.2.2         FULL      00:00:12   ← 刚建立不久
  3.3.3.3         FULL      00:00:15

2.2 排查过程

# Step 1: 查看 BFD 会话状态
display bfd session all
  Local Discr: 8192     State: Down    ← BFD 状态 Down
  Local Discr: 8193     State: Up

# Step 2: 查看 BFD 配置
display bfd configuration
  Min Tx Interval: 10ms        ← BFD 发送间隔 10ms
  Min Rx Interval: 10ms
  Detect Multiplier: 3         ← 检测倍数 3

# Step 3: 检查转发面延迟
# 发现链路存在微突发导致偶尔延迟超过 30ms
# BFD 要求 10ms × 3 = 30ms 内收到应答,但微突发超时

2.3 根因

BFD 参数设置过于激进(10ms 发送间隔),而链路存在微突发导致偶发延迟超标。BFD 误判链路故障,通知 OSPF 断开邻居。

2.4 解决

# 适当增大 BFD 检测间隔
bfd
 interval 50 50 3          # 发送间隔 50ms,检测倍数 3

案例三:MTU 不一致导致周期性震荡

3.1 现象

华为与 Cisco 设备互联,OSPF 邻居建立成功后,每过一段时间(约 30 分钟)重新建立一次。

3.2 排查过程

# 华为端查看 MTU
display interface GE0/0/0 | include MTU
  MTU: 1500

# Cisco 端查看 MTU
show interface GigabitEthernet0/0/0 | include MTU
  MTU: 1400                ← 不一致!

# 华为端(未启用 mtu-enable)
# 华为不检查 MTU,继续发送 DD 报文(大小 1500)
# Cisco 端收到超过 1400 的 DD 报文 → 丢弃 → 周期性重试

3.3 根因

华为设备默认不启用 MTU 检查,Cisco 默认启用。华为发送的 DD 报文大小超过 Cisco 接口 MTU(1400),Cisco 丢弃后收不到回复,导致邻居周期性地重置。

3.4 解决

# 方案 1:统一 MTU(推荐)
# 华为端
interface GE0/0/0
 mtu 1400

# Cisco 端
interface GigabitEthernet0/0/0
 ip mtu 1400

# 方案 2:华为端启用 MTU 检查
interface GigabitEthernet0/0/0
 ospf mtu-enable

案例四:双链路冗余场景的次优路径震荡

4.1 现象

                   ┌──────────┐
        GE0/0/0───│ SwitchA  │───GE0/0/1
      ┌───────────┤          ├────────────┐
      │           └──────────┘            │
   RouterA                             RouterB
      │           ┌──────────┐            │
      └───GE0/0/2─│ SwitchB  │──GE0/0/3──┘
                  └──────────┘

RouterA 和 RouterB 之间有两条链路(通过 SwitchA 和 SwitchB),OSPF 邻居在两条链路之间频繁切换。

4.2 排查

# 查看 RouterA 的 OSPF 邻居
display ospf peer

  Neighbor ID     Interface         State
  2.2.2.2         GE0/0/0           FULL
  2.2.2.2         GE0/0/2           FULL    ← 同一邻居出现在两个接口!

# 查看路由表(同一目的地两条等价路由频繁交替)
display ip routing-table 10.0.1.0
  下一跳频繁在 10.0.12.2 和 10.0.14.2 之间切换

4.3 根因

两条链路后的交换机是同一台物理交换机(实际未被发现),导致 RouterA 通过两个接口与 RouterB 建立了两个邻接。SPF 计算时两条路径 Cost 相同,ECMP 正常工作,但由于某些原因(如其中一个接口微抖动),导致路由表频繁变更。

4.4 解决

# 方案 1:将两条链路做链路聚合
interface Eth-Trunk1
 trunkport GE0/0/0
 trunkport GE0/0/2
# OSPF 只看到一条逻辑链路

# 方案 2:调整 Cost 让一条链路作为备用
interface GE0/0/2
 ospf cost 1000           # 作为备用路径

案例五:重复 Router ID 导致邻居震荡

5.1 现象

两台设备配置了相同的 Router ID,导致邻居建立后立刻断开。

%OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.1 on GE0/0/0 from FULL to DOWN, 
Neighbor Down: Adjacency forced to reset

display ospf peer
  Neighbor ID     Interface         State
  1.1.1.1         GE0/0/0           DOWN

5.2 根因

两台设备的 Router ID 都是 1.1.1.1。OSPF 要求 Router ID 全网唯一。当两台设备发现对方 Router ID 与自己相同时,会主动断开邻接。

5.3 解决

# 修改其中一台的 Router ID
ospf 1
 router-id 2.2.2.2
 reset ospf process

六、邻接震荡的通用排查流程

1. 确认震荡频率
   └─ 高频(秒级)→ BFD 误检测 / 光模块问题
   └─ 中频(分钟级)→ Dead 超时 / MTU 问题
   └─ 低频(小时级)→ LSDB 过大 / 周期性刷新

2. 查看接口错误统计
   └─ CRC 错误多 → 光模块/线缆问题
   └─ 无错误 → 检查 OSPF 配置

3. 查看 OSPF 邻居日志
   └─ Dead timer expired → 链路丢包
   └─ Adjacency forced to reset → Router ID 冲突

4. 查看 BFD 状态(如启用)
   └─ BFD Down → BFD 参数调整

5. 检查两端配置一致性
   └─ Area/Network Type/Auth/MTU/Timer

七、总结

案例 根因 关键排查点
光模块老化 光功率过低 display transceiver
BFD 误检测 BFD 参数过小 display bfd session
MTU 不一致 华为 vs Cisco display mtu
双链路震荡 物理拓扑误判 display ospf peer
Router ID 冲突 配置错误 display ospf brief

八、思考

  1. 如何区分邻接震荡是由光模块问题还是由 BFD 配置问题引起的?
  2. 华为设备与 Cisco 设备互联时,如何避免 MTU 相关的邻居震荡?
  3. 为什么说 OSPF 邻接震荡可能影响全网,而不仅仅是震荡的两台设备?
  4. 在排查邻居震荡时,为什么需要首先查看接口的 CRC 错误统计?
  5. 如果两台路由器通过两条链路互联,OSPF 分别建立了两个邻接,可能会产生什么问题?

下篇预告:第69篇《OSPF 特殊区域——Stub、Totally Stub、NSSA》——理解如何通过特殊区域精简 LSDB。