ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

STP与MSTP生成树协议详解:从环路原理到配置实战

STP与MSTP生成树协议详解:从环路原理到配置实战

冗余链路接了环路,我就知道网又得卡成PPT了。相信不少刚摸到交换机的人都有过这种经历:明明多拉了两条线做备份,结果全网广播风暴、交换机CPU飙到100%,最后只能一根根拔网线找回路。这时候STP生成树协议就派上用场了,而MSTP多实例生成树,是在冗余和负载均衡之间找平衡的进阶玩法。这篇就把STP的底子和MSTP配置实验完整拆开,从为什么会有环路、协议怎么选根桥,到三台交换机组环网后的具体配置命令、验证方法、故障切换表现,最后附上练习题,适合正在学网络技术、准备实验考试或者刚接手公司网络想搞清楚生成树的同学。

1. 为什么要有生成树:冗余网络里的“环形噩梦”

1.1 没有STP时,一条环路能让整张网瘫多久?

网络设计里永远有个矛盾:链路冗余保证可靠性,但冗余链路一旦形成物理环路,就会引发灾难。有人说“那我不组环路,只做链路聚合不就行了”,可现实是核心层、汇聚层甚至接入层之间,很难保证每条链路都能完美避开环形结构,尤其是多台交换机互联时,只要链路拓扑稍微复杂一点,环路几乎不可避免。

环路到底会造成什么后果?我实测过一个三交换机环网的最简场景,三台机器两两互联,没有开任何防环协议。接上最后一根线后,大约几秒钟内,交换机所有端口指示灯开始疯狂闪烁,广播帧在环里无限绕圈,三层网关的CPU直接被打满,连管理地址都ping不通。更隐蔽的是MAC地址表抖动,同一个MAC地址会在多个端口之间来回跳,交换机的转发决策彻底失效,数据帧在环上反复拷贝转发,最终演变成广播风暴。

这不是危言耸听,某些单位做过极端测试,一个三层环网不加STP,三分钟内交换机会因为CPU过载开始丢包,十分钟内可能彻底假死。所以但凡涉及环型冗余拓扑,生成树协议必须作为第一道防线。它的价值不是消除冗余链路,而是把冗余链路“关掉”,只留一条逻辑上的无环路径,在故障时再快速把备用链路激活。

1.2 STP解决环路的思路与核心术语

STP的全称是Spanning Tree Protocol,生成树协议。它的思想很朴素:在物理上存在环路的二层网络中,通过选举和阻塞机制,逻辑上断开某些端口,让全网变成一棵无环的树。树根是一个叫“根桥”的设备,所有数据报文沿着树根方向一层层转发。

理解STP必须抓住几个关键概念。第一个是BPDU,网桥协议数据单元。交换机之间就是靠互发BPDU来交换信息、选举根桥的。BPDU里包含根桥ID、根路径开销、发送者桥ID、发送端口ID等字段。第二个是桥ID,由优先级和MAC地址组成。优先级默认是32768,可手动调整。优先级越小越有可能成为根桥,优先级相同则比较MAC地址,MAC地址越小越优。

端口角色分四种:根端口、指定端口、替代端口、备份端口。每个非根桥上只有一个根端口,是去往根桥路径开销最小的端口;每条链路上只有一个指定端口,负责向对端转发BPDU和用户数据;既不是根端口也不是指定端口的,会被阻塞掉。端口状态则是从禁用、阻塞、监听、学习到转发,其中转发状态才真正收发用户数据。

这套选举机制完全靠BPDU的优先级比较完成,不需要人工指定哪条链路保留、哪条阻塞,交换机自己会算。所以配置STP的起点不是“关掉哪些口”,而是先把根桥选明白,其余端口角色会自动推导出来。

2. 从STP到MSTP:版本演进里的那些坑与解药

2.1 传统STP和RSTP的局限在哪里

传统STP最大的槽点是收敛慢。端口从阻塞到转发,要经过监听和学习两个阶段,每个阶段默认时间是15秒,加起来至少要30秒。这在老式网络中还能接受,放到现在服务器动不动就几十个G的口,业务中断30秒就是事故。

RSTP快速生成树协议解决了收敛时间问题。它把端口状态压缩成丢弃、学习、转发三个状态,又引入了替代端口和备份端口的概念。优秀的地方在于,下游端口可以直接通过握手机制向上游确认,实现秒级甚至毫秒级收敛,同时兼容老STP,收到旧格式BPDU时就自动降级成STP模式。

但RSTP还有个致命短板:全网络只有一个生成树实例,所有VLAN共用一棵树。这就导致一个很尴尬的场景——明明有两条上行链路,一条到核心A,一条到核心B,结果因为整网上只有一个根桥,所有VLAN的流量都挤在一条链路上,另一条链路闲置着备份。带宽资源被白白浪费,也无法根据不同业务做流量分担。

2.2 MSTP的“多实例”到底多在哪里

MSTP多生成树协议,IEEE 802.1s标准,思路是把多个VLAN映射到不同的“生成树实例”上,每个实例独立计算自己的根桥、根端口、指定端口,互不干扰。换句话说,物理上还是一条条链路,但逻辑上每个实例各自维护一棵树,VLAN 10的流量走链路A,VLAN 20的流量走链路B,两边都有活路,又都不产生环路。

MSTP里必须理解两个概念:CIST和MSTI。CIST是公共和内部生成树,是整个交换网络里所有MST域之间协作形成的总树;MSTI是域内的多个生成树实例。把一组VLAN放进同一个实例,它们就共用一棵树的转发逻辑;不放进的VLAN归入默认的实例0。

比RSTP更进一步的是MSTP的域概念。一组交换机只要配置了相同的域名称、修订级别和VLAN到实例的映射关系,就会形成一个MST域。域内各实例独立计算,域间则通过CIST互连。这样的机制让大型园区网可以按区域划分多棵生成树,既隔离故障域,又便于负载分担。

2.3 MCC双链路上如何选择协议版本

目前主流交换机都支持STP、RSTP、MSTP三种模式,实际项目里首选MSTP。因为MSTP向后兼容RSTP和STP,配置得当的话,既能享受快速收敛,又能按VLAN做流量规划。某些老项目里如果全网都是低端傻瓜交换机,可能只能用STP,那也尽量单独划出二层边缘区域,减少参与生成树计算的设备数量。

我见过有些团队干脆全部关闭生成树协议,理由是“内部网络没有环”。这个习惯非常危险,哪天有人拉错一根跳线、插错一个网口,环路马上出现,没有任何保护机制。哪怕全网是星型结构,也建议先开着生成树协议兜底。

3. 实验设计:三台交换机环网+VLAN分组(模拟项目X)

3.1 拓扑与角色分配

这次实验用三台二层交换机搭一个物理环形拓扑,名字分别叫SW1、SW2、SW3。SW1的GE0/0/1接SW2的GE0/0/1,SW2的GE0/0/2接SW3的GE0/0/2,SW3的GE0/0/3再接回SW1的GE0/0/3,构成闭合环路。三台交换机各自连接一台PC做业务测试。

这个拓扑非常典型,是最小可用的冗余环网,也是园区网里常见的接入汇聚结构。SW1、SW2、SW3之间跑Trunk链路,允许所有相关VLAN通过。PC接入端口则保持Access模式,只放行业务VLAN。

实验的预期是:通过MSTP把VLAN 10和VLAN 20分别映射到实例1和实例2,让实例1的根桥落在SW1,实例2的根桥落在SW2,这样VLAN 10的流量在环上往SW1方向走,VLAN 20的流量往SW2方向走。两棵生成树各自阻塞不同的物理端口,实现链路层面的负载均衡。

3.2 VLAN与实例映射规划

实验里规划三个业务VLAN,ID分别是10、20、30。VLAN 10对应办公业务,VLAN 20对应监控业务,VLAN 30留作管理或基础设施业务。为了让效果更直观,只把VLAN 10映射进实例1,VLAN 20映射进实例2,VLAN 30保留在默认的实例0里。

有人会问,为什么是10、20、30这种整十编号?实操里常见的是按业务段分配VLAN,比如终端10段、服务器20段,我好记也好排错。VLAN编号本身不影响生成树行为,纯粹是规划习惯。

实例映射确定后,还要规划根桥优先级。SW1作为实例1的根桥,优先级设为4096;SW2作为实例1的备份根桥,优先级设为8192。实例2反过来,SW2做主根,优先级4096,SW1做备份,优先级8192。SW3不加特殊优先级,保持默认32768。这样就能保证两个实例选出不同根桥,流量走向截然不同。

3.3 预期端口角色与阻塞点

假设实例1的根是SW1,环上从SW1出发,两条路径都能到达SW2和SW3,但SW1到SW2是直连,路径开销更小,所以SW2的GE0/0/1会成为根端口,SW2的GE0/0/2成为指定端口继续往SW3转发。SW3的两个方向上,从SW2过来的路径开销小,SW3的GE0/0/2是根端口;反过来经SW1到SW3的GE0/0/3路径长,会被阻塞。

实例2根是SW2,那么SW1的GE0/0/1是根端口,SW3的GE0/0/3是根端口,SW1的GE0/0/3或者SW3相关端口则因路径更长被阻塞。两棵树的阻塞端口完全不同,这就是MSTP负载均衡的实现原理。

测试之前最好画一张预期表,列出“实例、根桥、根端口、阻塞端口”,配置完逐项对照,这样排查问题时就不会抓瞎。

4. 动手配置MSTP:完整命令流与关键参数解释

4.1 初始化与VLAN创建

先把三台交换机恢复出厂一样的干净状态,然后逐台创建VLAN并配置接口类型。以下是SW1的基础配置,SW2、SW3照着类似思路做。

system-view sysname SW1 vlan batch 10 20 30 interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 30 interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20 30 interface GigabitEthernet0/0/2 port link-type access port default vlan 10

SW2和SW3有微小差异:SW2连接测试PC的access口放VLAN 20,SW3连接测试PC的access口放VLAN 30。Trunk口必须放行所有相关VLAN,否则即使生成树算对了,对应VLAN的数据也传不过去。

4.2 配置MST域并启用MSTP

接下来是MSTP配置的关键部分。三台交换机必须配置相同的域名、修订级别和实例映射,才能归属于同一个MST域。任何一项不一致,交换机之间就会认为不在同一个域,MSTP的负载均衡效果会直接失效。

stp mode mstp stp region-configuration region-name LAB revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration

region-name LAB是域名,自己定义即可,但全网必须统一。revision-level 1是修订级别,用于区分同一域名的不同配置版本,同样要求全网统一。最关键的是instance 1 vlan 10和instance 2 vlan 20这两行,把具体VLAN挂到对应实例上。执行完active region-configuration后配置才真正生效。

这三行在SW1、SW2、SW3上必须完全一样。只要有一台漏写instance 2 vlan 20,VLAN 20就会落到实例0里,整个负载均衡预期全部作废。做完后可以执行display stp region-configuration确认。

4.3 划分根桥与备份根桥

MSTP模式下,根桥要针对每个实例分别设置。SW1上执行:

stp instance 1 root primary stp instance 2 root secondary

root primary等价于把该实例的优先级设置为4096,并启用根桥保护相关行为;root secondary则把优先级设为8192。SW2相反配置:

stp instance 2 root primary stp instance 1 root secondary

SW3不用设置优先级,继续用默认的32768。如果其他交换机也保留了默认优先级,那么所有默认优先级的交换机中MAC地址最小的会成为根桥,这往往不是我们想要的。显式配置了优先级后才好控制根桥位置。

需要特别强调的是,root primary这个命令不要理解为“让这台交换机必须成为根”,它只是把优先级压到一个很优的值。如果环网上还有优先级4096甚至更低的交换机参与竞争,根桥依然可能选到别处。严格来说,配套使用stp priority 0才能做到真正没对手,不过生产环境里留一台备份根更好,我不建议把优先级压到极端值。

4.4 验证配置与初步观察

配置完成后,在SW1上执行:

display stp display stp instance 1 brief display stp instance 2 brief

display stp能看到当前生成树模式、全局桥ID、根桥ID、域配置等关键信息。display stp instance 1 brief以表格形式列出实例1中每个端口扮演的角色和状态,可以直观看到哪些端口是根端口、指定端口,哪些被阻塞。

正常情况下,SW1上实例1的端口角色应该是:GE0/0/1是指定端口、GE0/0/3是指定端口或者其中一个是根端口但路径更短,SW3侧会出现阻塞口。SW2上实例1的GE0/0/1是根端口,GE0/0/2是指定端口。实例2则角色完全反过来,SW2的GE0/0/1和GE0/0/2都是指定端口,SW1的GE0/0/1是根端口。

整理成一张表:

设备实例端口角色预期状态
SW11GE0/0/1DESIforwarding
SW11GE0/0/3DESIforwarding
SW12GE0/0/1ROOTforwarding
SW12GE0/0/3DESIforwarding
SW21GE0/0/1ROOTforwarding
SW21GE0/0/2DESIforwarding
SW22GE0/0/1DESIforwarding
SW22GE0/0/2DESIforwarding
SW31GE0/0/2ROOTforwarding
SW31GE0/0/3ALTEdiscarding
SW32GE0/0/2DESIforwarding
SW32GE0/0/3ROOTforwarding

这张表是排错的指导图,验证时只要角色和状态跟预期不符,就要往配置差异、链路故障、优先级设置三个方向去查。

5. 故障切换验证:看MSTP如何秒级收敛

5.1 正常状态下的流量路径

配置完成后,用PC分别ping对应网关测试连通性,VLAN 10、VLAN 20、VLAN 30应该全部通。这时实际上VLAN 10的流量可能只走环的上半部分,VLAN 20走环的下半部分,两棵生成树各占一条物理通路,冗余链路也没有彻底闲着。

我习惯在SW1上开display stp instance 1 brief盯住端口状态,再在PC上持续ping网关地址,然后手动断开某条Trunk链路,观察丢包数量。正常MSTP环境中,RSTP快速收敛机制能在1到2秒内完成切换,最多丢两三个包,业务基本无感。

5.2 手动断开一条链路后的收敛过程

模拟故障最简单的方式是把SW1的GE0/0/1接口shutdown,或者直接拔线,生产环境拔线更麻烦,实验里建议用命令行操作。

interface GigabitEthernet0/0/1 shutdown

此时实例2的物理路径少了一条,原本走SW1-SW2链路的VLAN 20流量,会立刻触发替代端口转为转发状态。SW3的GE0/0/3原先是根端口,如果它的替代路径在那里,端口状态会从discarding变成forwarding,数据改走SW1-SW3链路。

重新打开接口后,MSTP会重新计算拓扑,流量会回到原最优路径。注意这时端口重新收敛也需要一小段时间,我实测大概1到3秒,比传统STP的30秒收敛体感强太多,这就是RSTP机制带来的收益。

5.3 多实例下的故障隔离效果

MSTP最妙的地方在于:实例1的链路断了,实例2的生成树拓扑完全不受影响,VLAN 10和VLAN 20的切换是互相隔离的。这是因为它们各自独立发送BPDU、独立计算树,故障域被限制在实例内部。

这个特性对生产网络有实实在在的价值:就算监控网络出现链路震荡,办公网络不会跟着抖。实践里我把这当作MSTP优于单生成树的核心理由,也是面试时最容易被问到的点。

6. 实战中容易踩的坑:排查思路与避坑经验

6.1 区域配置不一致导致负载均衡失效

有次给某公司网络做改造,配了三台交换机MSTP,验证时发现VLAN 20的主路径没走到SW2,所有VLAN的流量还是挤在一条链路上。排查过程不复杂,先在三台设备上分别执行display stp region-configuration,结果发现SW3漏配了instance 1 vlan 10这句映射。

因为三台交换机的实例映射不一样,SW3与另外两台无法组成同一个MST域,只能作为独立域通过CIST互连。CIST只有一棵树,负载均衡效果当然无法实现。这类问题最隐蔽的是:由于CIST依然能防环,业务还是通的,只是转发路径完全不符合预期,不仔细看端口角色很难发现。

查这类问题有个技巧:display stp里会显示“MSTP域配置一致/不一致”之类的摘要,先看域配置是否一致,再看每个实例的根桥ID是否跟自己规划一致,基本能定位问题。

6.2 端口角色正确但业务不通的三类原因

生成树状态全对,VLAN就是不通信,这种问题在实验里出现的频率很高。第一类原因,Trunk口没有放行对应VLAN。我在前面反复强调port trunk allow-pass vlan必须配全,少了一个VLAN,生成树就算放行转发,报文也会被Trunk过滤掉。

第二类是access口的PVID和业务VLAN对不上。接入交换机的用户口PVID必须和所属VLAN一致,否则终端发出来的帧被交换机当成别的VLAN处理,自然不通。

第三类是STP边缘端口没配。PC接入端口连的是终端,不参与生成树计算,但交换机默认还是会发送BPDU、等待端口状态迁移。如果PC的网卡把交换机发来的BPDU当成了异常帧,甚至有的终端驱动会直接丢弃,就会造成链路明明Up了却迟迟不转发数据。

解决办法是对接入PC的Access口配置边缘端口:

interface GigabitEthernet0/0/2 stp edged-port enable

有些厂商命令是portfast,思路一样。边缘端口可以立刻进入转发状态,终端接入零延迟。但千万注意,边缘端口如果被误插到另一台交换机上,可能会引起环路,所以最好再配一条BPDU保护,让端口收到BPDU后自动关闭。

6.3 BPDU保护、根保护、环路保护怎么选

MSTP场景下,端口保护功能不是奢侈品,而是必需品。BPDU保护针对边缘端口,防止非法交换机接入抢根桥;根保护是针对指定端口的,防止端口收到优先级更优的BPDU后被强行夺走根桥地位;环路保护是针对根端口和替代端口的,防止单向链路故障导致端口误转。

我在接入交换机上这样配:

interface GigabitEthernet0/0/2 stp edged-port enable stp bpdu-protection

在核心侧指定端口上配根保护:

interface GigabitEthernet0/0/1 stp root-protection

有人把BPDU保护、根保护、环路保护混为一谈,实际它们保护的对象完全不同。这点建议练习题里重点区分,面试也爱考。核心原则是:边缘口用BPDU保护,非根桥上别抢根的指定口用根保护,出现过单向链路故障历史的链路用环路保护。

6.4 收敛慢要查链路类型和双工模式

如果做故障切换测试时发现丢包超过三秒以上,先查物理链路是不是半双工。生成树协议要求全双工链路才能发挥快速收敛优势,半双工状态会默认使用较慢的协商机制。另外检查链路是否配置了速率自动协商,老式设备千兆口在协商失败时可能降到百兆甚至十兆,路径开销变大,生成树选路也会随之变化。

用display stp查看端口开销和状态时,如果发现某个端口状态一直停留在learning不进入forwarding,多半是BPDU收发有问题,或者上游交换机没有启用MSTP。可以抓包看看BPDU的字段,重点确认发送者的桥ID、根桥ID、域配置是否一致。

7. 配套练习题:STP与MSTP自测

7.1 基础选择题

第一题:MSTP相比RSTP最大的改进是什么?A. 收敛速度更快 B. 支持多VLAN多实例 C. 无需配置根桥 D. 自动负载均衡。答案B。RSTP只能生成一棵树,MSTP可以把VLAN分组映射到不同实例,每个实例独立成树。

第二题:MST域配置必须一致的参数是哪三项?A. 域名、修订级别、VLAN实例映射 B. 根桥优先级、端口开销、链路聚合 C. MAC地址、IP地址、VLAN编号 D. 生成树模式、端口类型、双工模式。答案A。域名、修订级别、VLAN到实例的映射是域标识的核心参数,三者一致才能组成同一个域。

第三题:边缘端口收到BPDU后,下列哪种保护功能能立即关闭该端口?A. 根保护 B. BPDU保护 C. 环路保护 D. 风暴控制。答案B。BPDU保护就是为了防止边缘口被恶意或误接的交换机干扰,收到BPDU立刻error-down。

7.2 判断题与分析题

判断题一:MSTP中不同实例的阻塞端口可以不同,从而实现负载均衡。答案是对。每个实例独立计算生成树,即使物理链路一样,阻塞点也可以按实例区分。

判断题二:所有交换机的MSTP域名称一致,但修订级别不同,可以正常组成同一个域。答案是错,修订级别必须一致才能成域。

分析题:三台交换机组成环形拓扑,VLAN 10映射到实例1,VLAN 20映射到实例2。某次配置后,发现实例1和实例2的根桥都是SW1,造成的后果是什么?应当如何修正?

分析思路:一旦两个实例的根桥都是SW1,两个实例的生成树拓扑就很可能完全相同,阻塞的都是同一条链路,VLAN 10和VLAN 20都会挤在同一条物理链路上,负载均衡失效。修正方法是在SW2上显式配置stp instance 2 root primary或调整SW2在实例2中的优先级,让实例2的根桥改选为SW2。

7.3 综合配置题

给出一个需求:某单位有三台核心交换机组成环形冗余网络,需要保证VLAN 10和VLAN 20互不干扰,链路故障后业务在3秒内恢复,终端接入端口不允许参与生成树选举。请写出你的配置方案并说明理由。

完整方案包含:三台交换机全部启用MSTP模式;配置一致的域名称、修订级别、实例映射;VLAN 10映射实例1,VLAN 20映射实例2;实例1根桥配置在SW1,实例2根桥配置在SW2;Trunk口放行全部相关VLAN;终端接入口配置边缘端口并开启BPDU保护;配套设置根保护在核心侧指定端口。这个题没有标准唯一答案,配置思路占大头。

到这里STP生成树和MSTP配置实验的核心内容就完整了。我自己在实际操作里踩过最多的坑,就是域配置不一致和边缘端口没配,两个问题都不难查,难的是养成配置完就检查域配置、检查端口角色、再检查业务连通性的习惯。建议你按这个流程把三台交换机实验完整跑一遍,把每一条验证命令的输出都看清楚,再配合上面的练习题巩固一遍,STP和MSTP这块就算真正吃透了。生成树这东西,平时老老实实待着不吭声,等环路出了故障你才反应过来它替你挡了多少灾。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进