尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

STP生成树协议原理与MSTP负载均衡实战:二层环路广播风暴排查

发布时间:2026/9/26 17:05:21

资讯中心
01
ARTICLE

STP生成树协议原理与MSTP负载均衡实战:二层环路广播风暴排查

STP生成树协议原理与MSTP负载均衡实战:二层环路广播风暴排查
接到一个半夜打来的电话说整个办公室断网了核心交换机CPU冲到90%以上所有端口指示灯像呼吸灯一样同步狂闪业务全部瘫痪。赶到现场一看一根不起眼的跳线把两台交换机接成了一个环。这就是典型的二层环路引发的广播风暴而解决它的根本手段就是STPSpanning Tree Protocol生成树协议。STP和它的演进版本RSTP、MSTP是网络工程师绕不过去的核心协议之一不管是日常维护、割接变更还是软考中级网络工程师、面试技术问答都是重点考察对象。这篇文章我就把STP从原理到MSTP负载均衡实战完整梳理一遍把我实际配置和排障中积累的经验一并放进去希望对正在学交换技术或者准备网络工程师认证的朋友有帮助。1. 为什么网络工程师必须吃透STP1.1 二层环路导致的广播风暴是真实生产事故很多人刚开始学网络的时候对STP的理解就是“防环”知道个大概就过去了。但真到了生产环境二层环路造成的故障往往是最严重、最难排查的那一类。为什么因为三层路由有TTL数据包最多跳255次就丢了问题再大也会自动收敛。二层帧没有TTL机制一个广播帧进了环路之后会永远转发下去并且转发过程中交换机会不断学习错误的MAC地址MAC地址表疯狂震荡交换机CPU直接被广播报文打满。我经历过一次印象特别深的故障某办公区有几十台终端网络时断时续丢包率接近60%。检查链路状态全部正常链路层全部up。后来我登录接入交换机执行命令看CPU统计发现广播报文占比超过70%进一步排查才发现两个接入交换机之间有一条临时拉的网线和原有上联链路组成了一个物理环路。拔掉那根线之后网络立刻恢复。这种“拔线即恢复”的故障就是典型的二层环路。交换机本身不会像路由器那样丢弃过期报文只要有环路存在广播风暴就是必然结果。1.2 STP解决什么问题保留冗余逻辑剪环STP的核心思路不是让你去掉备份链路恰恰相反它允许你保留物理环路来实现冗余只是在逻辑上把某个端口阻塞掉让数据面变成一棵无环的树。换句话说物理上可以有环逻辑上必须无环。一旦正在工作的路径出现故障STP会自动把之前阻塞的端口放开让流量切换到备份链路整个过程对终端用户透明。这个过程可以类比成城市交通管理。物理上道路修成环形没问题但通过红绿灯和单行线控制让车流在逻辑上不会形成死循环。STP里的BPDUBridge Protocol Data Unit桥协议数据单元就是那些“交通规则”交换机之间靠BPDU互相协商选出谁是老大根桥谁走主路指定端口谁待命等待阻塞端口。1.3 软考、面试中STP的高频考点从我接触过的软考中级网络工程师真题和各大厂面试题来看STP相关考点主要集中在几个固定方向根桥的选举规则桥ID优先级MAC地址谁小谁优、根端口和指定端口的选举逻辑、端口状态迁移过程、三个计时器对收敛时间的影响、RSTP相比STP的改进点、MSTP的实例与VLAN映射关系。这些知识点如果你只是死记硬背很容易在题目换了个问法之后懵掉。比如面试官问“一台交换机上四个端口同时收到BPDU怎么判断哪个端口成为根端口”考察的就是你对于选举顺序根路径开销、发送者桥ID、端口ID的理解是否到位而不是看你会不会念命令。2. STP核心原理拆解2.1 BPDU报文STP的选票STP所有决策都基于BPDU报文。BPDU分为两大类配置BPDUConfiguration BPDU和拓扑变化通知BPDUTCN BPDU。根桥周期性发送配置BPDU默认每2秒一次把根桥ID、根路径开销、发送者桥ID、发送端口ID这些关键信息广播给整个二层网络。非根桥收到之后会基于这些信息更新自己的数据库然后继续向下游转发。BPDU里最关键的字段包括根桥IDRoot ID、根路径开销Root Path Cost、发送者桥IDBridge ID、发送端口IDPort ID。这四个字段就是选举的比较依据按照优先级从高到低依次比较。根桥ID由2字节优先级默认32768和6字节MAC地址组成比较的时候先比优先级数值数值越小越优优先级相同再比MAC地址MAC地址越小越优。根路径开销就是到达根桥的累计代价值这个值受到链路速率的影响比如10Mbps链路开销是100100Mbps开销是191Gbps开销是410Gbps开销是2。发送者桥ID就是发送这条BPDU的交换机自己的桥ID端口ID则是发送BPDU的端口编号。这里有一个新手容易忽略的细节BPDU里的字段有比较顺序绝不能直接摘出一个字段就开始比较。先看根桥ID不同则根桥ID小的获胜如果根桥ID相同说明双方是同一个根桥下的报文这时候比根路径开销开销小者优如果路径开销也相同再比发送者桥ID最后才到端口ID。这个顺序在根端口选举时会反复用到。2.2 根桥选举比ID大小交换机启动STP之后每个交换机都认为自己是根桥以自己为根发送BPDU。当它收到邻居发来的BPDU时会比较对方声明的根桥ID。比如核心交换机A的桥ID是32768-aabb-cc00-0101核心交换机B的桥ID是32768-aabb-cc00-0202。两者优先级相同那么比较MAC地址A的MAC更小A会成为根桥。B收到A的BPDU之后发现A声称自己是根桥并且A的桥ID比自己小B就会停止声称自己是根桥转而承认A为根桥把自己变成非根桥。整个过程用一句话概括比桥ID小者为王。实操中我们一般不会真的指望MAC地址大小来决定根桥而是手动调整优先级让指定的核心交换机成为根桥。华为设备上可以执行stp root primary让当前设备成为根桥这条命令实际把优先级调整为32768以下的值具体是4096的基础步长调整或者你也可以手动执行stp priority 4096把优先级改成更小的值。生产环境中建议把两台核心交换机配成互为备份主核心优先级设4096备核心优先级设8192这样主核心稳定当选根桥备核心在主核心故障时接管。2.3 端口角色决策根端口、指定端口、阻塞端口STP在每台非根桥上选举一个根端口Root Port在每个链路段上选举一个指定端口Designated Port剩下的那一个就是阻塞端口Blocking Port。这三个角色的确定是整个STP协议最核心的逻辑块。根端口是非根桥上离根桥最近的端口负责接收来自根桥的BPDU同时是该交换机与根桥之间的数据转发出口。选举规则是比较到达根桥的根路径开销开销最小的那个端口就是根端口。如果两个端口开销一样就比较该端口收到的BPDU里的发送者桥ID小的优先。如果还一样就比端口ID。指定端口是每段物理链路上离根桥最近的端口。每个链路段上必须有一个指定端口负责向该网段转发数据另一个端口如果既不是根端口也不是指定端口就会被阻塞。指定端口的选举规则同样是比较根路径开销、发送者桥ID和端口ID只不过比较的出发点是“谁离根更近谁就是指定端口”。需要特别注意的是根桥的所有端口都是指定端口因为根桥本身就是离根最近的设备。我用两台交换机串一个简单拓扑来举例。交换机A是根桥交换机B是非根桥A和B之间两条链路分别接在B的G0/0/1和G0/0/2上。B的两个端口收敛后G0/0/1根据根路径开销等参数成为根端口那A侧对应的两个端口是指定端口B侧的G0/0/2就会被阻塞。如果G0/0/1这条链路断了STP重新收敛G0/0/2从阻塞状态切换为转发状态流量无缝切换过去这就是冗余的价值。2.4 端口状态机变化802.1D定义了5个端口状态禁用Disabled、阻塞Blocking、监听Listening、学习Learning、转发Forwarding。端口启用STP后从阻塞走到转发需要经历15秒监听加15秒学习加上初始化过程中的最大老化时间20秒所以STP的标准收敛时间是30到50秒。这就是为什么很多老工程师在改STP配置后业务要“等一分多钟才能通”。监听状态里端口只能接收和发送BPDU不能学习MAC地址也不能转发数据学习状态里端口开始学习MAC地址但仍然不转发数据只有到了转发状态才真正承担数据转发任务。阻塞状态的端口只接收BPDU不发送也不转发数据。禁用状态是管理员手动关闭的状态通常不参与STP计算。我对初学者有一个建议不要死背状态机而是理解整个过程是“先听广播再学地址最后通车”的过程。端口先听别人怎么说监听然后记住周围住着谁学习最后才开门营业转发这样的时间成本就是为了保证拓扑信息完全同步避免出现临时的环路。这个状态机背后的设计哲学比记住5个状态的名字重要得多。2.5 三个计时器与收敛时间计算STP的收敛时间由三个计时器决定理解它们就能算出整个收敛过程的耗时。Hello Time默认2秒是根桥发送BPDU的周期Max Age默认20秒是交换机判断一个根桥“失联”前需要等待的时间如果20秒内没收到来自根桥的BPDU就认为网络中出现了拓扑变化开始重新计算Forward Delay默认15秒是端口从监听状态进入学习状态、再从学习状态进入转发状态各自需要等待的时间。收敛时间的具体算法是链路故障后直连的交换机能够立刻感知到物理链路down但非直连的交换机要等根桥的BPDU超时这个过程要Max Age的20秒。然后端口进入监听状态15秒学习状态15秒总共50秒。所以说STP的收敛时间是30到50秒30秒是直连故障场景50秒是非直连故障场景。如果你在面试中能把这个时间算给面试官看比单纯背“30秒、50秒”要有说服力得多。3. RSTP快在哪3.1 802.1w的改进角色和状态精简STP收敛速度慢的问题在核心网络中非常致命毕竟谁能接受一次链路故障业务中断50秒所以后来IEEE推出了802.1w标准也就是RSTPRapid Spanning Tree Protocol快速生成树协议。RSTP最大的改进是收敛速度从秒级降到亚秒级。RSTP把端口角色从STP的3个扩展为4个根端口、指定端口、备用端口Alternate Port、备份端口Backup Port。备用端口是对根端口的备份当根端口失效时备用端口能够立刻切换备份端口是对指定端口的备份通常是同一台交换机上两个端口之间形成的环。状态则从5个精简为3个丢弃Discarding、学习Learning、转发Forwarding。阻塞、禁用、监听这三个状态全部统一归入丢弃状态简化了状态机的复杂度。这里要特别说明RSTP对BPDU的发送方式做了根本性改变。802.1D规定只有根桥才能周期性发送BPDU其他交换机只是被动接收和转发。而RSTP允许所有交换机每2秒主动发送一次BPDU作为一个保活机制这样任何链路故障能被迅速感知不用等待20秒超时。3.2 P/A机制与边缘端口RSTP最关键的加速机制是P/AProposal/Agreement提议/同意握手。当一条链路接通时上游端口会发送Proposal报文表示“我想成为指定端口”下游端口如果发现自己没有更好的路径到达根桥就会回复Agreement报文表示同意然后两个端口可以直接进入转发状态。这个过程只发生在交换机之间直连的场景不需要等待计时器所以才能在毫秒级完成收敛。在配置RSTP时一定要记住边缘端口Edge Port的用法。边缘端口是指直接连接终端的端口它不需要参与STP计算所以不需要经历监听和学习状态可以直接进入转发状态。如果交换机的端口接到电脑、打印机、IP电话就应该配置为边缘端口。否则终端开机后要等30秒才能上网用户就会觉得“网络很慢”。华为设备上配置边缘端口的使用方式是stp edged-port enable。不过有一个陷阱需要注意如果边缘端口意外接到了另一台交换机上就会形成一个环路而交换机会因为端口是边缘端口而不运行STP等于失去了保护。所以RSTP做了一个折中设计边缘端口如果收到了BPDU就会自动失去边缘属性重新参与STP计算这个特性在华为设备上叫“自动检测”在思科上叫“PortFast BPDU Guard”。无论哪个厂商边缘端口加大BPDU保护BPDU Guard都是核心配置一旦这个端口收到BPDU就直接把它down掉既能防环又能快速发现问题。3.3 当前设备默认RSTP兼容旧设备时注意什么实际工作中现在几乎找不到还停留在802.1D纯STP的老设备了华为、华三的交换机默认模式就是MSTP兼容RSTP/STP思科同样默认PVST。但是不同模式的协议跑在一起时会有兼容性问题比如思科的PVST和华为的MSTP之间需要靠一种叫“稀疏模式”的兼容机制来交互如果两边配置不当可能出现端口反复震荡的情况。遇到混合组网时我的建议是统一端口的STP模式。如果整网都是华为设备全部用MSTP模式如果核心是思科、接入是华为尽量在华为设备上把STP模式从MSTP改回RSTP或者按厂商建议配置保证大家都在用同一种方言。不同设备的STP模式不统一是导致一些“网络时不时抽风”问题的重要原因。4. MSTP多实例与负载均衡实战4.1 为什么需要MSTP单生成树太浪费链路用STP或RSTP时整个交换网络只有一棵生成树所有VLAN都走这一条路径备份链路永远处于阻塞状态。这在VLAN数量多的场景下非常浪费。举个例子核心交换机A和B之间有一条2G的聚合链路汇聚交换机C分别上联A和B但STP决定了只有A在转发B侧的链路全部闲置等于花了两份钱买了一层的带宽。思科早期用PVSTPer VLAN Spanning Tree每VLAN生成树解决这个问题每个VLAN单独跑一棵树不同VLAN可以阻塞不同的端口实现链路负载均衡。但PVST有两个问题一是VLAN多了之后CPU开销大BPDU数量成倍增加二是和标准的802.1D/RSTP兼容性差跨厂商互通困难。MSTPMultiple Spanning Tree Protocol多生成树协议即802.1s就是在这个背景下出现的。MSTP的核心思想是把多个VLAN映射到同一个实例Instance每个实例独立计算生成树。这样既实现了不同VLAN走不同路径的负载均衡又控制了实例数量不会太多不会造成CPU负载过重。比如一个网络里有50个VLAN你完全可以把50个VLAN映射到2个或3个实例里两个实例分别走两条上联链路既实现冗余又实现负载分担。4.2 MSTP核心概念域、IST、CIST、MSTIMSTP引入了几个新概念很多人第一次学的时候容易被绕晕。首先是MST域MST Region它是一组交换机组成的集合这些交换机必须满足三个条件才能属于同一个域域名称相同、修订级别相同、VLAN与实例的映射关系相同。每个MST域对外表现就像一个“虚拟的交换机”内部多个实例共享同一个状态。其次是实例的概念。实例0比较特殊叫ISTInternal Spanning Tree内部生成树它负责整个MST域内部的链路通信并且负责MST域与外部STP/RSTP网络的互通。实例1到实例15是MSTIMultiple Spanning Tree Instance多生成树实例每个实例对应一棵独立的生成树不同实例独立选举根桥、根端口和指定端口。整个网络级别的生成树叫CISTCommon and Internal Spanning Tree公共与内部生成树它把所有的MST域和单生成树设备统一连接成一棵大树。理解这套层级关系可以类比成一个国家多个省份CIST是全国高速公路骨干网每个MST域是一个省省内的IST是省的内部路网MSTI则是省内的专项道路比如货运通道、客运通道。数据在域内走实例跨域走CIST。4.3 实战拓扑规划双核心双链路负载均衡接下来我们进入实战环节。我先描述一个我经常用到的两核心组网拓扑然后给出完整的MSTP负载均衡配置。拓扑结构如下核心交换机A和核心交换机B两台上行分别连接防火墙和出口路由器汇聚交换机C1和C2分别下挂接入交换机。C1和C2各两条万兆链路上联到A和B形成C1-A、C1-B、C2-A、C2-B四条链路。VLAN划分为业务VLAN 10和办公VLAN 20我们希望VLAN 10的业务流量从A走VLAN 20的办公流量从B走这样两条上联链路都能用起来任何一台核心交换机发生故障时另一台能接管所有VLAN。为了实现这个目标我的VLAN与实例映射规划如下实例1承载VLAN 10实例2承载VLAN 20。在A上把实例1的优先级调成最小让A成为实例1的根桥在B上把实例2的优先级调成最小让B成为实例2的根桥。这样数据帧的走向分别是VLAN 10的流量倾向于从C1-A-C2这条路径走VLAN 20的流量倾向于从C1-B-C2这条路径走。整个网络的STP/RSTP就变成了两个独立生成树各自调度链路利用率直接翻倍。4.4 华为/华三交换机MSTP配置实战下面以华为华三兼容的命令行风格给出完整的MSTP配置步骤。假设VLAN已经创建完毕VLAN 10和VLAN 20已经分配到接口上我们直接看STP部分。第一步在每台交换机上启用MSTP模式。默认情况下华为交换机运行的是MSTP但为了保险起见还是显式配置一下system-view stp mode mstp第二步配置MST域信息四台交换机要完全一致这一步是新手最容易忽略的stp region-configuration region-name HADOOP revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration注意active region-configuration这条命令必须有执行之后新的域配置才会生效。四台交换机上的域名称、修订级别、映射关系必须一字不差否则它们被视为处于不同域MSTP的效果就完全发挥不出来会退化成CIST计算你的负载均衡策略也就失效了。第三步设置根桥优先级。核心交换机A上让实例1成为根桥同时设置实例2的次优先备根桥核心交换机B上反之# 核心交换机A stp instance 1 root primary stp instance 2 root secondary# 核心交换机B stp instance 2 root primary stp instance 1 root secondarystp root primary等价于把设备的实例优先级设置为4096stp root secondary设置为8192。如果你喜欢手动配置可以直接写stp instance 1 priority 4096效果是一样的。手动配置的好处是优先级清清楚楚方便文档记录和查询。第四步把连接终端的接入端口配置为边缘端口并开启BPDU保护interface GigabitEthernet0/0/1 port link-type access port default vlan 10 stp edged-port enable开启全局BPDU保护stp bpdu-protection第五步对于核心和汇聚之间的链路如果做了链路聚合要确保STP在聚合口上运行而不是物理口上单独运行。通常华为交换机会自动把聚合口看作一个逻辑口参与STP计算不需要额外配置。但记住一点聚合组内的物理成员端口别单独配STP参数否则容易造成STP计算混乱。4.5 验证命令与结果观察配置完MSTP之后必须验证每条链路的状态确认负载均衡是否真的生效。在核心交换机A上执行display stp instance 1 brief和display stp instance 2 brief观察端口角色。理想情况下实例1中A的端口全部是指定端口DESIC上联到A的端口是根端口ROOT上联到B的口是备用端口ALTE实例2中情况反过来C上联到B的口是根端口上联到A的口是备用端口。我实践中的验证结果大概是这样[HUAWEI] display stp instance 1 brief MSTID Port Role STP State Protection 1 GigabitEthernet0/0/1 DESI FORWARDING NONE 1 GigabitEthernet0/0/2 DESI FORWARDING NONE[HUAWEI] display stp instance 2 brief MSTID Port Role STP State Protection 2 GigabitEthernet0/0/1 ROOT FORWARDING NONE 2 GigabitEthernet0/0/2 ALTE DISCARDING NONE如果有条件可以再用display stp instance 1 root查看实例1的根桥信息确认根桥ID是你设定的核心A。另外还可以用display stp region-configuration确认四台设备的域配置一致。这里我再提醒一个常见误区MSTP的负载均衡是“按实例分配流量”不是“按包分配流量”。数据帧从C1去C2要么走A要么走B不可能同一时刻一半走A一半走B那是等价路由或负载分担的概念。MSTP的意义是让不同的VLAN/实例使用不同的物理链路做到整体网络带宽的利用而不是单条流的负载均衡。想清楚了这一点就不会被“负载均衡”这四个字带偏。5. 常见问题与排查技巧实录5.1 故障排查速查表STP相关的故障千奇百怪但总结下来无非几类。我把最常见的现象、原因和排查命令整理成了一个速查表建议收藏遇到问题直接对照。故障现象可能原因排查命令新接设备后全网广播风暴新设备没有启用STP或端口是边缘端口收到BPDU后未自动切换display stp interface查看端口STP状态某VLAN的流量延迟大、丢包实例与VLAN映射不一致设备属于不同MST域display stp region-configuration割接后业务恢复慢要40秒以上边缘端口未配置终端接入触发STP收敛display stp interface查看端口是否为边缘端口核心设备上联端口一直被阻塞根桥优先级设置错误非核心设备当选根桥display stp root频繁的拓扑变化通知导致MAC表震荡终端频繁上下线边缘端口没有开启BPDU保护触发了TCdisplay stp topology-change配置了MSTP但负载均衡没生效VLAN到实例的映射只在部分交换机配置display stp instance brief对比各设备端口角色5.2 我踩过的坑三个最容易出问题的环节第一个坑是MST域配置不一致。我在一个项目里遇到过四台交换机配置看起来一模一样但负载均衡就是不生效。查了半天才发现其中一台交换机的修订级别写的是0其余三台是1。域配置一旦不一致MSTP就退化成多棵独立生成树整个二层网络的实际路径会和预期差很多。所以配置完域信息后一定要用display stp region-configuration逐台确认不要只看配置文件就完事。第二个坑是边缘端口没有开BPDU保护。有一次我把交换机的下联口都设成了边缘端口结果有人把两台交换机用网线连在一起环路直接形成广播风暴立即爆发。因为边缘端口收到BPDU之前不会主动参与STP计算我开了BPDU保护之后这种非法接入的端口会直接被shutdown从根源上避免了风暴。开启BPDU保护后要多加留意有时候非法环路被切断后端口处于ERRDISABLE状态手动执行restart才能恢复这在生产环境中也要让人知晓。第三个坑是根桥规划不清晰。小规模网络没有做根桥规划默认优先级都是32768结果某一台性能很差的边缘交换机因为MAC地址最小而当上了根桥整个网络的数据路径全部绕远路延迟增加带宽浪费。后来我养成一个习惯每张网络拓扑图都必须标注根桥、备份根桥的优先级并且打开交换机的SNMP监控如果发现根桥ID发生变化立刻查是不是有人没按规范配置。5.3 从display stp输出定位环路的排查流程如果现场真的发生了环路导致广播风暴我的排查流程是这样的分享给各位参考。先别急着拔线而是找一台能登录的交换机执行display stp看全局状态再执行display stp interface看端口角色和状态快速发现哪些端口处于DISCARDING但又频繁收到BPDU。然后用display stp topology-change查看拓扑变化次数如果数字快速增长说明网络中确实存在反复的链路震荡。定位到可疑端口后再看这个端口收到的BPDU是从哪里来的。display stp interface GigabitEthernet0/0/1会显示接收BPDU计数如果计数一直在涨说明这个口实际连接的是另一台交换机而不是终端。这个时候顺藤摸瓜去找那台交换机就能找到环路点。整个过程基本不需要拔线不会中断业务这是最高效的做法。如果确认是新增设备引发的问题且业务不能中断太久最快速的处理方式是在与它相连的交换机端口上手动执行shutdown从物理层面切断环路等网络稳定后再做配置调整。最后再讲一点心得我个人在实际操作中的体会是STP看似简单但真正能把它用明白的人并不多。很多老工程师处理环路还是老办法——拔线重启这种方法解决问题但从不根治。RSTP和MSTP就是把“拔线”这个动作变成了协议自动完成的事。MSTP的价值又不止于防环它让二层的多链路负载均衡成为了可能。我建议你在自己的实验环境里搭一个双核心双汇聚的小拓扑亲手动动手配置实例映射、改优先级、看端口角色变化。踩过一次坑之后你对STP/MSTP的理解会比看十篇文档都深。要是这篇文章对你有帮助欢迎转发给你的同事让更多人少走弯路。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。