1. 为什么要在模拟器里折腾生成树协议很多人第一次接触交换机配置都是从划分VLAN开始的。把不同端口塞进不同的广播域看着PC之间该通的通、该隔离的隔离感觉网络这玩意儿也不过如此。但只要你在拓扑里多接一根网线形成一个环路整个网络瞬间就瘫了——广播帧在环里无限打转CPU飙到百分之百所有业务中断。这就是二层环路带来的广播风暴也是每个网络从业者迟早要面对的问题。生成树协议Spanning Tree Protocol简称STP就是专门用来解决这个问题的。它的核心思路很朴素在存在物理环路的网络中通过一套选举机制逻辑上阻塞掉某些端口把环形拓扑修剪成一棵没有环的树。一旦主链路故障被阻塞的端口再自动打开恢复连通性。整个过程对终端用户透明不需要人工干预。那为什么要在华为eNSP模拟器里做这件事因为真机环境做STP实验有几个绕不开的麻烦一是需要至少三台交换机和一堆网线成本不低二是STP的收敛过程、端口状态切换、根桥选举这些细节在真机上观察起来很不直观抓包和日志查看也不方便三是如果配置失误导致环路真机网络会直接瘫痪影响面大。eNSP作为华为官方的网络模拟平台能完整模拟华为VRP系统的STP行为支持抓包、命令行调试、拓扑可视化是学习和验证STP配置最理想的沙盘。这篇文章面向的是已经掌握交换机基础操作、想深入理解STP工作机制并动手配置的读者。我会从拓扑搭建开始一步步带你完成根桥指定、端口角色分析、边缘端口配置、BPDU保护等核心操作同时把每一步背后的原理讲清楚。文章里涉及的设备型号、接口编号都是模拟器里的虚拟对象你可以直接照着复现。2. 实验拓扑搭建与基础环境准备2.1 三台交换机环形拓扑的搭建思路做STP实验拓扑不能太简单。如果只连两台交换机一条线直连根本形不成环路STP没有用武之地。至少要三台交换机首尾相连构成一个三角形这样才有冗余路径STP才有阻塞端口的必要。在eNSP里我建议用三台S5700系列交换机型号选S5700-28C-HI或者S5700-28C-EI都行它们对STP的支持很完整。每台交换机之间用两条线连接形成三角形环路。具体连接方式如下SW1的GE0/0/1口连SW2的GE0/0/1口SW2的GE0/0/2口连SW3的GE0/0/1口SW3的GE0/0/2口连SW1的GE0/0/2口这样三台交换机两两之间都有链路物理上形成了一个闭合的三角形。如果不跑STP随便一台PC发个广播包这个包就会在三角形里永远转下去。再给每台交换机下挂一台PC用于后续测试连通性。PC的IP地址规划在同一网段比如192.168.1.0/24SW1下挂PC1192.168.1.1SW2下挂PC2192.168.1.2SW3下挂PC3192.168.1.3。交换机上不需要配IP它们工作在二层只负责转发。注意eNSP里交换机的接口默认是二层接口不需要像路由器那样配IP地址。如果你要给交换机配管理IP需要先创建VLAN接口这个后面会提到。2.2 启动设备前必须检查的几个细节拓扑画好之后别急着点启动。有几个地方如果没注意后面会浪费大量时间排查。第一确认eNSP的版本和VRP镜像。不同版本的eNSP对STP的支持略有差异建议用eNSP 1.3及以上版本VRP镜像用V200R003或更高。低版本可能不支持某些STP扩展特性比如边缘端口、BPDU保护等。第二检查每台交换机的启动配置。新拖出来的交换机默认配置是空的STP默认是开启的模式是MSTP华为设备默认运行MSTP兼容STP和RSTP。这一点很关键——很多人以为默认是STP其实华为交换机出厂默认就是MSTP模式。MSTP兼容STP所以在只跑STP的场景下不需要刻意切换模式但你要知道当前运行的是什么。第三连线的时候注意接口编号。eNSP里交换机的接口是从GE0/0/1开始编号的别连错了口。连完之后在拓扑图上双击交换机进入命令行界面用display interface brief确认接口状态是UP的。如果接口是DOWN的检查线缆是否连接正确或者换一个接口试试。第四PC的配置。eNSP里的PC需要手动配置IP地址双击PC图标在基础配置里填IP、子网掩码和网关。网关可以填交换机上对应VLAN接口的IP但在这个实验里PC之间同网段通信不需要网关所以网关可以留空。2.3 初始状态下的环路验证在配置STP之前我们先验证一下环路的危害。三台交换机启动完成后STP默认是开启的所以实际上环路已经被STP自动破除了。如果你想看到广播风暴的效果需要先把STP关掉。在每台交换机上执行system-view stp disable三台都关掉STP之后用PC1去ping PC2。你会发现ping不通或者时通时不通延迟极大。同时在交换机上查看接口流量会看到接口的广播包数量疯狂增长。这就是广播风暴的典型表现。验证完之后记得把STP重新开启system-view stp enable这个验证步骤很重要它能让你直观感受到STP存在的意义。很多人配了半天STP却不知道没有STP会怎样理解就不够深刻。3. 根桥选举与端口角色深度拆解3.1 根桥是怎么选出来的STP的核心是选举一棵树树根就是根桥Root Bridge。整个网络里只能有一个根桥所有其他交换机都是非根桥。根桥上的所有端口都是指定端口处于转发状态非根桥上会有一个根端口离根桥最近的端口其他端口可能被阻塞。根桥的选举依据是桥IDBridge ID桥ID由优先级和MAC地址组成优先级占2字节MAC地址占6字节。优先级默认是32768取值范围是0到61440步长4096。选举时先比优先级优先级小的胜出如果优先级相同再比MAC地址MAC地址小的胜出。在eNSP里三台交换机的默认优先级都是32768所以最终根桥是由MAC地址决定的。你可以用display stp命令查看每台交换机的桥ID和根桥信息。display stp输出里会显示类似这样的信息CIST Bridge :32768.4c1f-cc8e-1a00 CIST Root/ERPC :32768.4c1f-cc8e-1a00 / 0其中32768.4c1f-cc8e-1a00就是桥ID前面的32768是优先级后面的4c1f-cc8e-1a00是MAC地址。CIST Root显示的是当前网络里的根桥ID如果和本机桥ID一致说明本机就是根桥。3.2 手工指定根桥的两种方式在实际网络里我们通常不希望根桥由MAC地址随机决定而是人为指定一台性能好、位置核心的交换机作为根桥。华为交换机提供了两种指定方式。第一种是直接设置优先级system-view stp priority 4096把优先级设成4096比默认的32768小这台交换机就会成为根桥。优先级必须是4096的倍数比如0、4096、8192、12288等。设成0的话这台交换机就是最高优先级的根桥除非有其他交换机也设成0那就再比MAC。第二种是用stp root primary命令system-view stp root primary这条命令实际上是把优先级设成了0。对应的还有stp root secondary把优先级设成4096作为备用根桥。这种方式更直观不用自己算优先级数值。我个人的习惯是用stp root primary和stp root secondary因为语义清晰不容易记错优先级数值。但在一些需要精细控制优先级的场景里直接设priority更灵活。指定完根桥之后用display stp确认一下。在根桥交换机上CIST Root应该和CIST Bridge一致在非根桥上CIST Root显示的是根桥的桥IDCIST Root/ERPC后面的数字是到根桥的开销。3.3 端口角色的判定逻辑根桥选出来之后每台非根桥需要确定自己的根端口。根端口是到根桥开销最小的端口。开销和链路带宽有关带宽越高开销越小。华为设备默认使用IEEE 802.1t标准计算开销具体数值如下链路带宽默认开销值10Mbps2000000100Mbps2000001Gbps2000010Gbps2000在eNSP里交换机之间的链路通常是1Gbps所以开销是20000。如果一台非根桥有两个端口都能到根桥就比较这两个端口到根桥的累计开销小的成为根端口。如果开销相同再比发送者的桥ID小的胜出还相同就比发送者的端口ID小的胜出。除了根端口和指定端口剩下的端口就是阻塞端口Alternate Port处于Discarding状态不转发数据但会监听BPDU。你可以用display stp brief查看所有端口的角色和状态display stp brief输出类似MSTID Port Role STP State Protection 0 GE0/0/1 ROOT FORWARDING NONE 0 GE0/0/2 ALTE DISCARDING NONEROOT表示根端口ALTE表示阻塞端口DESI表示指定端口。这个命令非常实用配置完之后第一时间用它确认端口角色是否符合预期。3.4 根桥抢占与优先级调整的实战技巧有时候你修改了优先级但根桥没有立刻切换这是因为STP有抢占延迟。默认情况下华为交换机的抢占是关闭的需要手动开启system-view stp root-protection等等这里要区分清楚。stp root-protection是根保护用在指定端口上防止下游交换机成为根桥。而抢占是另一回事。在RSTP和MSTP里如果新交换机的优先级更高它会等一段时间才抢占根桥角色这个时间由stp timer控制。华为设备默认不开启抢占也就是说即使你后来把某台交换机的优先级设得更低它也不会立刻抢回根桥除非重启STP或者手动触发。如果你想让优先级更高的交换机立刻成为根桥可以在修改优先级后执行reset stp这个命令会重置STP状态触发重新选举。但要注意重置STP会导致短暂的网络震荡生产环境慎用。在模拟器里随便折腾没关系。另一个技巧是如果你不确定当前根桥是谁可以用display stp root快速查看display stp root这个命令会直接告诉你根桥的ID和从本机到根桥的开销比翻完整的STP信息快得多。4. 边缘端口与BPDU保护配置4.1 边缘端口解决的是什么问题在STP网络里交换机上的端口如果连接的是终端设备比如PC、打印机、服务器这些设备不会发送BPDU也不参与STP计算。但默认情况下交换机端口从UP到转发状态需要经过Listening和Learning两个阶段各15秒总共30秒。这意味着你把PC插到交换机上要等30秒才能上网。对于频繁插拔的场景这个延迟很烦人。边缘端口Edge Port就是解决这个问题的。把连接终端的端口配置成边缘端口后端口一UP就立刻进入转发状态不参与STP计算也不发送BPDU。这样PC插上就能用体验好很多。在华为交换机上配置边缘端口system-view interface GigabitEthernet 0/0/3 stp edged-port enable这里假设GE0/0/3连接的是PC。配置完之后用display stp brief查看该端口的状态应该是FORWARDING角色是DESIProtection字段可能显示NONE。4.2 边缘端口配错会带来什么后果边缘端口虽然方便但有一个巨大的风险如果边缘端口连接的不是终端而是另一台交换机那么这台交换机发送的BPDU会被边缘端口忽略。更糟糕的是如果这个边缘端口收到了BPDUSTP会把它重新变成普通端口参与生成树计算导致网络拓扑震荡。我见过一个真实的案例当然是在模拟环境里复现的某台交换机的GE0/0/5口配置了边缘端口本来连的是一台PC后来有人把一台小交换机插到了这个口上。小交换机发送BPDU边缘端口收到后触发了STP重新计算导致整个网络的根端口和阻塞端口全部重新选举网络中断了十几秒。虽然最终恢复了但这种震荡在生产环境里是不可接受的。所以配置边缘端口的前提是你百分之百确定这个端口连接的是终端设备不会再有交换机接进来。如果做不到这一点就需要配合BPDU保护使用。4.3 BPDU保护的工作原理与配置BPDU保护BPDU Protection是配合边缘端口使用的一种安全机制。它的逻辑是如果边缘端口收到了BPDU说明有交换机接入了这个本应连接终端的端口此时BPDU保护会直接把该端口关闭Error-Down并记录日志防止网络震荡。配置方法system-view stp bpdu-protection这是一条全局命令开启后对所有边缘端口生效。注意BPDU保护只对边缘端口有效普通端口收到BPDU是正常行为不会触发保护。开启BPDU保护后如果边缘端口收到BPDU端口会进入Error-Down状态。你可以用display interface查看端口状态会看到类似ERROR DOWN (bpdu-protection)的提示。要恢复端口需要手动执行interface GigabitEthernet 0/0/3 shutdown undo shutdown或者配置自动恢复system-view error-down auto-recovery cause bpdu-protection interval 30这样端口会在30秒后自动恢复。自动恢复的时间可以根据实际需求调整但要注意如果导致端口Error-Down的交换机还在恢复后端口会再次被关闭形成反复震荡。所以根本的解决办法还是找到误接的交换机把它移除。4.4 边缘端口和BPDU保护的联合验证配置完成后我们来做一次验证。在SW1的GE0/0/3口连接PC1上配置边缘端口和BPDU保护system-view stp bpdu-protection interface GigabitEthernet 0/0/3 stp edged-port enable然后用一根线把SW1的GE0/0/3口和SW2的某个空闲口连起来模拟误接交换机。观察SW1的GE0/0/3口状态应该会变成Error-Down。用display stp brief查看该端口应该不再出现在STP端口列表里。这个验证过程能让你深刻理解BPDU保护的价值。在实际网络里这种误接的情况并不少见尤其是办公区工位上的网口用户可能随手就把自己的小交换机接上去了。有了BPDU保护至少不会导致整个网络瘫痪。5. 收敛过程观察与常见故障排查5.1 链路故障时的STP收敛过程STP的价值不仅在于防环还在于链路冗余。当主链路故障时被阻塞的端口会自动打开恢复连通性。这个过程叫收敛。在eNSP里你可以这样验证先确认当前拓扑里哪个端口是阻塞的用display stp brief找到ALTE状态的端口。然后断开对应的链路在拓扑图上右键点击线缆选择删除观察STP状态变化。以三台交换机的三角形拓扑为例假设SW1是根桥SW2的GE0/0/2口是阻塞端口。当你断开SW2和SW3之间的链路时SW2的GE0/0/2口会从Discarding变成Forwarding流量切换到这条路径上。整个过程在RSTP模式下通常只需要几秒在STP模式下可能需要30到50秒。你可以用PC1持续ping PC2观察丢包情况。在STP模式下会看到连续几十个ping超时然后恢复在RSTP模式下丢包会少很多通常只有几个。华为交换机默认运行MSTPMSTP兼容RSTP所以收敛速度比传统STP快。如果你想体验传统STP的慢收敛可以手动切换模式system-view stp mode stp切换后收敛时间会明显变长。这个对比实验能让你直观感受到RSTP和MSTP在收敛速度上的优势。5.2 常见故障一根桥位置不符合预期这是最常见的STP问题。你明明把某台交换机设成了根桥但display stp显示根桥是另一台。原因通常有几个一是优先级没有生效。检查命令是否输入正确stp priority的值必须是4096的倍数如果不是交换机会自动调整到最近的合法值。比如你输入stp priority 1000实际生效的可能是0或者4096具体取决于设备实现。二是配置没有保存。在eNSP里配置是即时生效的但如果你重启了设备没有保存的配置会丢失。记得用save命令保存配置。三是有其他交换机的优先级更低。比如你把SW1设成4096但SW2之前被设成了0那SW2仍然是根桥。用display stp查看所有交换机的桥ID确认优先级数值。排查步骤在每台交换机上执行display stp | include Bridge对比桥ID找出优先级最低的那台。然后检查它的配置看是否被意外修改过。5.3 常见故障二端口一直处于Discarding状态如果某个端口一直不转发用display stp brief看到状态是DISCARDING角色是ALTE这通常是正常的说明STP把它阻塞了防止环路。但如果你希望这个端口转发就需要调整STP参数让它成为根端口或指定端口。调整的方法有几种一是降低该端口所在交换机的优先级让它更接近根桥二是调整端口开销用stp cost命令手动设置一个更小的开销值三是调整端口优先级用stp port priority命令数值越小越优先。比如你想让SW2的GE0/0/2口成为根端口可以这样操作interface GigabitEthernet 0/0/2 stp cost 1000把开销设成1000比默认的20000小很多这样这个端口到根桥的累计开销就会变小更有可能成为根端口。但要注意修改开销会影响整个STP计算可能导致其他端口角色变化改完之后一定要用display stp brief确认所有端口角色是否符合预期。5.4 常见故障三BPDU保护导致端口Error-Down如果你开启了BPDU保护然后发现某个边缘端口突然不通了用display interface看到ERROR DOWN (bpdu-protection)说明这个端口收到了BPDU。原因就是这个端口连接了交换机而不是终端。解决办法先确认这个端口到底连了什么。如果是误接拔掉交换机然后恢复端口interface GigabitEthernet 0/0/3 shutdown undo shutdown如果这个端口确实需要连接交换机那就不能配边缘端口应该用undo stp edged-port取消边缘端口配置让它参与正常的STP计算。提示在排查BPDU保护导致的Error-Down时可以查看日志display logbuffer里面会记录端口被关闭的原因和时间帮助你快速定位问题。5.5 用抓包工具观察BPDU交互eNSP支持抓包功能在拓扑图上右键点击链路选择“开始抓包”然后用Wireshark打开抓包文件。你可以看到交换机之间交互的BPDU报文。BPDU报文里包含了很多关键信息根桥ID、发送者桥ID、端口ID、开销、消息年龄、最大年龄、Hello时间、转发延迟等。通过分析BPDU你能更深入地理解STP的选举过程。比如你可以观察根桥发送的BPDU和普通交换机发送的BPDU有什么区别。根桥发送的BPDU里根桥ID和发送者桥ID是一样的开销为0非根桥发送的BPDU里根桥ID是根桥的ID发送者桥ID是自己的ID开销是到根桥的累计开销。抓包分析是学习STP最有效的方法之一比单纯看命令行输出直观得多。建议在配置前后各抓一次包对比BPDU的变化。6. 从模拟器到真实网络的迁移建议在eNSP里把STP配通了不代表在真实网络里就能直接上手。模拟器和真机之间有一些差异需要特别注意。第一真机的STP默认模式可能不同。华为交换机默认是MSTP但有些型号或者某些软件版本可能默认是STP。上机之前先用display stp确认当前模式如果不是MSTP根据网络规划决定是否切换。第二真机的端口开销计算可能受配置影响。有些交换机支持手动配置开销标准比如stp pathcost-standard命令可以切换IEEE 802.1d和IEEE 802.1t标准。不同标准的开销值差异很大迁移时需要确认两端设备使用相同的标准。第三真机的BPDU保护、根保护、环路保护等特性需要根据实际网络拓扑合理部署。比如根保护应该配置在根桥的指定端口上防止下游交换机抢占根桥环路保护应该配置在根端口上防止单向链路导致环路。这些保护特性在模拟器里可以随便试但在真机上配错了可能导致网络中断一定要在维护窗口操作。第四真机的STP收敛时间受网络规模影响。模拟器里只有三台交换机收敛很快真实网络里可能有几十台交换机收敛时间会明显增加。如果对收敛时间有要求可以考虑部署RSTP或MSTP并优化Hello时间、转发延迟等参数。第五真机上修改STP参数前一定要备份配置。STP是二层网络的基础协议改错了影响面很大。建议先在模拟器里验证方案确认无误后再在真机上实施。实施时最好分批次进行先改非核心设备观察一段时间后再改核心设备。我在实际项目里遇到过因为STP优先级配置错误导致根桥位置偏移的情况。原本规划核心交换机做根桥结果因为优先级没设对接入层的一台交换机成了根桥导致大量流量绕行延迟增加。后来通过display stp逐台排查才发现是接入层交换机的优先级被误设成了0。这个教训告诉我STP配置完成后一定要用display stp root确认根桥位置不能想当然。另外边缘端口的配置在真实网络里要格外谨慎。办公区工位上的网口你永远不知道用户会插什么设备。我的做法是所有连接终端的端口都配边缘端口加BPDU保护同时开启Error-Down自动恢复恢复时间设成60秒。这样即使误接交换机端口会被关闭60秒后自动尝试恢复如果误接设备还在会再次关闭形成保护循环但不会影响其他端口。最后分享一个查看STP拓扑的实用命令display stp topology-change这个命令可以查看拓扑变化的历史记录包括变化时间、变化端口、变化原因等。当网络出现震荡时这个命令能帮你快速定位是哪个端口、什么原因导致的拓扑变化。在模拟器里多练几次把这个命令用熟到了真机环境排查问题时能省不少时间。