1. 从网络环路到STP一个网络工程师的“救火”日常如果你管理过稍微有点规模的网络尤其是那种有冗余链路的交换机网络那你大概率经历过或者听说过一种让人头皮发麻的故障网络风暴。上一秒还风平浪静下一秒整个网络就卡得跟幻灯片一样甚至直接瘫痪。问题可能就出在一根“好心办坏事”的冗余网线上。今天要聊的STP生成树协议就是网络世界里用来解决这个“好心办坏事”问题的“交通警察”。它不是什么高深莫测的黑科技而是每个网络工程师都必须掌握的基础生存技能。简单说STP的作用就是在存在物理环路的网络中通过算法逻辑上“剪断”一些链路把网络拓扑变成一棵没有环路的“树”从而避免广播风暴、多帧复制和MAC地址表抖动这三大灾难。别被“协议”两个字吓到它的核心思想其实非常朴素在保证连通性的前提下主动制造一点“不完美”阻塞端口来换取整个网络的稳定。2. STP到底解决了什么问题广播风暴的来龙去脉要理解STP的价值必须先搞清楚它要消灭的敌人是什么。在一个纯粹的、由交换机组成的二层网络中数据帧的转发依赖于MAC地址表。交换机通过“学习”每个端口连接设备的MAC地址来知道该把数据帧从哪个端口发出去。但是有三种帧是例外交换机会对它们进行“广播”也就是从除了接收端口以外的所有端口转发出去广播帧目的MAC全F、组播帧在特定情况下和未知单播帧目的MAC不在当前MAC地址表中。现在想象一个最简单的环形网络三台交换机A、B、C两两相连形成一个三角形。假设主机A发送一个广播帧到交换机A。交换机A收到后会从连接交换机B和C的两个端口转发出去。交换机B和C分别收到这个广播帧后同样会从除了接收端口以外的所有端口转发。于是这个广播帧就会在A-B-C-A这个环路上永无止境地跑下去并且每经过一台交换机数量就会翻倍。几秒钟内海量的广播帧就会塞满所有链路的带宽耗尽交换机的CPU资源导致正常通信无法进行——这就是广播风暴。这还只是灾难之一。多帧复制是指由于存在多条路径一个单播帧可能通过不同路径到达目的主机多次导致上层应用出错。MAC地址表抖动则更隐蔽由于同一台主机的帧可能从交换机的不同端口到达交换机会不停地修改该主机MAC地址对应的端口号导致转发效率极低表项极不稳定。所以STP的核心使命就是在物理连接存在环路的情况下通过阻塞Blocking特定端口构建一个逻辑上无环的转发路径。这个被阻塞的端口并不是被关闭了它依然在接收STP的协议报文BPDU只是不转发用户数据流量。一旦活动路径出现故障STP能快速感知并重新计算将某个阻塞端口转换为转发Forwarding状态恢复连通性。这就是网络冗余设计的精髓物理上有环路冗余逻辑上无环路防环故障时能切换高可用。3. STP协议的工作原理一场民主选举与路径选择STP的工作过程可以形象地理解为在网络中举行一场民主选举选出一棵“树”的根然后所有非根交换机都找到一条回“根”的最佳路径。这个过程主要依赖一种叫做BPDU桥协议数据单元的协议报文来传递信息和做出决策。BPDU分为两种配置BPDU用于生成树计算和TCN BPDU用于拓扑变更通知。我们主要看配置BPDU。3.1 核心四要素选举与决策的依据STP的选举和路径选择完全基于BPDU中的四个关键字段。理解它们就理解了STP的逻辑根桥ID这是整个生成树世界的“国王”。谁成为根桥谁就是这棵树的根。根桥ID由两部分组成桥优先级默认32768 交换机MAC地址。数值越小越优先。先比较优先级优先级相同再比较MAC地址MAC地址小的胜出。一个常见的误解是认为性能最强的交换机应该当根桥。实际上根桥的位置决定了流量的主要路径。通常我们会手动将网络核心、位置居中的交换机配置为根桥以避免次优路径。例如将核心交换机的优先级改为4096。根路径开销对于非根交换机来说这是它到达根桥的“成本”。这个成本是累加的。每经过一个交换机端口就会加上这个端口的开销值。开销值与链路带宽密切相关带宽越高开销值越小例如10G链路开销是21G是4100M是19。交换机总是选择累计根路径开销最小的那条路回根桥。发送者桥ID发送当前BPDU报文的交换机的ID同样是优先级MAC。发送者端口ID发送当前BPDU报文的端口的ID由端口优先级端口编号组成。选举和决策就是围绕这些字段的比较展开的遵循一个严格的顺序首先比较根桥ID越小越好如果根桥ID相同意味着来自同一个根则比较根路径开销越小越好如果根路径开销也相同则比较发送者桥ID越小越好最后如果连发送者桥ID都相同意味着是同一台交换机发出的BPDU则比较发送者端口ID越小越好。这个比较顺序是理解所有端口状态决定的关键。3.2 生成树构建五部曲基于以上原则STP构建一棵无环树的过程可以分解为五个清晰的步骤第一步选举唯一的根桥网络初始化时所有交换机都“自以为”是根桥从所有端口向外发送BPDU其中宣称的根桥ID就是自己。当一台交换机从某个端口收到一个BPDU它会拿这个BPDU里宣称的根桥ID和自己的根桥ID做比较。如果收到的BPDU里根桥ID更优更小它就“臣服”了承认那个更优的ID为根桥并停止宣称自己是根桥转而转发那个更优的BPDU。这个过程像涟漪一样扩散最终全网会达成一致选举出唯一一个根桥ID最小的交换机作为根桥。第二步在每个非根交换机上选举根端口根桥选出来后其他所有非根交换机都需要确定一个“根端口”。这个端口是本交换机上到达根桥路径开销最小的那个端口。注意是比较本机各个端口收到的BPDU中所携带的“根路径开销”选择开销最小的那个端口作为RP。如果开销相同则比较发送者桥ID、发送者端口ID。第三步在每个物理网段上选举指定端口这是防环的关键一步。一个物理网段比如连接两台交换机的一条链路上只能有一个指定端口负责向这个网段转发发往根桥方向的流量和BPDU。选举规则是比较这个网段上两端端口发出的BPDU注意是它们“发出”的BPDU所代表的信息。哪个端口发出的BPDU更优哪个端口就成为该网段的指定端口。比较的次序依然是根桥ID - 根路径开销 - 发送者桥ID - 发送者端口ID。根桥上的所有活动端口都是指定端口因为根桥ID最优。第四步阻塞剩余端口——预备端口既不是根端口也不是指定端口的端口将被置为阻塞状态。这个端口就是被逻辑“剪断”的链路。它只监听BPDU不转发任何用户数据帧从而打破了环路。第五步端口状态迁移端口不是瞬间从阻塞变成转发的这中间有一个学习过程防止临时环路。STP定义了5种端口状态禁用端口被管理员关闭。阻塞只接收BPDU不学习MAC地址不转发数据帧。持续20秒默认。侦听接收并发送BPDU不学习MAC地址不转发数据帧。持续15秒。在这个状态确定端口的角色根端口/指定端口。学习接收并发送BPDU开始学习MAC地址但仍不转发数据帧。持续15秒。这个状态是为了让交换机在转发前建立MAC地址表避免初期的大量未知单播泛洪。转发正常接收、发送BPDU和数据帧学习MAC地址。从阻塞到转发总共需要30-50秒默认。这个延迟是STP最大的缺点之一对于现代网络来说太长了。4. RSTP对经典STP的“外科手术式”优化正因为经典STPIEEE 802.1D的收敛速度慢30-50秒无法满足现代网络需求RSTP快速生成树协议IEEE 802.1w应运而生。RSTP并非一个全新的协议它兼容STP但对其机制进行了大幅优化将收敛时间缩短到1秒以内。它主要做了以下几点改进1. 端口角色与状态的精简RSTP将端口角色明确为4种根端口、指定端口、预备端口、备份端口。其中备份端口是针对同一台交换机上两个端口连接到同一网段通常是由于使用了集线器或错误布线而设计的。更重要的是它将端口状态简化为3种丢弃对应STP的禁用/阻塞/侦听、学习、转发。这样简化了状态机决策更快。2. 引入了端口角色快速切换机制这是RSTP快的关键。它定义了两种端口类型边缘端口和点对点链路。边缘端口直接连接终端设备如PC、服务器的端口。这类端口不会形成环路因此可以跳过侦听和学习状态直接进入转发状态。这在交换机刚启动或端口刚启用时非常有用。配置命令以华为交换机为例stp edged-port enable。但务必注意如果错误地将连接交换机的端口配置为边缘端口会立即引起环路。点对点链路全双工链路被认为是点对点链路。RSTP交换机之间通过一种快速的握手协议Proposal/Agreement机制可以在几毫秒内协商完成端口的快速转发无需等待计时器超时。3. BPDU格式与处理方式的改变在RSTP中BPDU被视为一种“心跳”报文。每台交换机都会主动地、周期性地每2秒从指定端口和根端口向外发送BPDU即使没有收到根桥的BPDU也会发送。而在STP中只有根桥会主动发送BPDU其他交换机只是转发。这个改变使得链路故障能被邻居交换机快速感知收不到连续3个Hello包约6秒从而触发重新计算。4. 拓扑变更机制的优化STP的拓扑变更机制非常笨重一旦检测到变更根桥会向全网发送TCN BPDU最后根桥发出一个TC标志置位的配置BPDU所有交换机收到后将MAC地址表老化时间缩短为15秒转发延迟。RSTP则更高效检测到拓扑变更的交换机会直接从其根端口和指定端口向外发送TC标志置位的BPDU收到该BPDU的交换机会清空相关端口上学到的MAC地址并继续泛洪这个TC BPDU。这样变更信息能更快传递且只清空必要的表项。配置示例在华为交换机上启用RSTP并配置根桥system-view sysname SW-Core stp mode rstp // 全局启用RSTP模式 stp root primary // 设置本机为主根桥自动将优先级设为0 // 或者手动设置优先级 // stp priority 4096 interface GigabitEthernet 0/0/1 stp point-to-point force-true // 强制指定为点对点链路加速收敛 stp edged-port disable // 确保连接交换机的端口不是边缘端口5. MSTP面向业务的多实例生成树RSTP解决了收敛慢的问题但还有一个问题它仍然只计算一棵树。这意味着所有VLAN的流量都走同一路径无法实现流量的负载分担而且会阻塞掉一些本来可以使用的健康链路造成带宽浪费。MSTP多生成树协议IEEE 802.1s就是为了解决这个问题。它的核心思想是“实例化”。MSTP可以将多个VLAN映射到一个生成树实例上。每个实例独立计算一棵生成树。这样我们可以让Instance 1的流量走链路AInstance 2的流量走链路B实现了不同VLAN流量的负载均衡。MSTP的几个关键概念MST域一组运行MSTP且配置相同的交换机的集合。域内交换机通过MSTP BPDU交换信息。域间则运行传统的STP/RSTP。MSTI多生成树实例。每个实例独立运行一棵生成树算法。实例0是默认实例称为CIST公共和内部生成树所有VLAN默认映射到实例0。VLAN映射表定义了VLAN与MSTI的映射关系。这是配置MSTP的关键。配置示例在华为交换机上配置MSTP实现负载分担假设有VLAN 10和VLAN 20希望它们的流量分别走不同的上行链路。system-view stp mode mstp // 启用MSTP模式 stp region-configuration // 进入MST域配置视图 region-name DataCenter // 配置域名域内所有交换机必须相同 instance 1 vlan 10 // 将VLAN 10映射到实例1 instance 2 vlan 20 // 将VLAN 20映射到实例2 active region-configuration // 激活配置必须执行 // 在核心交换机上配置实例1的根桥和实例2的备份根桥 stp instance 1 root primary stp instance 2 root secondary // 在接入交换机上配置不同实例的端口优先级引导流量 interface GigabitEthernet 0/0/1 // 上行链路1 stp instance 1 port priority 16 // 为实例1设置较高优先级值小优先使其成为指定端口 stp instance 2 port priority 128 // 为实例2设置较低优先级使其被阻塞 interface GigabitEthernet 0/0/2 // 上行链路2 stp instance 1 port priority 128 stp instance 2 port priority 16通过以上配置VLAN 10的流量会优选GE0/0/1路径VLAN 20的流量会优选GE0/0/2路径实现了基于VLAN的负载分担。6. 生成树配置实战与排错心法理论懂了命令也看了但真正上设备配置和排错时还是容易懵。这里分享一些实战中的配置要点和排错思路。6.1 基础配置最佳实践明确规划根桥位置永远不要依赖默认选举。手动将网络核心、性能稳定、位置居中的交换机设置为主根桥stp root primary并在另一台核心交换机上设置为备根桥stp root secondary。这能保证生成树拓扑的稳定和最优。启用边缘端口在所有连接终端主机、服务器的接入端口上务必启用stp edged-port enable华为或spanning-tree portfast思科。这能让你在重启接入交换机或主机时业务几乎感觉不到中断。但这是把双刃剑配置前必须百分百确认该端口下不会连接其他交换机或集线器。调整链路开销如果有多种带宽的链路比如10G和1G并存可能需要手动调整端口开销以确保流量走期望的高带宽路径。命令如stp cost 2000。启用BPDU保护在边缘端口上启用BPDU保护stp bpdu-protection。一旦该端口收到BPDU报文交换机立即将其关闭并告警。这能有效防止用户私自接入交换机破坏生成树拓扑。启用根保护在期望永远成为指定端口的端口上如下行连接到接入交换机的端口启用根保护stp root-protection。如果该端口收到了更优的BPDU它会立即进入“Discarding”状态防止其成为根端口从而保护根桥的地位不被意外抢占。6.2 经典排错场景与排查链路当网络出现环路症状全网卡顿、丢包、CPU高时如何定位是否是STP问题第一步快速隔离如果条件允许最直接的方法是拔掉你认为可能的冗余链路之一观察网络是否立即恢复。如果恢复基本确定是二层环路问题。第二步查看STP状态登录核心和疑似环路上的交换机查看生成树状态。display stp brief这是最常用的命令可以快速查看所有端口的角色Role和状态Sts。重点关注是否存在多个根桥正常情况下display stp命令显示的CIST Root应该指向同一台设备。端口角色是否异常例如一个连接主机的端口角色是ALTE预备端口或ROOT根端口这很可能不对。端口状态是否长期处于DISCARDING或LEARNING这可能是BPDU收发有问题。第三步检查BPDU在可疑端口上抓包或使用display stp interface interface-type interface-number命令查看该端口是否在正常收发BPDU。如果收不到BPDU可能是链路问题、对端未开启STP或者端口被错误配置为边缘端口。第四步检查配置边缘端口误配置这是最常见的人为错误。检查所有连接交换机的端口是否被误配了stp edged-port enable。单向链路故障物理链路一端UP一端DOWN但UP的一端可能还在收发数据导致BPDU无法传递形成环路。检查端口日志是否有up/down抖动记录。STP模式不一致网络中有交换机运行STP有的运行RSTP可能导致兼容性问题。统一模式为RSTP或MSTP是更好的选择。TCN攻击某些低劣的网络设备或攻击软件会疯狂发送TCN BPDU导致全网交换机频繁刷新MAC表造成网络不稳定。可以在全局下配置stp tc-protection来限制TC报文的处理速率。一个真实的踩坑案例某次扩容后部分用户反映间歇性卡顿。display stp brief发现一台接入交换机的上行端口角色在DESI指定端口和ALTE预备端口之间频繁切换。进一步检查发现该上行光模块的光功率处于临界值导致链路间歇性闪断。每次闪断STP就重新计算端口在侦听/学习状态等待30秒期间该网段业务中断。更换光模块后问题解决。教训STP的频繁收敛很多时候是底层链路不稳定的表象排错时不要只盯着STP配置也要关注物理层状态。7. 超越STP现代数据中心网络的替代方案虽然STP/RSTP/MSTP在园区网和传统企业网中仍是基石但在对收敛时间要求极高毫秒级、规模巨大的现代数据中心和云网络中它们已经力不从心。于是出现了一些替代技术堆叠/集群技术如华为的iStack/CSS思科的StackWise/VSS。它将多台物理交换机虚拟化成一台逻辑交换机。在逻辑交换机内部使用私有协议进行链路聚合和负载分担完全避免了二层环路因此无需运行STP。这是目前接入-汇聚层最主流的方案管理简单可靠性高。以太网链路聚合如LACP。虽然它本身不防环但通过将多条物理链路捆绑成一条逻辑链路既增加了带宽又避免了STP因阻塞端口造成的带宽浪费。通常与堆叠或MSTP结合使用。透明互联如思科的FabricPath华为的TRILL以及标准的SPB。这些技术通过在二层帧外封装一个新的帧头使二层网络具备类似三层的路由能力可以实现无环的多路径转发彻底摆脱了对生成树的依赖。EVPN VXLAN这是当前云数据中心的主流 overlay 技术。它在三层IP网络上构建虚拟的二层网络。底层IP网络使用高效的IGP路由协议如OSPF、IS-IS天然无环且收敛快。Overlay的二层流量通过VXLAN隧道传输完全规避了物理二层网络的环路问题。STP在这里仅可能存在于Underlay网络的边缘或者某些特定的传统接入场景中。所以作为一名网络工程师我的体会是STP是必须深刻理解的经典协议它是你网络知识的“基本功”。但在实际的新建网络设计中尤其是数据中心应该优先考虑堆叠、EVPN VXLAN等更先进的技术来规避STP的缺陷。理解STP很多时候是为了更好地排错以及知道在什么场景下可以不用它。当你看到网络拓扑中还有大量的端口处于BLK状态时也许就该思考一下当前的网络架构是否应该进化了。