尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STP生成树协议详解:二层环路、广播风暴与RSTP快速收敛

STP生成树协议详解:二层环路、广播风暴与RSTP快速收敛 如果面试官突然问你两台交换机之间用两根网线连着会发生什么我见过不少刚入行的朋友想都不想就答“冗余备份啊”结果第一轮就被刷了。正确答案是如果没开STP生成树协议这两根线会在几秒内把你的网络打成广播风暴整层楼都上不了网。STPSpanning Tree Protocol生成树协议是网络工程师绕不过去的核心知识点不管你是准备软考网络工程师还是去面运维岗、数通岗几乎必考。这篇文章我就把STP从头到尾给你捋一遍二层环路为什么会出问题、STP怎么解决、三大选举怎么比、收敛时间怎么算、RSTP快在哪、华为和思科设备怎么配最后再附一份考点自查清单。内容按0基础也能看懂的标准写但细节绝对够你应付考试和面试。1. 二层环路的三宗罪广播风暴、MAC漂移、多帧复制1.1 广播风暴环路是你的第一台“广播放大器”先搞清楚一个前提交换机是二层设备它不像路由器那样会隔离广播域。当交换机收到一个目的MAC地址未知的数据帧、广播帧或者组播帧时它的处理方式非常简单粗暴——除了接收端口之外从所有其他端口复制转发出去。这叫泛洪是交换机的基本工作原理。现在想象一下两台交换机之间拉了两根线形成了一个物理环路。第一台交换机把广播帧从两个口都发出去第二台交换机收到后又从除了接收口之外的所有口转发其中就包括另一根互联的线广播帧又回到了第一台交换机。第一台交换机再次泛洪……每一轮转发广播帧的数量都在增加而且是沿着环路的两个方向同时转帧的副本会指数级增长。这个风暴有多猛我在实验室里见过一次真实复现四台交换机接成环一台PC发一个广播帧大概两三秒后交换机面板上的所有端口指示灯几乎全亮CPU占用直接拉满控制台敲命令都开始卡顿。这台PC明明只是发了一个包整个二层网络就像被塞进了复印机里不停地复印再复印直到带宽耗尽、设备假死。普通终端用户看到的表象就是“网断了”而且你拔哪一根线网络都能恢复说明环路就是罪魁祸首。1.2 MAC地址表抖动一个MAC在两个端口间反复横跳广播风暴是最直观的灾难但还有另一个隐蔽的问题MAC地址表震荡也叫MAC漂移。交换机的MAC地址表记录了“哪个MAC地址从哪个端口学到的”这个表是动态学习的。正常情况下每个MAC在交换机上只会映射到一个端口。一旦有了环路事情就变了。假设一台PC接在SW1的G0/0/1口但环路上存在两条路径可以到达这台PC。SW2会先从环路的A路径收到这个PC发来的帧于是把MAC表条目记录为“PC-MAC对应A路径的端口”没过多久同一个PC的帧又从环路的B路径传过来了SW2一看端口不一样就直接把MAC表条目更新成“PC-MAC对应B路径的端口”。两个路径上的帧都在以极快的速度循环SW2就在两个端口之间反复横跳式更新这张表。MAC表抖动的直接后果是什么交换机对目的MAC的转发决策会变得极其不稳定。这个帧刚从A口转发出去下一次查表又发现表项变成了B口于是又往B口转。数据帧在网络里围着环路打转、绕来绕去延迟越来越高丢包越来越频繁。更麻烦的是MAC漂移不是只影响一台交换机环路上的每台交换机都在疯狂更新自己的MAC表整体交换性能断崖式下降。1.3 多帧复制同一条消息收到两遍第三个问题是多帧复制。如果目的主机确实在MAC表里交换机本不该泛洪而是精准地从对应端口转发。但环路的存在让目的主机可能通过两个不同的方向都能收到同一帧。因为在环路中一台交换机可能会从多个端口收到同一个帧的多个副本这些副本都是有效转发的结果。对普通数据来说多帧复制会导致接收端收到重复包TCP协议能识别重复序号并丢弃影响相对有限但要是碰上某些对重复帧敏感的二层协议问题就严重了。比如生成树协议本身的BPDU如果被重复接收可能会引发桥ID比较紊乱再比如一些依靠广播发现邻居的二层协议收到自己的报文副本后可能误判拓扑。总之环路不破后患无穷。所以结论很明确二层网络想要冗余就必须引入一种机制让物理上存在环路的拓扑在逻辑上变成一棵没有环的树。这就是STP生成树协议存在的原因。2. STP的设计哲学用BPDU选出一个“根”画出一棵“树”2.1 物理冗余与逻辑无环两者必须兼得有人可能会问既然环路这么可怕那干脆别做冗余链路不就行了不行。现实网络里交换机之间拉两根线、甚至拉一个环是为了解决单点故障。一根线断了或者一个端口坏了另一根线还能顶上保证业务不中断。如果用人工方式去关掉其中一个端口来破除环路那这个端口就废了冗余的意义也没了。STP的巧妙之处在于它不是把冗余端口物理拔掉而是让交换机之间通过协商在逻辑上“阻塞”某个或某几个端口。被阻塞的端口不收发数据帧但链路仍然存在。一旦正在使用的链路出现故障被阻塞的端口可以在几十秒内自动切换到转发状态继续承担流量。这个过程完全自动不需要管理员干预。所以STP解决的核心问题是在提供冗余保护的同时动态消除环路。2.2 BPDUSTP交换机之间的“竞选宣言”STP要让全网交换机“商量”出谁是根、哪个端口该阻塞总得有个沟通语言这就是BPDUBridge Protocol Data Unit桥协议数据单元。BPDU是交换机之间交换的报文里面携带了STA生成树算法计算所需要的全部信息。一个标准配置BPDU里最重要的字段包括根桥ID当前交换机认为的根桥是谁由优先级加MAC地址组成。根路径开销从发送这帧BPDU的交换机到达根桥的开销值。发送者桥ID发送这帧BPDU的交换机自己的身份。发送者端口IDBPDU从哪个端口发出来的。定时器参数包括Hello Time、Forward Delay、Max Age这些计时器的数值。BPDU在整个选举过程中就像竞选宣言一样每台交换机都往外发同时也在收别人的。谁拿到的BPDU更“优秀”谁就服从谁。全网交换机通过不停地比较BPDU最终收敛出一个所有人都认可的拓扑。2.3 配置BPDU和TCN BPDU别搞混BPDU主要分两种考试经常拿来出区分题配置BPDU由根桥周期性发送默认每2秒发一个用来维护全网生成树状态。非根桥收到后会把它从自己的指定端口继续转发下去。TCN BPDU拓扑变更通知BPDU当一台交换机检测到拓扑发生变化时它不是直接告诉全网而是向根桥方向发送TCN逐跳上报由根桥在下一个配置BPDU里带上拓扑变更标记通知全网刷新MAC地址表。这个区别很重要。STP里“维护”用的是配置BPDU“通知”用的是TCN BPDU别把它们混为一谈。3. 三场选举定乾坤根桥、根端口、指定端口3.1 根桥选举比优先级、再比MAC小者为王STP的整个算法流程第一步永远是选举根桥Root Bridge。根桥是整个二层网络的“中心”其他所有设备都要以它为准计算路径。比较规则只有一条看桥ID谁小谁当根桥。桥ID 桥优先级Bridge Priority MAC地址合起来是一个8字节的值。选举时先比较优先级优先级小者优如果优先级完全相同再比较MAC地址MAC地址小者优。华为和思科交换机的桥优先级默认都是32768。也就是说如果不做任何配置网络里MAC地址最小的那台交换机自动成为根桥。这一点非常容易踩坑你新上线一台交换机MAC地址碰巧比现有的根桥还小它一进网络就会抢走根桥位置整网拓扑全部重算业务闪断。所以生产环境里管理员一定会手动把核心交换机或者汇聚交换机的优先级调低例如调成4096确保根桥稳定。这里有一个细节配置优先级的时候值必须是4096的倍数。有效范围一般是0到61440。考试的时候如果选项里出现一个不是4096倍数的值比如“priority 5000”可以直接排除这是概念题常设的坑。3.2 根端口选举非根桥上离根最近的端口根桥选出来之后接下来的问题是每台非根桥上哪个端口负责把数据往根桥方向送这个端口就叫根端口Root PortRP。注意根端口是“每台非根桥上选一个”而不是每个链路上选一个。根桥上不存在根端口因为根桥本身就是目的地。根端口的选举顺序是固定的按优先级从高到低依次比较根路径开销最小者优。如果根路径开销相同比较对端发送者的桥ID小者优。比较对端发送者的端口ID小者优。最后一个比较本端自己的端口ID小者优。根路径开销是啥这就要引入一张表了。STP给不同速率的链路定义了一个开销值速率越高开销越小10Mbps开销100100Mbps开销191Gbps开销410Gbps开销2路径开销是从交换机到根桥沿途所有链路的开销之和。比如一台非根交换机到根桥要经过一条千兆链路加一条百兆链路那根路径开销就是41923。我在带新人时最常看到的一个误解是以为千兆端口比百兆端口更容易当选根端口。这句话是不完整的准确说法应该是根路径开销更小的端口更容易当选而千兆链路通常开销更小所以它更可能成为根端口。一切以开销值计算为准别凭感觉猜。3.3 指定端口选举链路上唯一的“话事人”根端口解决的是“每台非根桥往哪个方向走”指定端口解决的则是“每条链路上由哪个端口负责转发”。每一条链路上有且只有一个指定端口Designated PortDP。指定端口所在的交换机负责把数据从这条链路转发出去。指定端口的选举逻辑用一句话概括在一条链路上谁发送的BPDU更优谁的端口就是指定端口两边的端口都往链路上发BPDU交换机收到对端的BPDU后和自己本端口的BPDU比较更优的胜出。这里有个非常容易理解的点根桥上的所有端口在正常情况下都是指定端口。因为根桥到自己的根路径开销是0没有任何其他交换机比根桥更接近根桥所以根桥发出去的BPDU在这种比较中总是占优。于是根桥所有端口都是DP这也是判断端口角色的一个快捷技巧。如果一条链路两端的交换机都不是根桥呢那就比较这两台交换机谁更靠近根桥也就是谁的根路径开销更小。如果根路径开销一样继续比较发送者的桥ID再比较端口ID。最终在两个端口中挑一个最优的作为指定端口另一个端口如果既不是根端口也不是指定端口恭喜它它就是被阻塞的端口Blocking Port。3.4 一个简单拓扑完整走一遍选举流程光看规则容易晕我拿一个最经典的三角拓扑演示一遍。三台交换机SW1、SW2、SW3两两互联优先级都是默认的32768MAC地址依次是SW100-e0-fc-00-00-01SW200-e0-fc-00-00-02SW300-e0-fc-00-00-03所有链路都是千兆开销为4。第一步选根桥。三者优先级相同都是32768所以比MAC地址最小的01是SW1SW1成为根桥。第二步给每台非根桥选根端口。SW2和SW3都是非根桥。SW2到SW1有两条链路SW2-G0/0/1直连SW1根路径开销4SW2-G0/0/2连SW3再到SW1总开销448。比较下来G0/0/1开销更小成为SW2的根端口。同理SW3-G0/0/1直连SW1成为SW3的根端口。第三步给每条链路选指定端口。SW1上的端口都是指定端口这个不用说。剩下还有两条链路需要考虑SW2到SW3之间的那条链路上两边都是非根桥。SW2的根路径开销是4SW3的根路径开销也是4打平。再比较发送者桥IDSW2的MAC地址是02SW3是03SW2更小所以SW2这一侧连SW3的端口是指定端口SW3那一侧对应的端口既不是根端口也不是指定端口进入阻塞状态。最终端口角色就是这个结果交换机端口角色说明SW1G0/0/1DP根桥端口SW1G0/0/2DP根桥端口SW2G0/0/1RP根路径开销4SW2G0/0/2DP链路上桥ID更优SW3G0/0/1RP根路径开销4SW3G0/0/2Blocking被阻塞避免环路从这个例子可以看出虽然物理上三台交换机之间是一个三角形的环STP通过阻塞SW3的G0/0/2在逻辑上把这三角拓扑砍成了一棵树。SW3访问根桥只需要走SW3-G0/0/1直连如果这条链路断了SW3的G0/0/2就会从阻塞状态恢复自动顶上去。4. 端口状态机与计时器30秒收敛背后到底发生了什么4.1 五种状态从禁用到转发STP端口不是一上来就能转发数据的它要经历一系列状态迁移。标准的802.1D定义了五种端口状态Disabled端口被管理员关闭或者物理链路断开不参与STP计算。Blocking端口处于阻塞状态不收发数据帧但可以接收BPDU持续监听网络拓扑。Listening端口正在监听BPDU参与根桥和端口角色选举但既不学习MAC地址也不转发数据帧。Learning端口已经确定了角色开始学习MAC地址、构建MAC地址表但依然不转发数据帧。Forwarding端口正常工作可以收发数据帧。新端口启动时默认从Blocking开始依次通过Listening和Learning最后进入Forwarding。阻塞状态持续多久呢如果端口一开始就是阻塞的那它就一直待着直到需要它顶替时才往下走。如果是一个新启用的端口它从Listening到Learning各需要15秒总共30秒后才能正常转发数据。这里有一个高频考点Blocking状态的端口能不能收BPDU能虽然它不转发数据但生成树协议报文是照收不误的否则它怎么知道根桥挂了考试题目里只要说“阻塞端口完全不接收任何报文”基本就是错的。4.2 三个计时器参数必须背STP一共用了三个计时器默认值一定要刻在脑子里Hello Time根桥发送配置BPDU的周期默认2秒。Forward Delay端口在Listening和Learning状态停留的时间默认15秒。Max Age交换机保存收到的BPDU的最长时间默认20秒。如果超过20秒还没收到来自根桥的新BPDU交换机就认为根桥不可达拓扑需要重新计算。这三个值之间的关系也要理解。Hello Time是根桥发报文的节奏不是每台交换机都发。非根桥收到根桥的BPDU后在自己的指定端口转发出去所以BPDU的传播依赖根桥和逐跳转发的配合。Max Age必须大于网络中BPDU可能的最大传输延迟否则会误判根桥失效导致无谓的拓扑重算。4.3 根桥故障时的重新收敛过程搞清楚了状态迁移和计时器就能算STP的收敛时间了。收敛时间指的是从链路故障或根桥故障发生到全网恢复转发能力所花的时间。先看最常见的两种场景。场景一链路直接故障。比如根端口所在的链路断了非根桥上有另一个端口可以作为替代但那个端口处于阻塞状态。阻塞端口之前一直在收BPDU链路断掉后它立刻知道自己需要顶上吗不需要等Max Age因为直连链路故障是物理层马上就能感知的。它会进入Listening状态等15秒再进入Learning状态等15秒最后进入Forwarding。所以直连链路故障的收敛时间大约是30秒。场景二根桥故障但不是直连链路断而是根桥整体失联。此时非根桥上的阻塞端口必须等Max Age也就是20秒确认根桥真的没了才能进入Listening再花30秒总共约50秒。这两种场景的收敛时间差异是软考和面试选择题里的常客。很多人只记得“30秒”忘了根桥故障是50秒丢分非常可惜。除了收敛时间还有一条关于拓扑变更的流程要掌握。当一台交换机发现自己的某个端口进入Forwarding状态、拓扑发生变化后它会向根桥方向发送TCN BPDU。收到TCN的交换机先回复一个TCA拓扑变更确认然后继续向根桥转发TCN。根桥收到TCN后在接下来的配置BPDU里把TCTopology Change位置1发给全网。所有收到TC标记的交换机会把MAC地址表的老化时间从默认的300秒缩短到Forward Delay的时间也就是15秒这样错误的MAC表项能快速过期不用等5分钟。5. RSTP进化论毫秒级收敛是怎么做到的5.1 STP的慢是结构性问题不是参数调大就能救STP标准设计的收敛时间长达30到50秒这在今天的网络里是没法接受的。几十秒的断网时长对于办公网络可能还能忍对于数据中心、在线交易系统来说就是灾难。所以后来IEEE推出了802.1w标准也就是RSTPRapid Spanning Tree Protocol快速生成树协议。RSTP并不是在STP的基础上把计时器参数改小它是从机制上重塑了收敛过程。STP的问题是它过度依赖定时器端口发现根桥失联要等Max Age从阻塞到转发要经历两个Forward Delay。RSTP引入了显式的握手机制和快速切换机制让指定端口可以在点到点链路上通过握手立即进入转发状态把收敛时间压缩到秒级甚至毫秒级。5.2 端口角色细化替代端口与备份端口RSTP在原有两种端口角色根端口、指定端口之上增加了两种额外的角色替代端口Alternate Port当交换机同时从多个端口收到更优的BPDU时除了根端口之外那些端口就是替代端口。替代端口是根端口的备份一旦根端口所在链路故障替代端口可以立刻切换为根端口不需要等待计时器倒计时。备份端口Backup Port当交换机自己的某个端口收到了自己发送的更优BPDU时该端口就是备份端口。备份端口是对指定端口的冗余。端口角色一细化故障切换的逻辑就清晰多了。STP时代阻塞端口只能被动等待Max Age超时RSTP时代替代端口知道自己随时可以替换根端口切换几乎是瞬时的。同时RSTP把端口状态从五个精简为三个Discarding既不放行数据也不学习MAC相当于原来的Blocking和Listening合并、Learning、Forwarding。状态少了一层切换路径自然更短。5.3 P/A握手机制指定端口不再傻等15秒RSTP最核心的加速机制是Proposal/Agreement简称P/A握手专门用于点到点链路上指定端口的快速切换。整个过程可以这么理解当一条链路两端都处于Discarding状态时一端交换机通常是离根更近的那一端的指定端口会向对端发送一个Proposal报文相当于说“这条链路让我来转发请你把端口阻塞掉”。对端收到Proposal后如果确认自己在这条链路上不是指定端口就会把自己的非边缘端口全部阻塞并回一个Agreement报文“同意你的意见我这边已经阻塞”。发起方收到Agreement后立即将指定端口切换为Forwarding状态。这个握手的核心价值在于它用两次报文交互替代了15秒的Listening等待。整条链路的收敛只需要2秒以内对于使用RSTP的现代网络来说链路切换几乎是秒级完成。不过要注意P/A机制只在点到点全双工链路上生效。如果链路是共享式的半双工模式RSTP仍然要退回到类似STP的慢速收敛流程。5.4 边缘端口别让交换机端口对电脑说“请稍等30秒”除了P/A握手还有一个很实用的概念叫边缘端口Edge Port也就是连接终端设备PC、服务器、打印机的端口。这些端口不会连接其他交换机理论上不会产生环路所以没有必要让它们经历30秒的阻塞到转发过程。在RSTP中边缘端口配置之后可以直接进入Forwarding状态设备插上就能用不需要等待生成树收敛。华为里命令是stp edged-port enable思科则对应spanning-tree portfast。但要注意边缘端口一旦收到BPDU就说明你判断错了这个端口实际连接了另一台交换机。此时RSTP会让边缘端口自动失效恢复成普通STP端口参与计算防止出现环路。我见过不少新手在核心交换机上把所有下行端口都设成边缘端口然后网络里偶尔出现环路生成树完全没拦住就是因为边缘端口不参与正常的环路计算。边缘端口一定要用在终端侧不要用在交换机互联侧这是生产环境里非常重要的一个原则。6. 华为、思科配置速查与软考/面试高频考点6.1 华为交换机STP常用命令华为设备默认开启了STP但模式是MSTP多实例生成树基础学习阶段可以先切到STP或RSTP模式来验证效果。进入系统视图后最常用的配置如下system-view stp enable // 开启STP stp mode rstp // 切换为RSTP模式 stp priority 4096 // 手动修改优先级范围0-61440且为4096的倍数 interface GigabitEthernet0/0/1 stp edged-port enable // 配置边缘端口 stp disable // 极端情况下关闭某端口的STP生产环境慎用查看STP状态常用的命令是display stp // 查看本设备STP全部信息 display stp brief // 查看端口角色和状态摘要 display stp root // 查看根桥信息其中display stp brief输出里能看到每个端口的STP状态是root、designated还是alternate角色一目了然排查环路时非常有用。我在现网排查时基本就看这个输出。6.2 思科交换机STP常用命令思科设备的默认STP模式是PVSTPer-VLAN Spanning Tree也就是每个VLAN单独跑一棵生成树。新一代设备上更推荐使用快速PVST即Rapid PVSTspanning-tree mode rapid-pvst // 切换为Rapid PVST模式 spanning-tree vlan 1 priority 4096 // 修改VLAN 1的桥优先级 interface GigabitEthernet0/1 spanning-tree portfast // 配置边缘端口查看命令show spanning-tree // 查看生成树汇总信息 show spanning-tree vlan 1 // 查看指定VLAN的STP信息 show spanning-tree interface gigabitEthernet 0/1 // 查看端口角色和状态思科的show spanning-tree输出里端口角色会明确标出Root、Desg、Altn等字样同样可以直接用来判断端口状态。6.3 考点自查清单与易错题最后按考试和面试的命题角度把STP的重点列成一份自查清单。下面这张表建议收藏刷题之前过一遍比盲目背题效率高得多。考点核心结论易错点根桥选举优先级优先其次MAC值小者优优先级必须是4096的倍数根路径开销10M100100M191G410G2千兆不一定优看链路累加开销根端口每台非根桥选一个根路径开销最小优先根桥没有根端口指定端口每条链路选一个BPDU更优者胜根桥上端口默认全是指定端口端口状态阻塞不收发数据但收BPDU阻塞不等于不接收任何报文计时器Hello 2sForward Delay 15sMax Age 20s根桥故障收敛约50s链路故障约30sTCN流程TCN逐跳上报根桥全网临时缩短MAC老化时间从300s缩短为15sRSTP端口角色扩展为根、指定、替代、备份P/A握手仅点到点链路生效边缘端口接终端直接转发收到BPDU自动失效不能在交换机互联口配置再看一道典型的易错题一台交换机上所有端口都收到了优于自身BPDU的报文其中端口A收到的BPDU根路径开销最小端口B与端口A的根路径开销相同但对端桥ID更小。问根端口是哪个答案是端口B。因为根端口选举先比根路径开销若相同再比发送者桥IDB在对端桥ID上更优所以选B。这类题只要你把选举顺序背下来基本就是送分题。还有一道我见过很多人栽过的交换机新配置了一个端口为什么连上去之后要等大约30秒才能上网拆解下来就是新端口经历阻塞到监听再到学习的流程最终才转发本意是为了防止临时环路。如果接的是电脑用边缘端口即可解决如果接的是另一台交换机这个等待是正常的不能强行关STP或者把端口设成边缘端口来“优化”。再提醒一个现网里非常常见的坑有人为了图省事直接stp disable或spanning-tree shutdown全局关闭STP。除非你能保证整个二层网络物理上确实没有环路否则千万不要这么干。网线上一个不经意的回环、一台傻瓜交换机误接成环几秒钟就能把全局网络打瘫。生成树协议是你的第一道防线你可以嫌弃它慢但你不能没有它。在考试或者面试里遇到STP的题目我自己的习惯是先在草稿纸上画出拓扑标出根桥再逐台交换机找根端口然后逐条链路找指定端口最后剩下的就是阻塞端口。只要按这个顺序再复杂的拓扑也能理清楚。希望这份STP汇总能帮你在理解和应试这两条路上都走得快一点少踩几个我曾经踩过的坑。
返回列表