
1. 为什么今天还要聊MSTP干了这么多年网络每次带新人排查二层环路问题最后绕来绕去都会绕回生成树这一套东西。很多人对STP、RSTP、MSTP的印象停留在“考试要背的协议”真到了现网里一看到端口状态在discarding和forwarding之间反复横跳或者VLAN间流量走向莫名其妙就抓瞎了。这篇东西就是想把MSTP这件事从头到尾捋清楚顺带把STP、RSTP、MSTP三者之间的血缘关系和差异讲透让你下次再遇到多VLAN环境下的链路规划心里有底。先把结论摆前面MSTPMultiple Spanning Tree Protocol多生成树协议不是凭空冒出来的新东西它是STP和RSTP在“多VLAN负载分担”这个需求下自然演进的结果。STP解决了环路问题但收敛慢、拓扑单一RSTP把收敛速度提上来了但依然是整网一棵树所有VLAN共用一条转发路径MSTP在RSTP快速收敛的基础上引入了“实例Instance”的概念让不同VLAN可以走不同的树从而实现负载分担和冗余并存。理解这条演进线比死记每个协议的状态机有用得多。这篇文章适合谁看刚接触园区网、数据中心二层规划的运维和网络工程师以及那些“配置会敲但不知道为什么这么敲”的朋友。我会从协议设计的底层逻辑讲起把MSTP的域、实例、映射关系拆开再给一套可以直接抄的配置思路和排错方法。全程用现网里真实会遇到的场景说话不堆RFC原文。2. 从STP到MSTP一条被需求推着走的演进线2.1 STP一棵树打天下够用但不够快STP802.1D的核心逻辑很朴素网络里不能有环有环就广播风暴、MAC表震荡所以选一个根桥其他桥算出一条到根的最短路径把多余的端口堵上形成一棵无环的树。这套机制在单VLAN或者小规模网络里完全够用我见过不少老园区到现在还跑着STP只要拓扑不频繁变动它老老实实不惹事。但STP的毛病也很明显。收敛慢是第一个痛点端口从阻塞到转发要经历blocking、listening、learning、forwarding几个状态默认计时器下光listening和learning加起来就是30秒加上拓扑变化后的老化业务中断动辄几十秒。第二个痛点是拓扑单一整网只有一棵树所有VLAN的流量都挤在同一条链路上另一条冗余链路只能干等着带宽利用率上不去。第三个是端口角色和状态耦合根端口、指定端口、阻塞端口和端口状态绑死灵活性差。我早年在一个双上行接入的场景里踩过坑核心到接入有两条千兆链路跑STP结果所有流量全走主链路备链路常年0流量客户问“我买了两条链路为什么只用一条”我只能解释这是STP的机制决定的。这个场景其实就是后来推动RSTP和MSTP落地的真实需求。2.2 RSTP把收敛速度拉起来但树还是那棵树RSTP802.1w最直观的改进是端口状态从5个精简到3个discarding、learning、forwarding。原来的blocking、listening、disabled统一归到discarding语义更清晰。更重要的是它引入了边缘端口Edge Port和提议/同意Proposal/Agreement机制边缘端口接终端直接进转发不参与生成树计算链路故障时通过P/A握手快速切换收敛时间从几十秒压到秒级甚至亚秒级。RSTP还增加了替代端口Alternate Port和备份端口Backup Port两种角色替代端口是根端口的备份根端口挂了替代端口能立刻顶上不用重新算整棵树。这套机制在现网里非常实用我一般会在所有接终端的端口上开边缘端口再配合BPDU保护既快又防环。但RSTP有个没解决的问题它依然是整网一棵树。所有VLAN共享同一套拓扑负载分担还是做不到。你可以在不同链路上调cost让流量走不同路径但那是全局的没法做到“VLAN 10走左边、VLAN 20走右边”。这个缺口就是MSTP要填的。2.3 MSTP一棵树变多棵树VLAN终于能分道走MSTP802.1s的核心创新是把VLAN映射到不同的生成树实例Instance上每个实例独立计算拓扑不同实例可以有不同的根桥和阻塞端口。这样一来VLAN 10的流量可以走链路AVLAN 20的流量走链路B两条链路都利用起来同时各自还有冗余。这就是所谓的负载分担。MSTP还引入了域Region的概念。一个MST域是一组配置了相同域名、修订级别和VLAN-实例映射表的交换机集合。域内跑MSTP域间通过CISTCommon and Internal Spanning Tree互通对外表现得像一棵普通的生成树。这个设计很巧妙它让MSTP既能在大规模网络里分区管理又能和跑STP/RSTP的设备兼容。我个人的理解是MSTP的本质是“用实例换灵活性”。你多花一点配置成本去规划实例和VLAN映射换来的是链路利用率和故障隔离能力的提升。但这里有个前提实例不是越多越好。现网里我见过有人给每个VLAN建一个实例结果几十个实例把交换机CPU和内存吃满BPDU泛洪严重。一般园区网规划2到4个实例足够一个跑主流量一个跑备流量再留一个给管理VLAN或者特殊业务。3. STP、RSTP、MSTP到底差在哪一张表说清楚光讲演进线还不够实际选型和排错时你得能快速判断“这个网络跑的是什么、有什么限制”。下面这张表是我自己整理的核心差异对照平时带人或者写方案直接拿来用。对比维度STP802.1DRSTP802.1wMSTP802.1s拓扑数量整网1棵整网1棵每实例1棵多实例并行端口状态5个blocking/listening/learning/forwarding/disabled3个discarding/learning/forwarding3个同RSTP端口角色根端口、指定端口、阻塞端口增加替代端口、备份端口、边缘端口同RSTP另加域边界相关角色收敛速度慢默认30秒级快秒级/亚秒级快同RSTP负载分担不支持不支持全局调cost支持按实例分流VLAN感知不感知不感知感知VLAN映射到实例域的概念无无有域名修订级别映射表兼容性基础兼容STP兼容STP/RSTP域间走CIST典型场景老旧小网络单VLAN或简单双上行多VLAN园区、需要负载分担的汇聚层这张表里最容易被忽略的是兼容性那一行。MSTP设备在和跑STP/RSTP的设备对接时会把对方所在的端口当作域外端口通过CIST来互通。这意味着你可以在一个网络里混跑三种协议但代价是跨协议边界的那部分收敛速度和负载分担能力会退化到对端协议的水平。我见过一个改造项目核心换了支持MSTP的新设备接入层还是老STP交换机结果整网收敛被接入层拖慢最后只能分批替换。所以规划时一定要把协议边界想清楚别指望MSTP能拯救所有老设备。4. MSTP核心概念拆解域、实例、映射一个都不能含糊4.1 MST域三要素必须完全一致MST域Region是MSTP管理的基本单位。一台交换机属于哪个域由三个参数共同决定域名Region Name、修订级别Revision Level、VLAN到实例的映射表。这三个参数在域内所有设备上必须完全一致否则设备会被划到不同的域域间走CIST你精心规划的负载分担就失效了。这里有个现网高频坑映射表的一致性。很多人配的时候只改了域名和修订级别映射表用了默认的结果两台设备映射表不一样死活进不了同一个域。排查的时候用display stp region-configuration不同厂商命令略有差异看三要素逐项比对。我的习惯是规划阶段就把三要素写进配置模板部署时直接刷不给人手改的机会。注意修订级别默认是0很多项目里大家都不改这本身没问题但如果你网络里存在多个历史遗留的MST域建议用修订级别做区分避免误合并。4.2 实例与CIST内部实例和公共树的关系MSTP里有两类树CISTCommon and Internal Spanning Tree和MSTIMultiple Spanning Tree Instance。CIST是整网的公共树负责域间互通和与STP/RSTP的兼容MSTI是域内每个实例独立的树负责域内的负载分担。默认情况下所有VLAN都映射到实例0而实例0就是CIST所以你不配任何映射时MSTP退化成类似RSTP的行为。规划实例时我一般遵循“业务分离、数量克制”的原则。比如一个典型园区VLAN 10-19映射到实例1走主链路VLAN 20-29映射到实例2走备链路管理VLAN单独映射到实例3或者留在实例0。这样主备链路都承载流量任意一条断了另一条能接管同时管理流量和业务流量在拓扑上隔离排错时不容易互相干扰。实例数量为什么克制因为每个实例都要独立跑一套生成树计算BPDU要带实例信息交换机要为每个实例维护端口状态。实例多了CPU和内存开销线性上升BPDU报文也变大。我实测过接入层交换机跑超过8个实例CPU会有明显抬升几十个实例基本就是给自己找麻烦。2到4个实例覆盖绝大多数场景再多就得掂量一下设备性能。4.3 端口角色与状态MSTP沿用了RSTP的框架MSTP的端口角色和状态基本继承RSTP但多了域边界端口的概念。根端口、指定端口、替代端口、备份端口、边缘端口这些角色在MSTP里含义不变区别在于每个实例独立计算角色。同一个物理端口在实例1里可能是根端口在实例2里可能是替代端口阻塞这就是负载分担的物理基础。端口状态还是discarding、learning、forwarding三个。discarding不转发也不学MAClearning学MAC但不转发forwarding正常转发。排错时看端口在哪个实例下处于什么状态比看全局状态有用得多。我习惯用display stp instance X interface这类命令逐个实例看能快速定位是哪个实例的拓扑出了问题。5. 实操一套可复现的MSTP规划与配置流程5.1 规划阶段先画图再敲命令配置之前必须先把规划做扎实否则后面改起来很痛苦。我的流程是三步定拓扑、定实例、定映射。定拓扑就是画出物理连接和冗余关系标出哪些链路是主用、哪些是备用、哪些需要负载分担。定实例是根据业务VLAN分组把需要走同一路径的VLAN归到一个实例。定映射就是写出VLAN和实例的对应表同时确定每台设备在各实例下的根桥优先级。根桥规划有个经验每个实例的主根和备根要分开。比如实例1的主根放在核心A、备根放核心B实例2反过来主根核心B、备根核心A。这样两个实例的流量走不同核心核心间链路也能被利用起来。优先级用4096的倍数主根设4096备根设8192其他设备默认32768层次清晰。5.2 配置模板以两台核心加两台接入为例下面给一套通用配置思路命令用伪代码风格表示不同厂商语法有差异但逻辑一致。假设域名REGION-CORE修订级别1实例1映射VLAN 10-19实例2映射VLAN 20-29。核心A的配置逻辑# 进入MST域配置 stp region-configuration region-name REGION-CORE revision-level 1 instance 1 vlan 10 to 19 instance 2 vlan 20 to 29 active region-configuration # 实例1主根实例2备根 stp instance 1 priority 4096 stp instance 2 priority 8192 # 全局开启MSTP stp mode mstp stp enable核心B对称配置实例1备根8192实例2主根4096。接入交换机只需要配好域三要素和映射表优先级保持默认让它自动选根。接入层到核心的双上行链路通过实例不同自然形成一主一备的转发路径。配置完必须验证三件事域是否一致、实例根桥是否符合预期、各实例端口状态是否正确。域一致性用域配置查看命令比对三要素根桥用display stp instance X看根桥ID是不是你规划的那台端口状态看每个上行端口在各实例下是forwarding还是discarding符合“实例1走A链路、实例2走B链路”就对了。5.3 参数选择优先级、cost、计时器怎么定优先级前面说了4096的倍数主备拉开差距。cost的话MSTP默认按端口带宽算千兆是20000、百兆是200000不同厂商基数可能不同一般不需要手动改除非你有特殊的路径偏好。真要手动调记住cost越小越优先调之前先确认默认值别拍脑袋填个1把路径搞乱。计时器方面MSTP沿用了RSTP的快速收敛机制Hello时间默认2秒Forward Delay默认15秒Max Age默认20秒。绝大多数场景不要动这些值动了容易引发全网震荡。只有在超大规模或者特殊链路质量下才考虑微调而且必须全网一致。我见过有人为了“加快收敛”把Hello改成1秒结果BPDU泛洪翻倍CPU告警得不偿失。6. 排错实录MSTP现网高频问题与排查思路6.1 域不一致导致负载分担失效这是最常见的坑。现象是规划了两个实例走不同链路结果所有流量还是走同一条另一条链路闲置。排查第一步就是看域三要素。两台设备域名、修订级别、映射表只要有一项不同就分属不同域域间走CIST实例规划全部作废。排查命令思路分别在各设备上查看域配置逐项比对。映射表最容易出问题因为它是多行配置手敲容易漏或者顺序不一致有些厂商对映射表顺序敏感。解决办法是用配置模板统一刷刷完再比对一遍。我现在的习惯是部署前把三要素和映射表做成一个配置片段所有设备引用同一片段从源头杜绝不一致。6.2 实例根桥不是规划的那台现象是某个实例的流量走向和规划相反。原因通常是优先级没配、配错设备、或者有设备优先级配得更低抢了根。排查用查看根桥的命令看当前根桥ID和预期是否一致。如果发现是某台接入交换机成了根多半是它的优先级被误配成了0或者4096。这里有个细节根桥优先级是per实例的你配实例1的优先级不影响实例2。所以配置时要逐个实例确认。另外有些厂商的默认优先级是32768有些是32768但支持扩展系统ID看命令输出时注意区分。6.3 边缘端口没开导致终端接入慢终端插上交换机等好几秒才能上网多半是端口没配边缘端口走了生成树的状态迁移。边缘端口接终端不参与生成树计算直接进forwarding。配置上把接终端的端口统一设为边缘端口同时开BPDU保护防止有人私接交换机导致环路。注意边缘端口一定要配合BPDU保护。只开边缘端口不开保护一旦端口收到BPDU边缘端口会失效并重新参与生成树可能引发震荡。开了BPDU保护收到BPDU直接把端口down掉干净利落。6.4 常见问题速查表现象可能原因排查动作处理方式负载分担不生效域三要素不一致比对域名、修订级别、映射表统一配置模板重新下发流量走向与规划相反实例根桥优先级配错或被抢占查看各实例根桥ID修正优先级确认无更低优先级设备终端接入慢端口未设边缘端口查看端口角色设为边缘端口并开BPDU保护收敛慢、拓扑震荡计时器被改动或链路质量差检查Hello/Forward Delay/Max Age恢复默认值全网一致实例多导致CPU高实例规划过多查看CPU和实例数量精简实例到2-4个与老设备对接后变慢跨协议边界退化确认对端跑的协议规划协议边界分批替换或接受退化7. 我踩过的坑和几条实在建议先说一个印象最深的。早年做一个多楼层园区的改造汇聚层双上行到核心规划了两个实例做负载分担。配置刷完测试都正常结果上线一周后客户报“部分楼层网速慢”。上去一看其中一台汇聚交换机的映射表里少配了一个VLAN段导致那部分VLAN落到了实例0走了CIST和规划的路径完全相反流量绕了一大圈。问题就出在手敲映射表时漏了一行。从那以后我所有MSTP项目都用配置模板映射表只写一次复制下发下发完用脚本比对每台设备的域配置确认完全一致才继续。第二条建议实例规划要跟着业务走不要跟着VLAN编号走。很多人习惯按VLAN 10、20、30这样顺序分实例但业务上可能VLAN 10和VLAN 30是一类流量、VLAN 20是另一类。按业务分组后续扩容和调整时逻辑清晰排错时也容易判断“这个实例出问题影响哪些业务”。第三条改MSTP配置尽量在窗口期做并且准备好回滚。MSTP的域配置变更尤其是映射表会触发全网重新计算虽然RSTP/MSTP收敛快但大规模网络里仍然可能有短暂中断。变更前备份配置变更后逐台验证别一次性全推。最后分享一个排查小技巧当你不确定某台设备在某个实例下走哪条路时直接看该实例下各端口的角色和状态根端口方向就是流量出口替代端口就是备用方向。比看全局拓扑图快得多尤其是在实例多、拓扑复杂的时候。这个内容后续还可以往MSTP和堆叠、链路聚合的配合上扩展那是另一个话题了先把单域的这套逻辑吃透现网里八成的问题都能自己搞定。