组网第29课:生成树 STP——环路、BPDU、根桥选举与端口角色
一根网线插错口,整栋楼交换机灯集体“蹦迪”
文章目录
一、开场:一根网线两头都插交换机,整栋楼“瘫痪”了
那天甲方办公区突然集体断网,我冲进弱电间一看,一排交换机的指示灯全在疯狂同步闪烁,像在“蹦迪”,CPU 直接拉满,Console 都卡得敲不动字。
赶紧断开几根线,网络才慢慢缓过来。顺藤摸瓜,发现工位上有个员工嫌自己座位网口不够,把一根网线的两头都插进了墙上的两个面板(这两个口最终在同一台交换机上),硬生生造出一个环。
这就是典型的二层环路。交换机一旦有环,广播帧就会在环里无限循环、越积越多,形成广播风暴,把整网带宽和 CPU 吃光。
可问题是,做冗余又确实需要“两条路”——主链路断了,备用链路得顶上。又要冗余、又不能有环,怎么破?
靠生成树协议(STP):它允许你物理上接成环,然后自动逻辑上阻塞掉一些端口,让网络在任何时刻都呈现为一棵“没有环的树”;主链路一断,它再把堵住的口放开,实现备份。
这一课讲清楚:环路为什么炸、STP 怎么选根桥、端口有哪些角色和状态、默认收敛要多久,以及根桥被“抢走”了怎么看。
二、环路为什么会炸:广播帧绕圈
先回答一个问题:好好的为什么要接成环?
因为要高可用。园区网里,接入交换机到核心如果只有一根线,这根线被碰松、端口老化、光纤被挖断,整台交换机下的人就全断了。为了让单条链路故障不影响业务,通常会接两条——主用走核心、备用走另一台汇聚,主断了备顶上。
冗余是刚需,可“两条路”在二层看来就是环。所以不能简单地“不接环”,而是要“接了环、再用生成树把它管住”。这是理解 STP 一切设计的前提:它不是为了阻止冗余,而是为了让冗余安全地存在。
1. 类比:回音壁和镜子迷宫
- 你在一个四面都是镜子的房间里喊一声,声音在墙壁之间来回反射,越叠越响、停不下来;
- 二层环路里的广播帧就是这样:交换机收到广播要从除入端口外所有口转发,而环上每台都这么干,同一个广播帧就在环里一圈一圈永远转下去,数量指数级增长;
- 同时还会引发 MAC 地址表漂移:同一个 MAC 一会儿从这个口学到、一会儿从那个口学到,交换机自己都乱了。
2. 生成树:堵住冗余口

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. 端口角色:谁转发、谁阻塞

选出根桥后,每台交换机的端口有三种角色:
| 端口角色 | 含义 | 是否转发 |
|---|---|---|
| 根端口 RP | 非根桥上离根桥最近的端口(每台非根桥一个) | 转发 |
| 指定端口 DP | 每条链路上离根桥更近那一端的端口,负责向该网段转发 | 转发 |
| 阻塞端口 AP | 既不是根端口也不是指定端口,被堵住 | 不转发 |
一句话记:根端口朝根、指定端口朝网段,剩下的堵上。最终全网只有“根端口 + 指定端口”在转发,恰好构成无环拓扑。
3. 端口状态:一个端口怎么“转正”

为了防止临时环路,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。
环路现场处置流程
5. 异常与排查
| 现象 | 命令 | 看到什么 | 判断 | 动作 |
|---|---|---|---|---|
| 交换机灯集体狂闪 | 看端口/CPU | 广播风暴、CPU 满 | 环路 | 断开冗余线、查私接 |
| 根桥被抢 | display stp | 根是新设备 | 优先级/MAC 问题 | 核心固定根、接入口防护 |
| 接电脑要等 30 秒 | 看端口状态 | 走侦听学习 | 非边缘端口 | 设 stp edged-port |
| 主链路断了没切 | 看 STP | 阻塞口没放开 | STP 未开/异常 | 确认全网 STP 开启 |
| 业务周期性中断 | 看端口 | 端口反复 Up/Down | 链路抖动致 STP 震荡 | 换线、查物理、收敛参数 |
思科对照
| 动作 | 华为 VRP | 思科 IOS |
|---|---|---|
| 开生成树 | stp enable | 默认开启(PVST) |
| 选模式 | stp mode stp | spanning-tree mode pvst |
| 设根桥 | stp root primary | spanning-tree vlan 1 root primary |
| 改优先级 | stp priority 4096 | spanning-tree vlan 1 priority 4096 |
| 边缘端口 | stp edged-port enable | spanning-tree portfast |
| 看状态 | display stp brief | show spanning-tree |
五、🔧 运维视角 & 📐 设计视角
🔧 运维视角:
- 灯集体狂闪、全网卡,先断冗余线、查私接,环路是头号嫌疑;
- 根桥一定在核心上固定,别让它“默认选举”,否则哪天接台小交换机就乱;
- 接电脑的口都设边缘端口,省得每次开机等 30 秒。
📐 设计视角:
- 核心设主根、备用核心设次根,形成确定性的根桥位置和转发路径;
- 冗余链路要明确“哪条主用、哪条备用”,并核算阻塞后实际带宽是否够用;故障演练时要实际验证切换是否符合预期,别只停留在图纸上。
- 终端口统一规划边缘端口 + BPDU 防护,接入层禁止私接交换机。
六、小结与命令速查表
- 二层环路导致广播帧绕圈、MAC 表漂移,引发广播风暴;
- STP 物理接环、逻辑阻塞,既无环又有冗余;
- 根桥靠桥 ID(优先级+MAC)选举,ID 小者为根;
- 端口角色:根端口、指定端口转发,阻塞端口不转发;
- 端口状态:禁用、侦听、学习、转发,默认收敛约 30~50 秒。
本篇命令速查表(华为 VRP):
| 目的 | 华为命令 | 思科对照 |
|---|---|---|
| 开启 STP | stp enable | 默认开启 |
| 选模式 | stp mode stp | spanning-tree mode |
| 设根桥 | stp root primary | spanning-tree root primary |
| 设次根 | stp root secondary | spanning-tree root secondary |
| 改优先级 | stp priority 4096 | spanning-tree priority |
| 边缘端口 | stp edged-port enable | spanning-tree portfast |
| 看全局 | display stp | show spanning-tree |
| 看端口 | display stp brief | show spanning-tree summary |
七、思考题 & 评论区接招
💬 考你两道(评论区接招):
1)一台交换机刚接上网线,默认要过多久才能真正转发数据?这 30 秒里它在等什么?
2)你发现网络里的根桥不是核心交换机,而是一台刚接入的小交换机——为什么会这样?你会敲哪条命令把根桥固定回核心?
把你的答案和会用的命令写在评论区,我来点评。答得上来,说明你真懂“根桥被谁抢走了”。
系列导航:
- 上一课:第 28 课《链路聚合——Eth-Trunk、LACP 与哈希分担》
- 下一课:第 30 课《RSTP/MSTP——STP 收敛慢到甲方拍桌子?》
- 专栏主页:[网络工程师进阶:企业组网实战——从交换机配置到园区网交付]
我是你们的老网工。这一课把环路和经典 STP 讲清楚了,可它“一断网要等 30 秒”的毛病,在很多业务里是不能接受的。下一课《RSTP/MSTP》,我们聊聊 RSTP 怎么把收敛从几十秒压到秒级,以及多个 VLAN 时,MSTP 怎么让不同 VLAN 走不同的链路、把冗余带宽真正利用起来。下一课见。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)