第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 布线规范
- 冗余链路必须提前规划,不能随意多插线
- 机柜配线架上做好标签
- 施工完成后做一次端口扫描,确认无冗余环路
七、思考
- 为什么同一个帧在环路中会无限循环?用交换机的泛洪机制解释。
- 广播风暴和环路是什么关系?是环路导致了风暴,还是风暴导致了环路?
- 为什么环路故障中 MAC 地址表会出现"漂移"?
- 环路故障中,为什么拔掉一根网线就恢复了?
- 冗余设计和环路有什么区别?怎么做到既有冗余又不环路?
- 一台交换机 CPU 80% 以上、端口灯全闪,你的第一步排查命令是什么?
下篇预告:第16篇《STP生成树协议原理_根桥根端口指定端口选举》——掌握STP生成树协议的根桥、根端口和指定端口的选举机制。