第15篇:环路是怎么产生的——一次广播风暴故障实录

一、写在前面

在前面的文章中,我们学过交换机的工作原理——未知单播和广播会泛洪到所有端口。这篇要讲的是一个非常严重的网络故障:环路导致广播风暴,全网瘫痪

很多新工程师第一次遇到环路故障时,看到以下现象会一脸懵:

  • 所有灯都在疯狂闪烁
  • 交换机 CPU 100%
  • 任何 ping 都超时
  • 拔掉一根网线就好了

本文用一个真实故障案例,带你完整经历一次广播风暴从发生到修复的全过程。


二、什么是环路?

2.1 物理环路

环路就是网络中出现了冗余连接形成的回路

        [SW1]
       ╱    ╲
      ╱      ╲
    [SW2]───[SW3]
  • SW1↔SW2 一条线
  • SW1↔SW3 一条线
  • SW2↔SW3 一条线

这三条线形成了一个三角形环路。

2.2 为什么会产生环路

原因 说明
冗余设计 为了可靠性,额外拉了备份线(最常见)
误接线 施工人员多插了一根网线
Hub 级联 用 Hub 扩展端口形成环路
WiFi 网桥 无线回传形成意外的二层路径

重要:冗余本身不是坏事,问题在于没有 STP 保护的二层环路。


三、环路导致广播风暴的机制

3.1 单播泛洪引发环路

假设 SW1→SW2 和 SW1→SW3 两条链路都连通,没有启用 STP

PC-A(接 SW1)发一个帧给 PC-B(接 SW2):

第 1 次:
SW1 从端口 1 收到 PC-A 的帧(目的 MAC=B,未知)
→ 泛洪到所有其他端口(端口 2 和 3)
→ SW2 通过端口 1 收到这个帧
→ SW3 通过端口 1 也收到这个帧

第 2 次:
SW2 收到帧 → 学习 MAC=A → 泛洪到其他端口
                → 发到 SW3(端口 2)
SW3 收到帧 → 学习 MAC=A → 泛洪到其他端口
                → 发到 SW2(端口 2)

第 3 次:
SW2 从 SW3 又收到同一个帧...
SW3 从 SW2 又收到同一个帧...

同一个帧在网络中无限循环,永不停止!

3.2 广播风暴

如果发送的是广播帧(比如 ARP 请求),情况更严重:

1 个广播帧进入环路
    │
    ▼
SW1 泛洪 → SW2 和 SW3 各收到 1 份
    │
    ▼
SW2 泛洪 → SW1 和 SW3 各收到 1 份(重复的)
SW3 泛洪 → SW1 和 SW2 各收到 1 份(重复的)
    │
    ▼
SW1 又泛洪 → 2 份出去...
SW2 又泛洪 → 2 份出去...
SW3 又泛洪 → 2 份出去...
    │
    ▼
每一轮翻倍 → 指数级增长

现象:交换机所有端口的灯像"跑马灯"一样疯狂闪烁。


四、故障实录——某公司机房实录

4.1 故障背景

某公司 IT 接到投诉:公司全网不能上网,内部文件服务器也无法访问。

4.2 故障现象

IT 进机房看到:

观察项 现象
交换机端口灯 所有端口灯极速闪烁,几乎没有停顿
交换机 CPU 通过 Console 查看:CPU 99%,被中断占用
PC 侧 任何 ping 都超时
拔掉某条线 故障立刻消失,插回去故障又复现

4.3 排查过程

# 步骤 1:登录交换机,发现 CPU 异常
<SW1> display cpu-usage
CPU Usage: 99%    ← 异常高

# 步骤 2:查看什么占用了 CPU
<SW1> display cpu-usage service
Broadcast / Multicast / Unknown unicast: 85%   ← 广播泛洪消耗了 CPU

# 步骤 3:看端口流量
<SW1> display interface gigabitethernet 0/0/1
Input: 125000 packets/sec ← 远超正常值
Output: 130000 packets/sec

<SW1> display interface gigabitethernet 0/0/2
Input: 128000 packets/sec ← 同样异常高

# 步骤 4:看 MAC 地址表——MAC 漂移
<SW1> display mac-address flapping record
------------------------------------------------------------------
MAC Address      VLAN  Original-Port   Current-Port   Time
------------------------------------------------------------------
00e0-fc00-0001   1     GE0/0/1         GE0/0/2        2025-07-29 14:32:15
00e0-fc00-0001   1     GE0/0/2         GE0/0/1        2025-07-29 14:32:16
00e0-fc00-0001   1     GE0/0/1         GE0/0/2        2025-07-29 14:32:16
------------------------------------------------------------------

MAC 地址在 1 秒内多次在不同端口之间"飘移"——这是环路的典型标志

4.4 根因确认

检查布线时发现:

机房机柜整理时,一位同事把交换机 SW1 和 SW2 之间多插了一根网线
(原本已经有 1 根,又多接了 1 根,形成了环路)

SW1 ──线1── SW2  ← 原来的
SW1 ──线2── SW2  ← 新接的(环路!)

两条线连在同一个交换机之间,形成一个最直接的环路

4.5 解决

临时方案:拔掉多余的那根线,全网恢复。

永久方案

# 在交换机上启用 STP(生成树协议)
[SW1] stp enable
[SW2] stp enable
[SW3] stp enable

启用 STP 后,即使接了冗余链路,STP 会逻辑阻塞其中一个端口,环路被消除。


五、环路故障的特征识别

如果你遇到以下现象的组合,高度怀疑环路

特征 描述
端口灯狂闪 所有端口或成片端口指示灯同时高速闪烁
CPU 高 CPU 被广播/未知单播处理占用(>80%)
MAC 漂移 display mac-address flapping 看到 MAC 在不同端口跳动
拔线恢复 拔掉某条线后故障消失,插回去又出现
丢包 100% ping 全部超时,但拔线后立刻恢复
带宽爆满 端口流量远高于正常水平(可能接近端口线速)

六、防范环路的措施

6.1 必须启用 STP/RSTP/MSTP

# 全局启用 STP
[SW1] stp enable

# 启用 BPDU 保护——防止端口收到 BPDU 导致环路
[SW1] stp bpdu-protection

# 对连接 PC 的端口开启边缘端口 + BPDU 保护
[SW1-GigabitEthernet0/0/1] stp edged-port enable
[SW1-GigabitEthernet0/0/1] stp bpdu-filter enable

6.2 Loop Detection(环路检测)

华为交换机支持 Loop Detection 功能,发现环路后自动关闭端口:

[SW1] loop-detection enable
[SW1-GigabitEthernet0/0/1] loop-detection enable
[SW1-GigabitEthernet0/0/1] loop-detection action shutdown

6.3 布线规范

  • 冗余链路必须提前规划,不能随意多插线
  • 机柜配线架上做好标签
  • 施工完成后做一次端口扫描,确认无冗余环路

七、思考

  1. 为什么同一个帧在环路中会无限循环?用交换机的泛洪机制解释。
  2. 广播风暴和环路是什么关系?是环路导致了风暴,还是风暴导致了环路?
  3. 为什么环路故障中 MAC 地址表会出现"漂移"?
  4. 环路故障中,为什么拔掉一根网线就恢复了?
  5. 冗余设计和环路有什么区别?怎么做到既有冗余又不环路?
  6. 一台交换机 CPU 80% 以上、端口灯全闪,你的第一步排查命令是什么?

下篇预告:第16篇《STP生成树协议原理_根桥根端口指定端口选举》——掌握STP生成树协议的根桥、根端口和指定端口的选举机制。