STP生成树协议:如何把环形网络修剪成树型拓扑全解 小白也能看懂
STP 的诞生:解决环路与冗余的矛盾
为保障网络的持续、稳定运行,“冗余链路” 成为网络设计的关键策略。通过部署多条物理链路(如以太网中交换机间的并行连接 ),当某条链路因故障中断时,数据可自动切换至备用链路传输,避免单点故障导致网络瘫痪,这一设计从物理层面提升了网络的可靠性与冗余度。然而,冗余链路若未经逻辑优化,会形成物理环路,引发三类核心故障:
1.广播风暴:
桥接网络中,交换机(网桥)的工作特性决定了其无法拒绝广播帧,当收到广播帧(如 ARP 请求、DHCP Discover 等)时,会执行泛洪操作 —— 将帧从除接收端口外的所有其他端口转发出去。而由于网桥 / 交换机不修改帧内容,也不记录帧经过的设备数量,若网络存在环路,这些被泛洪的广播帧又会被环路其他交换机泛洪转发在环路中无限循环,持续占用网络带宽,最终耗尽链路资源,导致正常数据无法传输,形成广播风暴。
2.MAC 地址表震荡:
交换机依靠 MAC 地址表转发数据,表项记录 “源 MAC 地址 - 入端口” 映射。环路中,同一源 MAC 地址的帧会从不同端口重复进入交换机,迫使设备频繁更新 MAC 表项,引发 “震荡”,破坏转发逻辑。
3.重复帧传输:
目标主机接收数据时,会因环路收到多份相同帧。这不仅浪费主机处理资源(需丢弃重复帧 ),还可能引发上层应用(如数据库同步、文件传输 )的逻辑错误。
为调和 “冗余链路保障高可用” 与 “物理环路引发故障” 的矛盾,生成树协议(Spanning Tree Protocol,STP) 应运而生。STP 通过算法自动检测网络物理拓扑,将环形结构逻辑重构为无环树型拓扑:选举根桥(网络逻辑中心 ),阻塞部分冗余链路(仅保留逻辑转发路径 ),既保留冗余链路的 “故障切换能力”,又彻底消除环路引发的广播风暴、MAC 表震荡与重复帧问题,为网络的稳定运行提供核心支撑。简言之,STP 是网络交换技术发展中,应对 “冗余需求与环路隐患” 矛盾的关键创新,奠定了现代冗余网络可靠运行的基础逻辑。
STP 的核心组件与选举规则
桥 ID(Bridge ID):每台运行 STP 的交换机都有一个桥 ID,它由 16 位的优先级(默认值为 32768,4096的倍数,最高级为0)和 48 位的 MAC 地址组成。在 STP 选举过程中,桥 ID 用于确定根桥,桥 ID 最小的交换机将被选举为根桥。比如,网络中有三台交换机 S1、S2、S3,S1 的桥 ID 为 32768.00-00-00-00-00-01,S2 的桥 ID 为 32768.00-00-00-00-00-02,S3 的桥 ID 为 32768.00-00-00-00-00-03,那么 S1 会被选举为根桥,因为它们优先级相同,而 S1 的 MAC 地址最小。
路径开销(Path Cost):用于衡量从一个交换机到根桥的链路代价,链路带宽越高,路径开销越小。例如,1Gbps 链路开销为 20,100Mbps 为 100。路径开销是交换机选择 ROOT 端口的重要依据之一。
在网络技术发展中,路径开销的计算遵循过不同标准,导致相同带宽链路的默认开销值存在差异:
IEEE 802.1t 标准(现代主流)中,1Gbps 链路的默认路径开销为 4;
传统 IEEE 802.1d 标准(早期规范)中,1Gbps 链路的默认路径开销则为 20。
这种差异源于标准演进对链路代价量化方式的调整,实际网络中需根据设备采用的标准判断开销值的合理性。
笔者所使用模拟器采用IEEE 802.1d 标准所以文中使用此标准
端口 ID(Port ID):每个端口的端口 ID 由 8 位端口优先级(默认 128)和 8 位端口号组成。当交换机在 STP 选举中需要进一步决策时,将按照以下顺序进行比较:
- 根路径开销(Root Path Cost)
比较各端口到根桥的累计路径开销,选择路径开销最小的端口。若存在多个端口路径开销相同,则继续比较后续参数。 - 发送者桥 ID(Sender Bridge ID)
比较发送 BPDU 的对端交换机的桥 ID(优先级 + MAC 地址),选择桥 ID 数值较小的端口。若对端交换机相同(桥 ID 一致),则继续比较对端的端口 ID。 - 发送者端口 ID(Sender Port ID)
比较对端交换机发送 BPDU 的端口 ID(优先级 + 端口号),选择端口 ID 数值较小的端口。若对端交换机的多个端口均满足条件,则继续比较本地端口 ID。 - 本地端口 ID(Local Port ID)
比较本交换机自身端口的 ID(优先级 + 端口号),选择端口 ID 数值较小的端口。例如,若交换机的两个端口接收到相同路径开销的 BPDU,且对端交换机及端口 ID 均相同,则优先选择本地端口优先级较高(数值较小)或端口号较小的端口。
STP 的工作内容
选举根桥
网络初始化时,所有交换机都认为自己是根桥,发送包含自身桥 ID 的配置 **BPDU(Bridge Protocol Data Unit,桥协议数据单元)**消息。交换机之间互相交换 BPDU 消息,比较桥 ID 大小,桥 ID 最小的交换机成为根桥。根桥是整个网络拓扑的中心,所有非根桥都要通过 ROOT 端口与根桥建立连接。
选举根端口(ROOT 端口)
非根桥交换机上的每个端口都会计算到根桥的路径开销,路径开销最小的端口被选举为 ROOT 端口。如果存在多个端口到根桥的路径开销相同,则比较对端设备的桥 ID,桥 ID 小的对应的端口成为 ROOT 端口;若对端设备桥 ID 也相同,就比较对端设备的端口 ID,端口 ID 小的对应的端口成为 ROOT 端口。ROOT 端口是每个非根桥到根桥的最优路径端口。
选举指定端口(DESI 端口)
在每个网段(以太网链路连接的区域)上,都需要选举一个指定端口(Designated Port,DESI)。指定端口负责向该网段转发 BPDU 消息,并转发来自根桥的数据帧。根桥上的端口都是指定端口。对于非根桥连接的网段,比较连接该网段的各个端口到根桥的路径开销,路径开销最小的端口成为指定端口;如果路径开销相同,按照比较所在设备桥 ID,桥 ID 小的的端口成为 DESI端口;若所在设备桥 ID 也相同,就比较所在设备的端口 ID,端口 ID 小的对应的端口成为 指定 端口。一台交换机可以有多个DESI端口但是只能有一个ROOT端口
阻塞端口(ALTE 端口)
在 STP 完成根桥、根端口、指定端口选举后,交换机上既非根端口、也非指定端口的剩余端口,会进入阻塞状态(Blocked State)即阻塞端口(Blocked Port):
阻塞端口在功能上存在明确限制:它不转发用户数据帧以避免网络环路引发的广播风暴,但会持续接收并处理 BPDU 消息,以此监听链路故障、新设备加入等拓扑变化。作为网络冗余的 “备用路径”,其存在的核心意义在于,当当前活动的根端口或指定端口发生故障时,能通过 STP 重新选举转为转发状态,快速恢复网络连通性,保障拓扑可靠性。从与其他端口的关系来看,根端口负责非根桥向根桥转发数据,指定端口承担向网段内转发 BPDU 和根桥数据的职责,而阻塞端口则作为冗余链路的 “静默守护者”,通过牺牲实时转发能力,为破除拓扑环网和实现故障自愈奠定基础。
通过这一严格的比较顺序,STP 确保在复杂网络环境中仍能确定性地选择唯一的根端口和指定端口,从而构建稳定无环的树状拓扑。
BPDU 老化机制
STP 通过 BPDU 老化机制确保网络拓扑的动态更新能力:
-
BPDU 生存时间(Max Age)
- 根桥发送的 BPDU 中包含Max Age字段(默认 20 秒),表示 BPDU 的有效时长。
- 非根桥收到 BPDU 后会启动一个计时器(等于Max Age),若在计时器超时前未收到新的 BPDU,则认为该路径失效。
-
拓扑变更时的老化加速
- 当网络发生拓扑变更(如链路故障),检测到变化的交换机会发送 TCN(拓扑变更通知)BPDU 给根桥。
- 根桥收到 TCN 后,会向全网广播 TC(拓扑变更)标记的 BPDU,通知所有交换机将 MAC 地址表老化时间缩短为Forward Delay(默认 15 秒),加速无效条目的清除。
-
ALTE 端口的 BPDU 监听与老化
- ALTE 端口持续接收 BPDU 以监测链路状态,若连续Max Age时间未收到 BPDU(如 DESI 端口故障),则认为原路径失效。
- ALTE 端口会从阻塞状态进入转发状态,重新计算拓扑,但需经历Listening→Learning→Forwarding三个阶段(共约 30 秒),确保无环。
-
与端口状态转换的协同
-
BPDU 老化是触发 ALTE 端口状态转换的核心条件。例如:
当DESI端口故障 → 其BPDU停止发送 → ALTE端口的BPDU计时器超时 → ALTE端口开始状态转换
-
端口状态转换
ALTE 端口在网络稳定时保持阻塞状态,但会持续监听 BPDU。当链路故障导致原 DESI 端口失效时,ALTE 端口会经历以下状态转换:
- 阻塞(Blocking) → 监听(Listening):开始参与 STP 计算,但不转发数据。
- 监听(Listening) → 学习(Learning):构建 MAC 地址表,但仍不转发数据。
- 学习(Learning) → 转发(Forwarding):成为新的 DESI 端口,开始转发数据。
这一过程通常需要 30-50 秒(取决于 STP 计时器配置),确保网络在拓扑变化后能快速收敛为无环结构
实践检验
判断根桥、根端口、指定端口、阻塞端口
在学习完STP的核心组件与选举规则工作内容后,让我们来用实践检验学习的内容,在H3C模拟器中拓扑如上的网络中分别判断根桥、根端口、指定端口、阻塞端口是哪一个设备哪一个端口。所有线路的带宽均为1G,设备的桥ID和和优先级均为默认生成。
判断根桥
在模拟器环境中,先后创建的网络设备,其默认生成的标识(如 MAC 地址衍生的桥 ID 组件等)呈现由小到大的递增趋势,而设备不经修改的桥ID优先级为32768。所以SW1被选举为根桥 (S5820V2-54QS-GE_1,之后的所有交换机均以此缩写)
在命令行终端中查看
SW1
<H3C>dis stp
-------[CIST Global Info][Mode MSTP]-------
Bridge ID : 32768.5808-1ba8-0100 //(1)在下方注解
Bridge times : Hello 2s MaxAge 20s FwdDelay 15s MaxHops 20
Root ID/ERPC : 32768.5808-1ba8-0100, 0 //(2)
RegRoot ID/IRPC : 32768.5808-1ba8-0100, 0 //(3)
RootPort ID : 0.0 //(4)
BPDU-Protection : Disabled
Bridge Config-
Digest-Snooping : Disabled
TC or TCN received : 12
Time since last TC : 0 days 0h:0m:34s
(1) 本桥的优先级为32768,MAC地址为5808-1ba8-0100
(2) CIST根桥的ID与本桥ID相同,外部路径开销为0(表示本桥即为根桥)
(3) 区域根桥的ID与本桥ID相同,内部路径开销为0(表示本桥即为区域根桥)
(4) 根端口ID为0.0(无,因为本桥是根桥,根桥没有根端口)
让我们查看SW2和SW3来所为对比
SW2
-------[CIST Global Info][Mode MSTP]-------
Bridge ID : 32768.5808-2001-0200 //(1)
Bridge times : Hello 2s MaxAge 20s FwdDelay 15s MaxHops 20
Root ID/ERPC : 32768.5808-1ba8-0100, 20 //(2)
RegRoot ID/IRPC : 32768.5808-2001-0200, 0 //(3)
RootPort ID : 128.2 //(4)
BPDU-Protection : Disabled
Bridge Config-
Digest-Snooping : Disabled
TC or TCN received : 14
Time since last TC : 0 days 0h:51m:5s
(1) 本桥的优先级为32768,MAC地址为5808-2001-0200,MAC地址大于根桥符合预期
(2) CIST根桥的ID(优先级32768,MAC 5808-1ba8-0100),外部路径开销为20(通过本桥到总根的累计开销)
(3) 区域根桥的ID(与本桥ID相同),内部路径开销为0(表示本桥是所在MST域的域根)
(4) 根端口ID为128.2(优先级128,端口号2),即本桥通过此端口连接到更高级的根桥
SW3
-------[CIST Global Info][Mode MSTP]-------
Bridge ID : 32768.5808-239e-0300(1)
Bridge times : Hello 2s MaxAge 20s FwdDelay 15s MaxHops 20
Root ID/ERPC : 32768.5808-1ba8-0100, 20
RegRoot ID/IRPC : 32768.5808-239e-0300, 0
RootPort ID : 128.2
BPDU-Protection : Disabled
Bridge Config-
Digest-Snooping : Disabled
TC or TCN received : 13
Time since last TC : 0 days 1h:15m:34s
(1)设备的MAC地址根据创建先后顺序呈现由小到大的递增趋势,符合预期
判断根端口(ROOT端口)
根据选举根端口的原则,非根桥交换机上去往根桥的路径开销最小的端口将会被选举为根端口
SW2上GE_0/1端口去往根桥只经过一条线路SW2 →SW1(单条 1Gbps 链路),路径开销 = 20,开销明显小于其他端口所以端口GE_0/1被选举为根端口
在SW2查看
SW2
[H3C]display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 **** FORWARDING NONE
0 GigabitEthernet1/0/3 **** FORWARDING NONE
可以看到端口GE_0/1的端口角色(Role)为ROOT根端口
注:只显示我们需要判断的端口的端口角色,其他端口角色被我隐藏了以防干扰判断
根据去往根桥的路径开销最小的端口将会被选举为根端口的选举原则我们可以判断其他交换机的根端口
SW3的根端口为GE_0/1,SW4的根端口为GE_0/1,SW6的根端口为GE_0/1
SW3
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 **** FORWARDING NONE
0 GigabitEthernet1/0/3 **** FORWARDING NONE
SW4
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 **** FORWARDING NONE
SW6
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 **** DISCARDING NONE
而SW5的GE_0/1端口与GE_0/2的开销均途经两条1Gbsp(SW5→SW3→SW1,SW5→SW2→SW1)的线路所以开销均为40在此单独讨论
根据根端口的选举原则在存在多个端口到根桥的路径开销相同时,则比较对端设备的桥 ID,桥 ID 小的对应的端口成为 ROOT 端口。而在SW5上GE_0/1端口与GE_0/2端口的对端设备分别为SW3桥ID为32768.5808-239e-0300 、SW2桥ID为32768.5808-2001-0200,SW2桥ID优先级大于SW3所以GE_0/2被选举为根端口。
SW5
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 **** DISCARDING NONE
0 GigabitEthernet1/0/2 ROOT FORWARDING NONE
0 GigabitEthernet1/0/3 **** DISCARDING NONE
0 GigabitEthernet1/0/4 **** FORWARDING NONE
判断指定端口(DESI端口)和阻塞端口(ALTE端口)
因为根桥上的端口都是指定端口所有判断SW1的GE_0/1和GE_0/2为指定端口
SW1
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
在每个网段上都有DESI端口,而根端口所在网段的一个端口已经被已经被选举为根端口则另一个端口为指定端口即SW2的GE_0/2、GE_0/3接口为指定接口,SW3上的GE_0/3接口为指定接口。
而剩下的三个网段中根据指定端口的选举原则:
在SW3与SW5之间的网段 GE_0/2:到根桥路径为 SW3 → SW1(单条 1Gbps 链路),路径开销 = 20; GE_0/1:到根桥路径为 SW5 → SW3 → SW1(两条 1Gbps 链路),路径开销 = 20 + 20 = 40。所以GE_0/2被选举为指定端口。
而在SW4与SW5之间的网段 GE_0/2到根桥路径为 SW4 → SW2 →SW1,两条 1Gbps 链路),路径开销 = 20 + 20 = 40; GE_0/3到根桥路径为 SW4 → SW2 →SW1,两条 1Gbps 链路),路径开销 = 20 + 20 = 40。在路径开销相等时比较所在设备的桥ID,而GE_0/2的所在设备SW4桥ID小于GE_0/3所在设备SW5,所以GE_0/2被选举为指定端口。
同理在SW5和SW6之间的网段GE_0/4和GE_0/2同样开销相等,比较所在设备的桥ID,GE_0/4的所在设备SW5桥ID小于GE_0/2所在设备SW6,所以GE_0/4被选为指定端口
此时我们已经选举出了所有的根端口和指定端口,此时剩下的既不是根端口也不是指定端口的端口就会被阻塞成为我阻塞端口。即SW5的GE_0/1、GE_0/3端口;SW6的GE_0/2端口为阻塞端口。
SW1
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
SW2
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
0 GigabitEthernet1/0/3 DESI FORWARDING NONE
SW3
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
0 GigabitEthernet1/0/3 DESI FORWARDING NONE
SW4
<H3C>DIS stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
SW5
<H3C>display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ALTE DISCARDING NONE
0 GigabitEthernet1/0/2 ROOT FORWARDING NONE
0 GigabitEthernet1/0/3 ALTE DISCARDING NONE
0 GigabitEthernet1/0/4 DESI FORWARDING NONE
SW6
<H3C>DIS stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 ALTE DISCARDING NONE
总结:
设备 | 角色类型 | 具体端口 / 说明 |
---|---|---|
SW1 | 根桥 | 所有端口均为 “指定端口”(GE_0/1、GE_0/2 ) |
SW2 | 根端口 | GE_0/1(到根桥最短路径) |
指定端口 | GE_0/2、GE_0/3(所在网段指定端口) | |
SW3 | 根端口 | GE_0/1(到根桥最短路径) |
指定端口 | GE_0/2、GE_0/3(所在网段指定端口) | |
SW4 | 根端口 | GE_0/1(到根桥最短路径) |
指定端口 | GE_0/2(所在网段指定端口) | |
SW5 | 根端口 | GE_0/2(桥 ID 比较胜出) |
指定端口 | GE_0/4(所在网段指定端口) | |
阻塞端口 | GE_0/1、GE_0/3(冗余链路被阻塞) | |
SW6 | 根端口 | GE_0/1(到根桥最短路径) |
阻塞端口 | GE_0/2(冗余链路被阻塞) |
除去冗余链路,拓扑已经被修剪为了树装拓扑
PS:
文中对 STP 角色选举的推导若有疏漏(比如路径开销标准适配、模拟器特殊逻辑差异 ),恳请大家直言指正!也欢迎点赞收藏,让更多学习 STP 的伙伴能参考这篇博客