“MSTP原理”这个话题,光是这四个字母就能让不少刚接触交换网络的人犯迷糊。它同时是“多业务传送平台(Multi-Service Transport Platform)”和“多生成树协议(Multiple Spanning Tree Protocol)”的缩写,本文要讲的是后者,工作在二层交换网络里的那套生成树协议体系。MSTP不是凭空冒出来的新事物,而是STP、RSTP一路演进下来的相对成熟形态,它解决的核心问题概括起来就一句话:在有物理环路的以太网环境里,怎么既保留冗余链路,又防止广播风暴和MAC表抖动,还要让不同VLAN的流量各自走各自的路径。这篇东西会把生成树家族的发展脉络、MSTP的运行机制、实例和VLAN映射的关系、配置和排错实操完整过一遍,适合正在啃交换技术、准备网络认证,以及实际项目里要做冗余链路规划的朋友。
1. 从STP到MSTP:我们到底在和什么问题搏斗
1.1 物理环路是二层的双刃剑
先回到最朴素的场景:两台交换机中间拉了两根网线。很多人第一反应是“这不就是冗余嘛,一条断了另一条还能用”,对三层网络来说确实是这样,但二层交换网络恰恰相反——物理环路意味着灾难。
交换机的转发机制决定了它收到一个广播帧会从除入端口外的所有端口复制转发出去。环路里没有TTL这种“寿命计数器”,帧就会在两端交换机之间来回弹跳,越复制越多,最终演变成广播风暴。风暴起来以后,交换机CPU被报文淹没,端口持续满负荷,整个网络基本瘫痪。比广播风暴更阴险的是MAC地址表抖动:同一个源MAC的帧一会儿从A口进来,一会儿从B口进来,交换机的MAC表被反复刷新,导致正常单播帧也被错误地转发到莫名其妙的方向,业务质量瞬间劣化。
所以二层网络必须有一个机制把冗余链路里的一部分“逻辑上堵住”,让整个网络在任意时刻呈现为一棵无环树;等主链路故障时,再把平时堵住的端口迅速放开,让备份链路接管流量。生成树协议干的就是这件事。
1.2 STP:开山鼻祖,但慢得让人着急
生成树协议最初定义在IEEE 802.1D标准里。交换机之间通过BPDU(Bridge Protocol Data Unit,网桥协议数据单元)交换信息,先选出一棵树的根桥,然后每台非根桥上选出一个根端口,每条链路上选出一个指定端口,剩下的端口通通阻塞。BPDU里携带的桥ID由优先级和MAC地址组成,选举顺序是:根桥ID小的优先,到根桥路径开销小的优先,指定桥ID小的优先,指定端口ID小的优先。这套“比大小”逻辑后来被RSTP和MSTP继承,所以弄明白它很重要。
STP最大的问题不是逻辑不对,而是慢。一台交换机端口从阻塞到转发,要经历阻塞、监听、学习、转发四个状态,中间还有多个定时器在起作用,默认情况下一次拓扑收敛要等约50秒。50秒放在拨号上网年代也许能忍,放在今天,业务中断50秒等于事故,根本没法接受。
1.3 RSTP:把收敛时间从分钟拉到秒级
快速生成树协议(RSTP)在IEEE 802.1w里定义,最大贡献是把收敛时间压缩到秒级。它把端口角色从STP里的“根端口/指定端口/阻塞端口”细化为根端口、指定端口、替代端口、备份端口,端口状态简化为丢弃、学习、转发三个,并引入提案/同意(Proposal/Agreement)握手机制:下游设备不需要傻等定时器,直接给上游发提案,上游确认后立即切换转发状态。这就是“快速”二字的来源。
RSTP还有一个很实用的边缘端口概念。接PC、打印机这类不会产生环路的端口,可以直接配置成边缘端口,一上来就进入转发状态,省掉几秒等待时间。
但RSTP解决不了另一个战略性问题:所有VLAN共享一棵生成树。就算你规划了A、B两条上行链路,想让VLAN 10走A,VLAN 20走B,RSTP做不到。它只能在两条链路里挑一条转发,另一条永远闲着,带宽利用率被腰斩。
1.4 MSTP:既要快,又要能按VLAN分流
MSTP就是冲着“快”和“分流”这两个需求来的。它一方面继承了RSTP的快速收敛机制,另一方面允许多个生成树实例并行存在,每个实例独立计算自己的生成树,不同VLAN可以映射到不同实例上。于是链路A成为VLAN 10所在实例的根路径,链路B成为VLAN 20所在实例的根路径,两条链路同时转发不同VLAN的流量,带宽用起来了,环路的风险还是为零,因为每个实例内部依然是无环树。这也是MSTP在企业园区网、数据中心接入层这类既要求高可靠、又想充分利用链路带宽的场景里如此常见的原因。
2. 核心机制:实例、区域和BPDU到底在做什么
2.1 MST区域的判定标准,一个字符都不能差
MSTP不是把全网所有交换机简单拉平处理,它引入了区域(MST Region)的概念。两台交换机是否属于同一个区域,取决于三个参数:区域名(Region Name)、修订级别(Revision Level)、VLAN与实例的映射表。三者完全一致才属于同一区域,任意一个不一致,就会被当成不同区域来对待。
这句话看起来简单,实际踩坑的非常多。很多人配两台设备,觉得“区域名一样就行”,漏了修订级别,或者VLAN映射表里少映射了一个VLAN,结果两台设备虽然摆在一起,却各干各的,二层的拓扑关系和对端预期完全对不上。我见过最典型的问题是:一台设备把VLAN 10映射到实例1,另一台把VLAN 10映射到实例2,它们之间即使物理链路是通的,生成树状态也极不正常。
那区域到底起什么作用?可以这么理解:区域内部跑的是MSTP专用的BPDU,里面包含实例数量、VLAN映射摘要、每个实例的生成树参数等细节信息;到了区域边界,内部的多实例信息被“浓缩”成一个整体,对外仍然以一台普通交换机桥的身份参与全局生成树计算。这样设计的好处是:区域内可以做精细化分流控制,区域外又兼容RSTP、STP等老设备。
2.2 CIST和MSTI:一棵总树和一群子树
MSTP里有两个必须记牢的概念:CIST(Common and Internal Spanning Tree,公共和内部生成树)和MSTI(Multiple Spanning Tree Instance,多生成树实例)。
CIST是跨越整个交换网络的那棵总生成树,它把每个MST区域都看作一个节点,参与全局比较。可以把它理解成所有区域共同默认运行的“兜底树”:不属于任何实例的VLAN、以及不能识别MSTP的老设备,都走CIST的拓扑。
MSTI则是区域内部基于VLAN映射关系建立的多棵独立生成树。比如实例1对应VLAN 10到VLAN 20,实例2对应VLAN 30到VLAN 40,它们各自有各自的根桥、路径开销、端口角色,互不干扰。一个端口在实例1里是根端口,在实例2里可能是指定端口,这在MSTP里再正常不过。
这种设计的价值在于:不同实例的根桥可以人为指定到不同的交换机上,从而控制流量走向;而且某个实例拓扑故障触发收敛时,只影响该实例对应的VLAN,其它VLAN完全不受牵连,故障域被隔离了。
2.3 BPDU里藏着哪些关键字段
MSTP的BPDU在RSTP的基础上做了扩展。它仍然使用相同的组播目的MAC地址,但在标准BPDU字段后面追加了MST扩展字段,包含MST配置标识、MSTI数量、每个MSTI的根桥、路径开销、端口角色等信息。
这里最容易被忽略的是配置摘要(Configuration Digest)。它是由VLAN与实例的映射表计算出来的一段固定长度摘要串。收到BPDU的交换机会拿自己算出的摘要和收到的摘要比较,不一致就直接判定对方不在同一区域。也就是说,即使两台设备的区域名和修订级别都一样,只要VLAN映射表有细微差别,都会被MSTP识别为不同区域。
这也解释了为什么很多诡异问题的排查要抓包看BPDU,而不只是“看配置是否一致”。BPDU里承载的是设备实际对外宣称的状态,比我们脑子里的配置印象更接近真相。
2.4 端口角色和端口状态是两套维度
MSTP的端口角色大致沿用了RSTP的一套:根端口、指定端口、替代端口、备份端口、边缘端口。但要注意,这些角色在每个MSTI内部是独立计算的,端口角色最终要加上“实例编号”来限定。物理端口状态只有丢弃、学习、转发三种,在实例内各自维护。
用一句比较拗口但准确的话说:端口角色决定这个端口在这个实例里承担什么职责,端口状态决定这个端口在这个实例的拓扑收敛过程中正处于哪个阶段。二者是正交关系,不是全局一体。理解了这一点,看设备命令行里每个实例各自列出端口角色的回显时,就不会再把不同实例的信息搞混了。
3. 规划和配置:从画拓扑图到命令行落地
3.1 动手前先想清楚三件事
有这样一个模拟园区网项目X:核心层两台交换机,汇聚层若干台,接入层几十台,不同部门划分了不同VLAN。为了冗余,核心和汇聚之间跑两条互连链路,汇聚和接入之间也有备份链路。客户还明确提了一个需求:视频监控业务(VLAN 100、VLAN 200)尽量走备用链路,办公业务(VLAN 300、VLAN 400)走主链路。这种场景就是MSTP发挥价值的地方。
配置前我习惯先回答三个问题:
- 哪些交换机划在同一个MST区域?绝大多数情况下,核心、汇聚、接入作为一个区域最方便。如果跨了广域网链路,才需要考虑分多个区域。
- 划分几个实例、如何映射VLAN?我建议按业务类型分实例,而不是按交换机地理位置分。业务聚在一起,策略也好做。
- 每个实例的根桥放在哪?典型做法是把不同实例的根桥分散到两台核心上,避免所有流量都压在同一台核心。
对应到项目X,我给出的规划是:区域名REGION-A,修订级别1,VLAN 100和200映射到实例1,VLAN 300和400映射到实例2;核心交换机S1作为CIST根桥和实例1的根,S2作为实例2的根。这样主链路、备用链路都能转发流量,且两条链路负载互补。
3.2 配置步骤:关键动作一个都不能少
下面以主流厂商的命令行风格为例。
第一步,进入系统视图后把全局生成树模式改成MSTP。
system-view stp mode mstp第二步,配置MST区域参数。
stp region-configuration region-name REGION-A revision-level 1 instance 1 vlan 100 200 instance 2 vlan 300 400 active region-configuration这里有一个特别容易漏掉的动作:active region-configuration。这个命令的作用是让之前输入的区域名、修订级别、VLAN映射真正下发到设备并参与BPDU交互。如果漏了这条命令,你配了半天,设备使用的其实还是默认区域配置。
第三步,在S1上设置实例1和CIST的根桥。
stp root primary stp instance 1 root primary这个root primary的命令会自动把优先级降到足够低,让S1成为指定实例的根桥。想更精细控制的话,也可以手动设置优先级:
stp priority 0 stp instance 1 priority 0 stp instance 2 priority 4096第四步,在S2上设置实例2的根桥。
stp instance 2 root primary第五步,处理接终端的端口。面向PC、打印机、AP的端口一般不会产生环路,可以配置为边缘端口,减少端口协商等待时间。
interface GigabitEthernet0/0/1 stp edged-port enable有些人图省事会直接在这个端口上关闭生成树,我不太推荐。完全关闭等于放弃了这层保护,万一有人误把交换机接到这个口上,环路立刻会出现。边缘端口配合BPDU保护才是更稳妥的组合。
3.3 验证配置:不能只看端口UP不UP
配置完以后,必须确认多实例真的在各自工作。两套命令最常用:
display stp instance 1 display stp instance 2 brief这里的验证重点有几个:实例1的根桥是不是S1,实例2的根桥是不是S2,各端口角色是否符合预期。如果发现实例1和实例2的根桥都跑到同一台核心上了,那说明后面的负载均衡没有生效,回到实例配置里查原因。
再查总体的CIST状况:
display stp重点看Region Configuration部分的区域名、修订级别、配置摘要。很多区域不一致的问题在回显里一眼就能看出来。
3.4 故障模拟:一条链路断了,现场是什么样
在项目X里做故障模拟时,我把S1和一台汇聚交换机之间的主链路shutdown掉,观察业务表现。正常情况下属于实例1的VLAN流量会快速切到备用链路上,属于实例2的VLAN流量几乎不受影响,全网收敛时间在秒级。视频业务那边可能会偶尔看到轻微花屏,但不会长时间中断。
这个测试有一个预设条件:S1和S2之间的心跳链路必须正常。两台核心之间互连的那条链路承担着BPDU交换的关键作用,如果这里断了,两个核心各自主导一片区域,很可能会出现双根桥、拓扑分裂的灾难性局面。所以核心层之间的互联链路,必须当作整个MSTP架构的生命线来对待。
4. 调参与排错:最容易翻车的几个瞬间
4.1 区域配置不一致:端口起来但生成树不动
症状很典型:物理链路是UP的,但生成树状态长时间停留在阻塞或断开,甚至看不到任何实例信息。原因不外乎区域名、修订级别、VLAN映射表三个要素里有一个不一致。
排查就用最笨的逐项比对法。两台设备上分别查看MST区域配置,把区域名、修订级别、每一个实例的VLAN映射一条条列出来对照,不要凭印象觉得“差不多”。我遇到过两台设备区域名完全相同、甚至字母大小写都一样,最后发现是修订级别一台写了1、一台写了0,核对三次才发现。
4.2 VLAN映射不一致:隐蔽的二层环路风险
这个场景最危险。假设S1把VLAN 100映射到实例1,S2却把VLAN 100映射到实例2。由于配置摘要不一致,两台设备被判定属于不同区域,CIST接管它们之间的连通性。这时如果S1在实例1里某个端口处于转发状态,S2在实例2里对应端口也处于转发状态,VLAN 100的流量就可能在没有生成树拦截的情况下形成环路,表现为时通时断、丢包率忽高忽低。
修改VLAN映射属于高风险操作。我的习惯是:先停掉相关业务端口,再统一修改所有相连设备的VLAN映射,确认所有设备摘要一致后,再放通业务端口。绝不在业务运行状态下单独改一台设备的映射表。
4.3 根桥漂移:自动选举把接入交换机选成了根
如果核心设备优先级相同,又没有手动指定根桥,MSTP会按MAC地址自动选举根桥。万一某台接入层交换机的MAC比核心还小,它被选成某个实例的根桥,流量走向就完全失控了:所有流量先跑到接入层再往上翻,链路数量剧增,拓扑完全不符合预期。
症状很清晰:display stp instance 1回显里的根桥ID不是规划中的核心S1,而是一台接入交换机的桥ID。原因要么是没手动指定根桥,要么是root primary没有真正生效。我推荐直接用手动优先级的方式,不要过分依赖root primary,因为不同厂商对这个自动命令的解释存在细微差异,手动配置优先级是放之四海皆准的办法。
4.4 与STP、RSTP老设备互通:慢收敛会拖后腿
MSTP和RSTP可以互通,但互通时,RSTP网段能看到的只有一棵CIST,MST区域内部的实例细节对外不可见。如果网络里还混着只支持802.1D老STP的设备,那当MSTP区域发生拓扑变化时,老STP网段依然要按传统定时器慢慢收敛,30到50秒的等待时间会把整个网络的恢复速度拖下来。
如果非混不可,我的建议是:老设备放网络边缘,别让核心链路跨过老STP设备。同时注意协议版本协商参数,有些设备默认在auto模式下和未知老设备协商,协商失败会导致端口停在阻塞状态。遇到这种问题,先抓包确认BPDU有没有到达、到了以后协议字段是否正常。
4.5 几个亲测有效的排错惯例
- 抓包看BPDU比什么都直观。重点看MST扩展字段里的配置摘要,抓包工具一般会自动解码MSTP字段,不用手工去算摘要串。
- 逐层梳理转发路径。从终端一路ping到服务器,在每台交换机上查MAC地址表、查端口状态,确定流量实际走了哪条链路,再判断是不是MSTP分流设计在起作用。
- 动配置前先保存一份已知良好的配置。改错引起环路时,最快的恢复方式不是现场调,而是直接回滚。
- 开启边缘端口的同时一定要开BPDU保护。收到BPDU的边缘端口会被直接shutdown,而不是傻傻地参与选举导致环路。没有这道保险,边缘端口和交换机误接就是一颗定时炸弹。
5. 运维实测中的几点体会
MSTP的单条配置命令并不多,真正难的是理解“多实例”这套并行逻辑。一台物理设备上同时跑着好几棵树,端口角色和端口状态在多个维度上组合,没有转过弯来的人查问题时特别容易绕晕。我后来养成了一个习惯:动工之前先在规划表上把每个接口在实例1、实例2里的预期角色写清楚,再上设备配置,现场调试就按表核对。表里写了它是实例1的根端口,那回显就查实例1;不要凭感觉到处翻。
还有一点容易被忽略:二层的带宽规划。MSTP能实现不同VLAN走不同链路,但前提是链路本身有余量。如果你把十几个VLAN一股脑映射到同一个实例,它们还是会挤在同一条链路上,协议层面教不了物理带宽不够的问题。先做流量测算,再划分实例,才是正路。
BPDU保护不只是边缘端口的事。可靠性要求比较高的场景里,我会在面向终端的端口上同时开启BPDU保护、环路保护和根保护。它们管的范围各不一样:BPDU保护防伪造报文,环路保护防链路单向故障,根保护防有意外的新设备抢走根桥地位。三者结合起来,二层网络才能算真正有了基本的安全屏蔽。
最后说一个很多人问的问题:有没有必要全网所有交换机都开MSTP?我的观点是,几十台以内、没有多VLAN负载均衡需求的小网络,用RSTP就够,运维负担小很多。MSTP适合有明确业务分类、想让多条上行链路都用起来的场景。协议本身没有绝对高低,合不合适才最重要。区域怎么划、实例怎么分、根桥放在哪,说到底是在给二层流量画地图,画得越清楚,网络就越稳。