前阵子同事在机房做链路扩容,把核心交换机两个口用一根跳线直接连了起来,当时STP没启用,结果整个办公网用了大概两分钟就彻底断了——广播风暴把全网带宽全部打满,SSH连不上去,最后只能进机房拔线。做网络的人对这个场景太熟悉了。STP(Spanning Tree Protocol)生成树协议,是所有交换机设备默认要开、也绕不开的基础协议。它不仅解决二层环路问题,更是后续RSTP、MSTP负载均衡的根基。这篇文章我尽量用大白话把STP讲透,从为什么会有环路、环路有多可怕,到根桥选举、端口角色、状态机、计时器,再讲到RSTP和PVST+的演进,最后用一个典型的双核心双汇聚拓扑,带你完整配置一遍MSTP并验证负载均衡效果,顺便把面试和软考里最常考的STP点也串一遍。
1. 为什么需要STP:广播风暴与二层环路
1.1 网络冗余的必然性:没有环路就没有高可用
先回答一个最基础的问题:网络设备为什么要主动构造环路?答案很简单,为了让网络在单点故障时还能继续工作。
核心交换机到汇聚交换机如果只有一根物理链路,这根线断掉,下面整个区域全部断网。稍微有点规模的企业网、园区网,核心到汇聚基本都是双链路,汇聚到接入也经常做双上联。这样物理拓扑上自然就出现了环。但以太网这种二层协议天生不支持环路,交换机对广播帧的处理规则是“从除接收端口外的所有端口转发出去”,一旦拓扑成环,广播帧就会在网络里无限循环,越传越多,最终演变成广播风暴。
所以问题就摆在眼前:一方面我们需要物理链路冗余来保证可靠性,另一方面二层又不能真环。STP就是来解决这对矛盾的机制。
1.2 环路下网络会发生的三件“要命”的事
第一件是广播风暴。交换机之间不断互相转发广播帧、未知单播帧,每台交换机收到之后继续从所有端口复制转发,帧的数量呈指数级增长。带宽被瞬间耗尽,交换机CPU占用冲高,正常的业务流量根本挤不进去,整个网络进入假死状态。我经历过一次,当时全网几百台设备,从出现症状到完全瘫掉不到三分钟。
第二件是MAC地址漂移。交换机通过收到帧的源MAC来学习MAC地址表,正常情况下一个MAC地址只应该从一个接口学到。环路存在时,同一个源MAC会在短时间内从多个接口被学到,导致MAC表条目在两个端口之间来回横跳,交换机的转发行为完全乱掉。现在很多厂商的设备会直接上报“MAC address moving”告警,这就是排查环路的典型信号。
第三件是多帧复制。终端发出一个单播帧,因为环路的存在,目的交换机可能收到这个帧的多个副本。对普通业务来说重复帧可能没什么影响,但对一些相对敏感的协议来说,收到重复包会出现异常。比如某些依赖序号机制的协议,重复帧会导致报文错乱,上层业务直接受影响。
这三件事是同时发生的,也就是说一旦出现二层环路,轻则丢包卡顿,重则全网瘫痪。下面用表格梳理一下,方便你排查时对照。
| 环路症状 | 具体表现 | 危害等级 |
|---|---|---|
| 广播风暴 | 端口流量持续打满,CPU冲高,网络假死 | 致命 |
| MAC地址漂移 | MAC表反复变化,设备上报漂移告警 | 严重 |
| 多帧复制 | 终端收到重复帧,部分协议异常 | 视协议而定 |
1.3 生成树协议的设计思想:逻辑阻断,物理保留
STP的解决思路并不复杂:通过一种分布式算法,在物理上存在环路的网络中选出一棵唯一的、无环的转发树。换句话说,把某些冗余端口在逻辑上直接阻塞掉,不让它转发数据帧,但保留这条链路作为备份。
它不把冗余链路拔掉,也不让你手动去封口,而是自动决定哪个口该通、哪个口该堵。一旦活跃路径出现故障,STP会重新计算拓扑,把原本阻塞的端口放开,备份链路立刻顶上。网络工程师要做的只是开启协议、做好规划,剩下的交给算法。
这是STP最核心的价值:物理层面保持冗余,逻辑层面消除环路,故障时自动切换。理解了这个思想,后面所有细节都会变得顺理成章。
2. STP核心原理:根桥选举与端口角色
2.1 BPDU:交换机之间传递的“投票资料”
STP的工作机制依赖于一种叫BPDU(Bridge Protocol Data Unit,桥协议数据单元)的报文,交换机通过它来交换生成树信息。BPDU里包含几个关键字段:Root ID(根桥标识)、Root Path Cost(到根桥的路径开销)、Bridge ID(发送者的桥标识)、Port ID(发送端口标识)。
每台交换机默认每2秒从所有端口发送一次BPDU(Hello Time),同时接收邻居发来的BPDU,然后根据这些信息决定自己的角色。整个过程非常像一个分布式选举:全网设备一起投票选出谁是老大,然后其他人围绕老大确定自己的位置。
2.2 根桥是怎么选出来的:优先级优先,MAC从小
先选根桥。每台交换机都有一个桥ID(Bridge ID),它由两部分组成:桥优先级(默认32768)和交换机MAC地址。比较规则是:优先级数值小的优先,如果优先级相同,再看MAC地址,MAC地址小的当选。
需要留意的是,优先级字段的范围是0到65535,但实际配置时必须按4096的步长来设置。比如可以设成0、4096、8192、32768、61440等,不能随便填一个数字。所以如果你看到某台交换机优先级是4096,它的优先级数值明显小于默认的32768,在选举中就更占优势。
网络工程师配置根桥,通常不会手写优先级,而是直接用类似root primary或root secondary这样的命令,设备会自动把优先级调整为比当前根桥更低的值。这样既不容易配错,也让根桥位置更可控。
2.3 端口角色的选举逻辑:中间过程才是重点
选完根桥之后,每台非根桥交换机要确定自己每个端口在生成树中的角色。端口角色总共三类:根端口(Root Port)、指定端口(Designated Port)、阻塞端口(Blocking Port)。
根端口是每台非根桥上距离根桥“最近”的那个端口,它负责接收来自根桥方向的BPDU,正常状态下是转发状态。指定端口是每个网段上距离根桥最近的交换机上的端口,同样处于转发状态。阻塞端口则是被逻辑关闭的端口,不收发数据帧,只持续监听BPDU,一旦网络变化随时准备替换。
选举的比较顺序可以用一句话记:先看根桥ID,再看根路径开销,然后看发送者桥ID,接着看发送者端口ID,最后看接收者端口ID。之前有人问为什么要搞这么多比较项,核心原因是网络里的情况千差万别,必须有一条唯一确定的规则来保证所有设备算出来的结果一致,否则各算各的,网络就乱了。
2.4 端口状态机与计时器:50秒收敛是怎么来的
经典STP的端口有5种状态:
| 状态 | 行为 | 持续时长 |
|---|---|---|
| Disabled | 关闭,不参与任何逻辑 | — |
| Blocking | 只接收BPDU,不转发数据不收发MAC学习 | 不确定 |
| Listening | 接收/发送BPDU,计算拓扑,不学习MAC不转发 | 15秒 |
| Learning | 开始学习MAC地址,仍不转发数据 | 15秒 |
| Forwarding | 正常转发数据帧 | — |
有四个计时器必须背下来:Hello Time默认2秒,Forward Delay默认15秒,Max Age默认20秒,还有延时老化相关的配置。
当一个阻塞端口需要转为转发状态时,经典STP的过程是:先等Max Age计时器到期(20秒),再经过Listening阶段(15秒),然后Learning阶段(15秒),总共最长要50秒。这就是经典STP被诟病最多的痛点:收敛时间太长,现代网络完全等不起50秒。
2.5 手动推演一遍:三台交换机的环形拓扑
光看规则不推演等于白看。咱们花几分钟手推一个案例。
假设三台交换机环形连接,SW1、SW2、SW3,两两之间都有一条线。配置如下:SW1的桥优先级设为4096,SW2和SW3保持默认32768,三者MAC地址分别是AAAA-AAAA-AAAA、BBBB-BBBB-BBBB、CCCC-CCCC-CCCC。
第一步选根桥。SW1优先级4096最小,直接当选根桥。SW2和SW3优先级相同,比较MAC,BBBB开头的小于CCCC开头,但根桥已经定了,这个比较不影响根桥结果。
第二步,SW2和SW3分别计算自己的根端口。SW2有两个邻居方向:到SW1这条链路开销小、到SW3这条链路开销大,显然通过SW1方向的端口到根桥路径开销最小,所以SW2连接SW1的口成为根端口。SW3同理,连接SW1的口是根端口。
第三步最难,判断SW2和SW3之间那条链路上谁是指定端口、谁被阻塞。这条链路两端分别收到对方的BPDU,比较逻辑是:两端都是非根桥,根路径开销相同(都是各自的根端口开销,假设链路带宽相同,开销也就相同),接着比较发送者桥ID。SW2的桥ID比SW3小,所以SW2这一端的端口作为指定端口,SW3那一端就被阻塞。
这就是手推生成树的完整过程。你可以在纸上把拓扑画出来,把每条链路标上开销,推一遍之后对STP的理解会有一个质的提升。后面学习RSTP和MSTP,你会发现核心选举逻辑完全没有变,变的只是收敛速度和扩展性。
3. 从STP到RSTP、PVST+:收敛速度的演进
3.1 50秒收敛在今天的网络里根本等不起
经典STP看起来逻辑严谨,但实际部署中最大的问题是收敛太慢。想象一个场景:接入交换机重启,链路断开,到重新恢复转发可能要等50秒。对于内网视频会议、VoIP语音、在线交易这类业务,50秒的中断用户完全无法接受。
而且经典STP还有另一个问题:端口角色和状态绑定得比较死,所有端口状态变化都要按部就班地走流程,没有快速协商的机制。网络规模稍微大一点,拓扑变化频繁一点,整个STP域就像一台老式机器,喘口气都要半天。
3.2 RSTP解决收敛问题的四个关键改进
RSTP(Rapid Spanning Tree Protocol,快速生成树协议)在IEEE 802.1w中定义,最大的特点是把收敛时间从50秒压缩到秒级甚至毫秒级。
它做了几件关键的事。第一,端口角色细化了,增加Alternate端口(根端口的备份)和Backup端口(指定端口的备份),备份角色可以在主端口故障时立刻接替,不用重新计算拓扑。
第二,引入Proposal/Agreement(提议/同意)机制。链路建立后,两个指定端口之间可以直接协商,下游端口发送Proposal,上游端口回复Agreement,随后端口直接进入转发状态,跳过了漫长的Listening和Learning等待。这也是RSTP收敛快的核心原因。
第三,边缘端口(Edge Port)概念。连接PC、终端、服务器的接入端口,不会收到BPDU,直接置为Forwarding,不参与生成树计算,也不经历状态迁移。这个设计让接入侧几乎零等待。
第四,状态机从5个精简成3个:Discarding(丢弃)、Learning(学习)、Forwarding(转发)。Blocking、Disabled、Listening都被归入Discarding。
现在几乎所有厂商的交换机都默认启用RSTP或MSTP,很少有人用回经典STP。但你要知道,MSTP是在RSTP基础上扩展出来的,所以RSTP的根本原理吃透了,MSTP自然就能理解。
3.3 思科PVST/PVST+:每个VLAN一棵树
思科早期搞了一套PVST(Per-VLAN Spanning Tree,每VLAN生成树),后来改进成PVST+。它的思路很大胆:不为全网运行一棵生成树,而是每个VLAN各自运行一棵。
在Trunk链路上,不同VLAN可以在不同的物理端口上阻塞。比如VLAN 10在这根链路上是转发状态,在另一根是阻塞状态,VLAN 20反过来。这样既消除了环路,又实现了基于VLAN的负载均衡,一个VLAN的流量走这条线,另一个VLAN走那条线。
PVST+的代价是要为每个VLAN单独发送和接收BPDU,VLAN数量一多,CPU和带宽开销明显上升。而且PVST+是思科私有协议,跨厂商互通时兼容性很麻烦。所以在多厂商混存的网络里,它并不是一个理想的长期方案。
3.4 四种生成树模式对比
| 协议 | 标准 | 收敛速度 | 负载均衡 | 适用场景 |
|---|---|---|---|---|
| STP | IEEE 802.1D | 最慢(约50秒) | 不支持 | 老设备、特殊合规场景 |
| RSTP | IEEE 802.1w | 快(秒级) | 不支持 | 中小网络,无多VLAN分流需求 |
| PVST+ | 思科私有 | 较快 | 支持(按VLAN) | 纯思科小型网络 |
| MSTP | IEEE 802.1s | 快(秒级) | 支持(按实例) | 中大型网络、多厂商混存 |
从上表能看到,MSTP既继承了RSTP的快速收敛,又提供了类似PVST+的负载均衡能力,而且是国际标准,跨厂商互通没有问题。这也是为什么现在中大规模园区网的主流方案都指向MSTP。
4. MSTP多实例生成树:原理与设计思路
4.1 为什么需要MSTP
PVST+的负载均衡思路虽然好,但存在两个问题:一是私有协议,跨厂商支持不友好;二是每VLAN一棵树,VLAN一多资源占用厉害。而经典RSTP虽然收敛快,却不支持按VLAN分流,所有VLAN共用一棵树,大量冗余链路处于空闲状态,浪费了双上联的价值。
MSTP(Multiple Spanning Tree Protocol,多生成树协议)在IEEE 802.1s中定义,它的核心思路是把多个VLAN映射到同一个生成树实例(Instance),每个实例独立运行一棵生成树。配置好实例与VLAN的映射后,不同实例之间可以有不同的路径,流量就能在多条链路上均衡分布。
用大白话说,MSTP把物理拓扑切分成多个“虚拟拓扑”,每个虚拟拓扑负责一批VLAN,各走各的路,互不干扰。
4.2 MST域、IST、CIST这些概念得捋清楚
如果说MSTP的实例是“同一组交换机内部”的生成树,那域(Region)就是这些交换机的边界。
MST域要求一组交换机满足三个条件完全一致:域名(Region Name)、修订级别(Revision Level)、VLAN与实例的映射表。只要有一项不一致,交换机就会认为自己属于不同的域,跨域的生成树计算就按照另一种规则来,负载均衡很容易失效。
在域内,每一个生成树实例叫做IST(Internal Spanning Tree),其中实例0比较特殊,它是域内默认的生成树实例,所有没有映射到具体实例的VLAN都归它管。跨域之间,各MST域的IST再由CIST(Common and Internal Spanning Tree,公共与内部生成树)串起来,形成一个全网统一的生成树视图。
简单类比:一个MST域就像一家公司,公司内部各部门(实例)各算各的账;公司之间通过总部(实例0/CIST)统一协调。你不需要特别深入CIST的细节,但要知道VLAN没被映射到实例时,全都会落到实例0,这在设计时必须留意。
4.3 实例与VLAN的映射:负载均衡的关键
假设有两个实例:实例1映射VLAN 10-20,实例2映射VLAN 30-40。在配置里把实例1的根桥设为核心交换机A,实例2的根桥设为核心交换机B。
这样VLAN 10-20的流量上行时以A为根,走A一侧的链路主转发;VLAN 30-40以B为根,走B一侧的链路主转发。两端互为备份,一旦某台核心故障,对应实例会自动切换到另一台,既实现了负载分担,又保证了可靠性。
设计MSTP负载均衡时,通常遵循几个原则:
- 不同实例的根桥尽量分布在不同的核心/汇聚设备上,避免所有实例都挤在同一台设备上。
- 业务VLAN按照上行链路归属划分实例,例如业务1走汇聚A,业务2走汇聚B。
- 实例数量不要过多,一般2到4个足够。实例越多,BPDU开销和运维复杂度越高。
- 未分配的VLAN必然掉进实例0,建议把实例0的根桥固定到性能最好的一台设备上。
4.4 配置MSTP最容易被忽略的三个点
第一,域配置必须严格一致,一个字母一个数字都不能差。很多故障表面上是流量不通,排到最后发现是两台交换机的Region Name不一致,把自己划到了不同域。
第二,配置完域配置要执行激活命令,华为设备是active region-configuration,思科设备需要输入exit离开配置模式让配置生效。光配不激活,配置就是一张废纸,这个坑我见过不止一次。
第三,所有VLAN的归属要心里有数。默认情况下所有VLAN都映射到实例0,如果你把VLAN 99忘了映射,它就留在实例0里,走根桥为A的路径。万一你本来想让VLAN 99走B,结果流量路径和你预期不一样,排查起来会很费劲。
5. 双核心双汇聚MSTP负载均衡实战配置
5.1 实战拓扑与负载均衡目标
假设一个典型的园区网:两台核心交换机SW1、SW2,两台汇聚交换机SW3、SW4,下面接入交换机多台。核心之间互联,核心与汇聚之间各连两条线,汇聚间也有互联,物理上存在多个环路。
业务划分:VLAN 10是办公业务,VLAN 20是监控业务。目标是VLAN 10上行主走SW1,VLAN 20上行主走SW2,两条路径互为备份,并且链路故障时能快速切换。
拓扑结构可以用下面的文字简图表示:
[SW1] -------- [SW2] | \ / | | \ / | [SW3] -------- [SW4] | ... | [接入交换机] [接入交换机]5.2 华为设备配置:从模式切换到域配置到根桥设置
华为设备的MSTP配置分三步:切换模式、配置域、设置根桥。
第一步,在每台交换机上把STP模式改成MSTP:
stp mode mstp第二步,在每台交换机上配置域和实例映射,这一步最关键,所有交换机需要保持一致。以核心SW1为例:
stp region-configuration region-name HX revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configurationSW2、SW3、SW4的配置除了实例映射之外完全相同,实际生产环境中建议把域配置做成模板,统一下发,避免手工漏配。
第三步,设置根桥和备份根桥。SW1上执行:
stp instance 1 root primary stp instance 2 root secondarySW2上执行:
stp instance 1 root secondary stp instance 2 root primary这样实例1的根是SW1,实例2的根是SW2,两个实例的主路径正好分开。汇聚和接入交换机不需要设置根桥,它们只需要参与MSTP计算,自动跟随根桥方向生成无环拓扑。
5.3 思科设备配置对照
思科设备的逻辑和华为相同,只是命令风格不同。核心SW1上配置示例:
spanning-tree mode mst spanning-tree mst configuration name HX revision 1 instance 1 vlan 10 instance 2 vlan 20 exit spanning-tree mst 1 root primary spanning-tree mst 2 root secondary核心SW2上把root primary和root secondary对调即可。这里spanning-tree mst 1 root primary的作用等同于华为的stp instance 1 root primary,设备会自动调整实例的桥优先级到当前网络最低值。
5.4 用命令验证负载均衡是否生效
配置不是写完就结束了,必须验证流量走向是否真的符合预期。
华为设备验证实例1的生成树情况:
display stp instance 1 brief关注输出中端口的状态和角色,确认该实例在SW1与SW3之间的链路是转发状态,SW2与SW3之间的链路是阻塞状态。
查看实例2:
display stp instance 2 brief预期结果与实例1相反,SW2与SW3之间转发,SW1与SW3之间阻塞。
华为还支持查看MSTP域配置和所有实例总览:
display stp region-configuration display stp instance brief思科设备对应验证命令是:
show spanning-tree mst 1 show spanning-tree mst 2 show spanning-tree mst configuration如果验证发现VLAN 10和VLAN 20走的都是同一台核心,多半是域配置不一致或者实例映射漏配,优先检查每台设备的Region Name、Revision Level和映射表。
6. 常见故障排查与笔试面试考点
6.1 MSTP常见故障与解决速查表
我在实际维护中积累了一些高频故障,整理成表格方便你直接对照。
| 故障现象 | 可能原因 | 排查命令 | 解决思路 |
|---|---|---|---|
| 网络周期性全断 | STP未启用或模式不一致 | display stp mode | 统一启用MSTP/RSTP |
| 流量走向不符合预期 | 域配置不一致或实例映射漏配 | display stp region-configuration | 逐台比对域配置,修正映射 |
| MAC漂移告警刷屏 | 环路未被阻断 | display mac-address moving | 检查物理链路,确认STP端口角色 |
| 收敛速度慢 | 端口未配置边缘端口 | display stp interface brief | 给接入端口配stp edged-port enable |
| 根桥被非法设备抢占 | 设备下发BPDU | display stp root | 在接入端口启用BPDU Guard |
| 单向链路导致阻塞端口转发 | 光纤/光模块故障 | display stp abnormal | 启用Loop Guard保护 |
6.2 端口保护与防环加固:BPDU Guard、Root Guard、Loop Guard
生产环境的STP不能只是配个根桥就完了,一定要加保护特性。
BPDU Guard通常配置在连接终端的边缘端口上。正常情况下,接入端口只会转发BPDU给交换机,不应该收到任何BPDU。如果某个端口收到BPDU,说明有人私接了一台交换机或者配错了线,BPDU Guard会让这个端口直接变成err-disable状态,防止非法设备参与生成树选举、甚至抢走根桥。
Root Guard配置在应该接收上游BPDU的端口上,它的作用是保护根桥位置。如果这个端口收到了比当前根桥更优的BPDU,Root Guard会把端口置为阻塞状态,避免根桥漂移。
Loop Guard配置在阻塞端口上,防止单向链路故障导致的转发环路。正常情况下阻塞端口只能收到BPDU,如果链路出现单向故障,收不到BPDU,端口可能误判并进入转发状态,形成环路。Loop Guard会把这种情况下的端口置为Discarding。
这三个保护并不是互斥的,可以在不同端口按需部署。不管企业网还是数据中心,都建议把BPDU Guard作为接入端口的默认配置项。
6.3 软考与面试中最常考的STP问题
软考中级网络工程师基本每年都会考STP,现象题、计算题都有。常见考点包括:
- STP端口从Blocking到Forwarding经历的状态变迁,经典STP约50秒;
- 桥优先级默认值、步长4096、取值范围;
- 根桥选举比较顺序:优先级→MAC地址;
- 端口角色选举顺序:根桥ID→根路径开销→发送桥ID→发送端口ID→接收端口ID;
- RSTP与STP的差异:P/A机制、边缘端口、角色细分;
- MSTP中VLAN映射到实例、域配置一致性的判断。
面试环节更偏重理解和实操。我面试网络工程师时习惯让人手推一遍端口角色,再问一个MSTP实例根桥设置的问题。能把这个过程讲清楚的人,网络基础基本不会差。建议你按本文的推演方法,在纸上多画几个拓扑练一练,比死记硬背效果强很多。
我在实际维护中还总结了一个小心得:MSTP配置看上去只有几条命令,但真正决定成败的是实例规划。你上连口的带宽、业务VLAN的分布、双核心设备性能,都决定了哪些VLAN该进实例1、哪些进实例2、根桥压在哪一侧。配好之后一定要做一次故障演练,把主链路的线拔掉看切换时间是否符合预期,再插回去看回切是否正常。只有实际断过一次电、拔过一次线,你才会真正信任这套冗余设计。