一根网线插错口,整栋楼交换机灯集体“蹦迪”


一、开场:一根网线两头都插交换机,整栋楼“瘫痪”了

那天甲方办公区突然集体断网,我冲进弱电间一看,一排交换机的指示灯全在疯狂同步闪烁,像在“蹦迪”,CPU 直接拉满,Console 都卡得敲不动字。

赶紧断开几根线,网络才慢慢缓过来。顺藤摸瓜,发现工位上有个员工嫌自己座位网口不够,把一根网线的两头都插进了墙上的两个面板(这两个口最终在同一台交换机上),硬生生造出一个环。

这就是典型的二层环路。交换机一旦有环,广播帧就会在环里无限循环、越积越多,形成广播风暴,把整网带宽和 CPU 吃光。

可问题是,做冗余又确实需要“两条路”——主链路断了,备用链路得顶上。又要冗余、又不能有环,怎么破?

靠生成树协议(STP):它允许你物理上接成环,然后自动逻辑上阻塞掉一些端口,让网络在任何时刻都呈现为一棵“没有环的树”;主链路一断,它再把堵住的口放开,实现备份。

这一课讲清楚:环路为什么炸、STP 怎么选根桥、端口有哪些角色和状态、默认收敛要多久,以及根桥被“抢走”了怎么看。


二、环路为什么会炸:广播帧绕圈

先回答一个问题:好好的为什么要接成环?

因为要高可用。园区网里,接入交换机到核心如果只有一根线,这根线被碰松、端口老化、光纤被挖断,整台交换机下的人就全断了。为了让单条链路故障不影响业务,通常会接两条——主用走核心、备用走另一台汇聚,主断了备顶上。

冗余是刚需,可“两条路”在二层看来就是环。所以不能简单地“不接环”,而是要“接了环、再用生成树把它管住”。这是理解 STP 一切设计的前提:它不是为了阻止冗余,而是为了让冗余安全地存在。

1. 类比:回音壁和镜子迷宫

  • 你在一个四面都是镜子的房间里喊一声,声音在墙壁之间来回反射,越叠越响、停不下来;
  • 二层环路里的广播帧就是这样:交换机收到广播要从除入端口外所有口转发,而环上每台都这么干,同一个广播帧就在环里一圈一圈永远转下去,数量指数级增长;
  • 同时还会引发 MAC 地址表漂移:同一个 MAC 一会儿从这个口学到、一会儿从那个口学到,交换机自己都乱了。

2. 生成树:堵住冗余口

图1:三台交换机连成环,广播帧绕圈引发风暴;生成树把其中一个端口阻塞,环路被切断成无环的树

STP 的思路很朴素:

  • 物理上你尽管接成环(为了冗余);
  • 它通过计算,把某些端口置为阻塞状态(只收特殊协议报文、不转发业务数据),逻辑上把环“砍”成一条链;
  • 活动链路故障时,阻塞端口自动重新放开,接替转发——既无环、又有备份。

三、根桥选举:先选出“以谁为中心”

1. 类比:选举“公司总部”

一棵树得有根。STP 先在所有交换机里选出唯一一台根桥(Root Bridge),整棵树都以它为中心来“长”。

  • 选举靠交换 BPDU(桥协议数据单元),可以理解成选举时互发的“名片”,上面写着自己的桥 ID;
  • 桥 ID = 桥优先级 + 桥 MAC,谁的桥 ID 小,谁当根;
  • 先比优先级(默认为 32768,可改),优先级相同再比 MAC,MAC 小的赢。

多问一句:BPDU 多久发一次?

BPDU 由根桥周期性发出(默认 Hello 时间 2 秒),沿拓扑逐跳传递,每台交换机据此知道根桥是谁、自己离根多远、端口该是什么角色。如果一段时间(默认 Max Age 20 秒)收不到根桥的 BPDU,就认为根桥或链路出了问题,开始重新计算。这几个计时器(Hello 2 秒、Forward Delay 15 秒、Max Age 20 秒)共同决定了 STP 的收敛速度,也是“30~50 秒”的来源。

顺带说个细节:桥优先级为什么建议设成 4096 的倍数?因为在支持多 VLAN 的 PVST/MSTP 里,桥 ID 里还藏了一个扩展字段(VLAN 或实例号),优先级实际被拆成“高位优先级 + 低位实例号”,步进是 4096。所以设 4096、8192 这种值最稳妥,乱设中间值可能被设备自动规整。

2. 端口角色:谁转发、谁阻塞

图2:根桥在顶,根端口、指定端口转发,冗余链路上的一个端口被阻塞

选出根桥后,每台交换机的端口有三种角色:

端口角色含义是否转发
根端口 RP非根桥上离根桥最近的端口(每台非根桥一个)转发
指定端口 DP每条链路上离根桥更近那一端的端口,负责向该网段转发转发
阻塞端口 AP既不是根端口也不是指定端口,被堵住不转发

一句话记:根端口朝根、指定端口朝网段,剩下的堵上。最终全网只有“根端口 + 指定端口”在转发,恰好构成无环拓扑。

3. 端口状态:一个端口怎么“转正”

图3:STP 端口从禁用、侦听、学习到转发,侦听和学习各 15 秒

为了防止临时环路,STP 端口从“不转发”到“转发”要经过几个状态:

状态是否转发数据是否学习 MAC停留
禁用 Disabled否否人工关闭
侦听 Listening否否15 秒
学习 Learning否是(先学 MAC)15 秒
转发 Forwarding是是最终
  • 侦听阶段先“听 BPDU、判断自己该是什么角色”,确认没问题再进学习;
  • 学习阶段先把 MAC 地址学起来,最后才真正转发,避免一上来就泛洪。

4. 收敛时间

  • 一个端口从接通到正常转发,默认要经过侦听 15 秒 + 学习 15 秒,约 30 秒;
  • 若涉及直连/间接链路故障,等待最长老化(Max Age 20 秒)后再走一遍,整体可达 30~50 秒;
  • 这几十秒里,该端口上的业务是断的——这也是经典 STP 最被诟病的“慢”,下一课的 RSTP 主要就是来解决这个问题。

四、命令落点:固定根桥(华为 VRP)

1. 开启 STP 并固定根桥(完整链路)

<SW> system-view
[SW] stp enable
[SW] stp mode stp                    # 经典STP,也可设rstp/mstp
[SW] stp root primary               # 核心交换机设为根桥(自动调优先级)
[SW] stp root secondary             # 备用核心设为次根,主根断了接替

也可以直接改优先级(数值越小越优先,须为 4096 的倍数):

[SW] stp priority 4096

2. 终端口设为边缘端口

[SW] interface GigabitEthernet 0/0/10
[SW-GigabitEthernet0/0/10] stp edged-port enable    # 接电脑/终端,不参与STP计算

边缘端口接的是终端、不会形成环,启用后直接进入转发,不用等 30 秒;一旦误接了交换机、收到 BPDU,会自动变回普通 STP 端口。RSTP 边缘端口下一课详讲。

为什么设了边缘端口,还要配 BPDU 防护?

边缘端口“直接转发”是基于一个假设:它接的是电脑、不会发 BPDU。可万一这个口被人插了一根线、接上了另一台交换机,假设立刻被打破——这台交换机可能引入环路,甚至抢根。开了 BPDU 防护,边缘端口一旦收到 BPDU,就自动把口关闭(或退回普通端口),把风险掐死在门口。所以边缘端口和 BPDU 防护是一对,前者省时间、后者保安全,接入口规划时一起配。

3. 验证根桥

<SW> display stp

正常回显(关键看根桥是不是自己、优先级):

======= STP Global Config Info =======
Mode: STP
CIST Bridge: 4096  .4c1f-cc12-3456
CIST Root/ERPC: 4096  .4c1f-cc12-3456 / 0     # 根桥就是自己,ERPC为0

看哪个端口被阻塞:

<SW> display stp brief
PortID   Role        State
G0/0/1   ROOT        FORWARDING
G0/0/2   DESI        FORWARDING
G0/0/3   ALTE        DISCARDING      # 被阻塞的冗余口

4. 根桥被抢走了怎么办

  • 现象:本该是核心的交换机灯狂闪、网络拓扑异常,display stp 发现根桥是一台新接入的交换机;
  • 原因:新交换机默认优先级也是 32768,若它 MAC 更小,或被人改了优先级,就可能“抢”走根桥;
  • 处理:在核心上 stp root primary(或优先级设 4096)把根桥固定,接入层可结合 BPDU 防护,防止终端口收到/发送 BPDU。

环路现场处置流程

交换机灯集体狂闪

断开冗余线先恢复业务

排查私接网线和两端口

核心固定根桥

终端口设边缘端口

接入开BPDU防护

5. 异常与排查

现象命令看到什么判断动作
交换机灯集体狂闪看端口/CPU广播风暴、CPU 满环路断开冗余线、查私接
根桥被抢display stp根是新设备优先级/MAC 问题核心固定根、接入口防护
接电脑要等 30 秒看端口状态走侦听学习非边缘端口设 stp edged-port
主链路断了没切看 STP阻塞口没放开STP 未开/异常确认全网 STP 开启
业务周期性中断看端口端口反复 Up/Down链路抖动致 STP 震荡换线、查物理、收敛参数

思科对照

动作华为 VRP思科 IOS
开生成树stp enable默认开启(PVST)
选模式stp mode stpspanning-tree mode pvst
设根桥stp root primaryspanning-tree vlan 1 root primary
改优先级stp priority 4096spanning-tree vlan 1 priority 4096
边缘端口stp edged-port enablespanning-tree portfast
看状态display stp briefshow spanning-tree

五、🔧 运维视角 & 📐 设计视角

🔧 运维视角:

  • 灯集体狂闪、全网卡,先断冗余线、查私接,环路是头号嫌疑;
  • 根桥一定在核心上固定,别让它“默认选举”,否则哪天接台小交换机就乱;
  • 接电脑的口都设边缘端口,省得每次开机等 30 秒。

📐 设计视角:

  • 核心设主根、备用核心设次根,形成确定性的根桥位置和转发路径;
  • 冗余链路要明确“哪条主用、哪条备用”,并核算阻塞后实际带宽是否够用;故障演练时要实际验证切换是否符合预期,别只停留在图纸上。
  • 终端口统一规划边缘端口 + BPDU 防护,接入层禁止私接交换机。

六、小结与命令速查表

  • 二层环路导致广播帧绕圈、MAC 表漂移,引发广播风暴;
  • STP 物理接环、逻辑阻塞,既无环又有冗余;
  • 根桥靠桥 ID(优先级+MAC)选举,ID 小者为根;
  • 端口角色:根端口、指定端口转发,阻塞端口不转发;
  • 端口状态:禁用、侦听、学习、转发,默认收敛约 30~50 秒。

本篇命令速查表(华为 VRP):

目的华为命令思科对照
开启 STPstp enable默认开启
选模式stp mode stpspanning-tree mode
设根桥stp root primaryspanning-tree root primary
设次根stp root secondaryspanning-tree root secondary
改优先级stp priority 4096spanning-tree priority
边缘端口stp edged-port enablespanning-tree portfast
看全局display stpshow spanning-tree
看端口display stp briefshow spanning-tree summary

七、思考题 & 评论区接招

💬 考你两道(评论区接招):

1)一台交换机刚接上网线,默认要过多久才能真正转发数据?这 30 秒里它在等什么?
2)你发现网络里的根桥不是核心交换机,而是一台刚接入的小交换机——为什么会这样?你会敲哪条命令把根桥固定回核心?
把你的答案和会用的命令写在评论区,我来点评。答得上来,说明你真懂“根桥被谁抢走了”。


系列导航:

我是你们的老网工。这一课把环路和经典 STP 讲清楚了,可它“一断网要等 30 秒”的毛病,在很多业务里是不能接受的。下一课《RSTP/MSTP》,我们聊聊 RSTP 怎么把收敛从几十秒压到秒级,以及多个 VLAN 时,MSTP 怎么让不同 VLAN 走不同的链路、把冗余带宽真正利用起来。下一课见。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐