板块5 · 生成树 STP / RSTP / MSTP
板块5 · 生成树 STP / RSTP / MSTP
目标与定位:STP/RSTP/MSTP 是二层冗余网络的“交通规则”——没有它,任何双上行、双核心或环型链路都可能演变为二层广播风暴。STP 在 ZCIA 中约占 5%,却是现网事故率最高的技术之一:配好时无人注意,配错时往往全网瘫痪。ZCIA 要求会识别拓扑、配置与查看;ZCIP 要求完成 MSTP 多实例规划、跨设备联调和保护加固;ZCIE 要求解释区域分裂、单向链路、跨厂商协商及根因闭环。MSTP + 链路聚合 + VRRP,是 ZCIP 园区网工程的“标准三件套”。
学习承诺:本板块按“原理 → 命令 → 工程实例 → 验证 → 故障排查 → 考点速记”六段式展开。所有原始命令全表、路径开销表、时间参数约束、CORE/ACC 工程脚本、体系B
spantree配置、HMD5 判读、官方排障四步、单向链路定位和保护特性均原样保留并进一步解释。命令以设备上?帮助、运行配置和版本说明书为准;不同型号或软件版本可能存在spantree与spanning-tree、set stp与stp等差异。
5_1 生成树家族与选型
本节要解决什么问题:先建立选型认知:为什么 STP 被淘汰、RSTP 快在哪里、MSTP 为什么成为现网主流。
5_1_1 从“防环”到“按业务分流”:三代协议不是简单替代关系
二层交换网络允许物理冗余,但必须禁止逻辑环路。生成树协议(Spanning Tree Protocol,STP)通过交换 BPDU、选举根桥和端口角色,把一部分冗余端口置于阻塞状态,从而构造无环树形转发路径。当主路径故障时,原阻塞端口可以重新计算并接管。
┌──────┐ ┌──────┐
│ SW1 │════════│ SW2 │
└──┬───┘ └──┬───┘
│ │
│ ╔═══════╗ │
└─────║ 环路 ║──┘
╚═══════╝
STP 的目标:从物理“口字型/环型”中剪出一棵逻辑无环树
阻塞端口:不转发用户数据,但仍收发 BPDU
故障切换:原阻塞口重新进入选举与转发流程
STP 解决的是确定性问题,不是性能问题。 单一生成树会把所有 VLAN、所有业务压到同一棵树上;即使物理上存在多条上行,只要端口被阻塞,对应带宽就不能被当前树使用。因此,三代协议的核心差异不只是“快不快”,还包括“能否把不同业务映射到不同转发树上”。
| 协议 | 标准 | 收敛时间 | 实例数 | 负载分担 | 现状与选型 |
|---|---|---|---|---|---|
| STP | IEEE 802.1D | 30~50 秒 | 1(所有 VLAN 一棵树) | 不支持 | 基本淘汰;仅用于兼容极老设备 |
| RSTP | IEEE 802.1w | 1~2 秒 | 1 | 不支持 | 小规模、单实例、快速收敛场景 |
| MSTP | IEEE 802.1s | 1~2 秒 | 多实例(0-15) | 支持按 VLAN 分担 | 现网主流,适合双核心/多业务园区网 |
收敛时间的本质差异在于“是否等待固定计时器”。 STP 中,Listening 和 Learning 各需一个 Forward Delay,常见配置下合计约 30 秒。RSTP/MSTP 引入Proposal/Agreement(P/A)握手、端口角色和更明确的边界条件,在点到点全双工链路上可以不依赖传统两阶段定时器,实现秒级收敛。
【ZCIA】考试只需记住收敛量级、实例数与负载分担三列;【ZCIP】必须解释为什么“两条上行链路都空闲”不等于“两条都能承载当前 VLAN”;【ZCIE】要进一步说明:MSTP 的多实例仍不能突破单实例内部的最优路径选择,若业务无法按 VLAN 拆分,MSTP 也不会自动创造负载分担。
5_1_2 MSTP 的负载分担:让不同 VLAN 走不同阻塞点
MSTP(Multiple Spanning Tree Protocol)不是给每个 VLAN 单独计算一棵树,而是把若干 VLAN 映射到一个 MST 实例(MSTI),每个实例独立计算生成树。这样既减少大量单 VLAN 树的 BPDU 和计算开销,又能让不同实例把阻塞点放在不同链路,实现“按 VLAN 组分流”。
STP/RSTP:所有 VLAN 共用一棵树
┌──────────────┐ ┌──────────────┐
│ CORE-01 │══════════════│ CORE-02 │
└──────┬───────┘ └──────┬───────┘
│ │
▼ ▼
ACC-01 ACC-02
VLAN10/20/30/40:实例0
阻塞点固定在一条上行链路 → 另一条链路当前实例不使用
MSTP:VLAN 分组到不同实例
实例1(VLAN10,20):阻塞右侧 → 办公流量走左侧
实例2(VLAN30,40):阻塞左侧 → 安防流量走右侧
两条上行链路各自承担部分业务,带宽均被利用
MSTP 的负载分担是“受控分流”,不是逐流哈希。 聚合的负载分担基于源目 MAC/IP、端口或报文特征把不同数据流分布到成员口;MSTP 的负载分担则是通过不同实例选择不同根桥、根端口和阻塞端口,使不同 VLAN 的树状路径不同。两者可以叠加,但不能混为一谈:一台接入交换机的某个 VLAN 在某一实例中,仍然只有一条无环转发路径。
设计结论:双核心项目优先采用“实例0兜底、业务实例互备”的模式。例如 CORE-01 是实例1 的主根、实例2 的备根;CORE-02 是实例2 的主根、实例1 的备根。这样既避免一台核心失效后所有业务同时绕行,也保证未明确映射的业务仍有统一 CIST 根。
5_1_3 三大核心概念:根桥、根端口、指定端口
生成树的全部选举最终服务于三个问题:谁是树根、谁负责向上走、谁负责把这一段链路的数据向下游转发。掌握这三项后,再去看 show stp instance 才不会只盯着“blocking”字样。
① 根桥 Root Bridge
- 每个实例(含 CIST)有且仅有 1 个根桥
- 选举依据:桥 ID(Bridge ID,BID)= 桥优先级 + MAC
- 数值越小越优;优先级默认 32768
- 不手工规划时,可能由低 MAC 接入交换机意外当选
② 根端口 Root Port(RP)
- 非根桥上,到达根桥路径开销最小的端口
- 每台非根桥通常只有 1 个根端口
- 负责“向上”把流量送往根桥
③ 指定端口 Designated Port(DP)
- 每条链路上负责转发 BPDU、并向下游发送更优信息的端口
- 根桥的所有可用端口通常都是指定端口
- 未被选为 RP/DP 的端口进入阻塞/备用角色
桥优先级必须和 MAC 一起比较。 首先比较桥优先级;优先级相同再比较 MAC。优先级的可配置范围依实现而异,工程中常见的步长为 4096。将核心配置为 4096/8192,接入保持默认值,是最简单可靠的根桥控制方法。切记:仅仅因为某台设备是“核心”,生成树不会自动让它成为根桥;BPDU 中的优先级和 MAC 才是选举依据。
【踩坑】不要把“根端口”理解成“根桥上的端口”。根端口一定在非根桥上;根桥上没有根端口。也不要把“阻塞端口”等同于“故障端口”:在稳定生成树中,阻塞是必要的、正确的状态。
5_1_4 路径开销:决定根端口与指定端口的“距离”
路径开销(Path Cost)用于衡量到达根桥的累积代价。同一链路速率下,传统 IEEE 802.1D 开销与新标准(802.1T,常称 dot1t)不同。实际设备可能支持自动计算或手动指定,现场必须以 show stp、接口配置和版本说明为准。
| 链路速率 | 传统 STP Cost | 新标准 Cost |
|---|---|---|
| 10 Mbps | 100 | 2,000,000 |
| 100 Mbps | 19 | 200,000 |
| 1 Gbps | 4 | 20,000 |
| 10 Gbps | 2 | 2,000 |
开销口径不一致会让“最优路径”判断失真。 如果一端按传统标准、另一端按新标准,或者手工 cost 覆盖了自动计算结果,就可能出现预期外的根端口。工程建议如下:
- 同一网络统一使用设备默认的同一开销标准,除非有明确规划;
- 跨厂商对接前,核对
show stp中端口 Cost、标准及 BPDU 格式; - 不滥用
cost微调,确需调整时记录原始值、调整方向和回退命令; - 聚合口的 Cost 通常与其成员状态和实现有关,禁止只看单个物理口。
根桥选举与路径选择顺序(简化):
① 最小根桥 BID(优先级 + MAC)
② 到根桥的最小路径开销
③ 最小发送者 BID
④ 最小发送者端口 ID(优先级 + 端口号)
手工干预优先级:
- 根桥位置:instance bridgeprio
- 同链路谁是指定端口:端口/Trunk priority
- 某段路径是否更优:端口/Trunk cost
端口优先级只应作为精细调优手段。 端口优先级(port priority)默认 128,范围依实现可能为 0-255;桥优先级范围可为 0-61440。调整前先在实验环境验证,避免同时修改桥优先级、端口优先级和 Cost,导致故障后无法判断真正决策因素。
5_2 RSTP 快速收敛机制
本节要解决什么问题:RSTP 的「快」不是靠缩短计时器,而是靠点到点链路上的握手机制。理解这一点,才知道 linktype 为什么必须配。
5_2_1 端口角色与状态:RSTP 用角色描述“干什么”,用状态描述“能否转发”
RSTP(802.1w)兼容 STP BPDU,但重新定义了端口角色与状态机。角色解决拓扑职责,状态解决数据/地址学习权限。理解这一点后,MSTP 的 CIST/MSTI 端口状态就更容易理解:它们仍遵循类似的 Discarding/Learning/Forwarding 模型。
RSTP 端口角色(角色解决"拓扑职责")
| 端口角色 | 含义与现网要点 |
|---|---|
| Root Port(根端口,RP) | 到根桥路径最优的端口,每台非根桥一般只有一个;是这台设备"朝根桥方向"的唯一出口 |
| Designated Port(指定端口,DP) | 每条链路上负责转发 BPDU 与数据的端口;根桥上的端口通常都是 DP |
| Alternate Port(替代端口,AP) | Root Port 的候选备份,因收到其他路径的更优 BPDU 而阻塞;根端口失效时可快速切换为 RP |
| Backup Port(备份端口,BP) | Designated Port 的候选备份,指同一网段、同一台桥上的另一个端口;现网较少成为主用角色 |
RSTP 端口状态(由 STP 的 5 种精简为 3 种,状态解决"转发与学习权限")
| 端口状态 | 是否转发数据 | 是否学习 MAC |
|---|---|---|
| Discarding | 否 | 否 |
| Learning | 否 | 是 |
| Forwarding | 是 | 是 |
角色与状态要分开记:角色(RP/DP/AP/BP)是"这个端口在生成树里干什么活",状态(Discarding/Learning/Forwarding)是"这个端口现在能不能转发"。同一个 Alternate 端口,角色是 AP、状态是 Discarding;一旦切换成 RP,角色变了、状态也才转为 Forwarding。
Alternate 是实现快速故障倒换的关键。 当根端口失效,设备可从已同步的 Alternate 端口中快速选出新根端口,而不必从零开始等待长定时器。与之相比,STP 中许多“Blocking”端口需要经历 Listening/Learning,才可能在 30 秒左右进入 Forwarding。
【ZCIP】考试常考“Root/Designated/Alternate/Backup”四角色,应能把 show stp port 输出和拓扑一一对应;【ZCIE】还要解释:Alternate 快速切换成立的前提包括邻居关系、端口状态机、同步机制和链路故障检测均正常,不能只背角色名称。
5_2_2 P/A 握手:RSTP 快速收敛的真正机制
P/A(Proposal/Agreement)握手允许两个 RSTP/MSTP 邻居在确认无环的前提下,将链路快速切换到 Forwarding。它不是“一收到 BPDU 就立即转发”,而是包含提议、同步、确认和逐段推进的过程。
时间轴:SW-A(当前为上游/指定侧)与 SW-B 建立新链路
SW-A SW-B
│ │
│ ---- Proposal(BPDU) -->│ SW-A 提议:这条链路可以进入转发
│ │
│ │ SW-B 执行同步:
│ │ 非边缘、非已同步端口先 Discarding
│ │
│ <-- Agreement(BPDU) ---│ SW-B 确认已同步
│ │
│ 两端该链路 Forwarding │
│ │
│ SW-B 再向下游发起 │
│ 同样的 P/A 握手 │
▼ ▼
关键前提:点到点、全双工链路
- linktype = point-point
- 共享介质(如 Hub)无法保证逐段同步,不使用该快速机制
P/A 是“逐段快速”,不是“全网瞬时”。 从根桥到接入层的每一段链路依次完成握手,因此网络越深,端到端收敛仍可能存在多个环节。若某台中间设备不能同步其下游端口,P/A 就会被延迟,链路可能退回传统定时器行为。
linktype point-point 是最容易被忽略的工程项。 对以太网交换机的全双工点对点互联(含聚合口),应显式配置;对接入终端的端口不应盲目配置为点对点,而应结合边缘端口处理。若设备将链路误判为共享介质,即使物理上是光纤直连,也可能无法充分利用快速握手。
【体系A】将互联口设为点到点
zte(cfg)#set stp port 23-24 linktype point-point
zte(cfg)#set stp trunk 1 linktype point-point
【体系B】接口视图下确认/配置链路类型
ZXR10(config-stp)#interface gei-0/1/0/5
ZXR10(config-stp-if-gei-0/1/0/5)#link-type point-to-point
“配错什么现象”速查:
| 配置问题 | 可能现象 | 验证方式 |
|---|---|---|
互联口误配 shared |
新链路收敛慢,可能经历完整 Learning | show stp port 查看 link-type、状态迁移 |
| 聚合口未配 P/A 相关参数 | 聚合成员变化或新链路建立时收敛不快 | 查看 Trunk STP 状态与角色 |
| 边缘端口接交换机 | 收到 BPDU 后触发保护或拓扑变化 | show logging、show stp port |
| 光纤单通 | 一侧持续发 BPDU,另一侧收不到 | debug spantree bpdu-rx/tx |
5_3 MSTP 核心概念与区域三要素
本节要解决什么问题:MSTP 的复杂度集中在「区域」这个概念上。三要素不一致会让它悄悄退化成单实例,这是最隐蔽的坑。
5_3_1 MSTP 的层次:CIST 保证全局无环,MSTI 实现业务分流
MSTP 在 RSTP 的基础上引入区域(Region)与多实例。CIST(Common and Internal Spanning Tree)把整个网络——包括各 MST 区域和外部 STP/RSTP 网段——组织成一棵公共树;每个区域内部则通过 IST(Internal Spanning Tree,即实例0)连接,业务 VLAN 可再映射到 MSTI 1-15。
┌────────────────────────────────────────────────────────────┐
│ CIST(全局公共树) │
│ │
│ ┌──────────── MST Region A ────────────┐ │
│ │ │ │
│ │ CST:区域与外部相连的“公共树干” │ │
│ │ │ │
│ │ IST(Instance 0):区域内部公共树 │ │
│ │ 默认承载未映射 VLAN │ │
│ │ │ │
│ │ MSTI 1..15:业务实例 │ │
│ │ 每个实例独立选举根、端口角色 │ │
│ └──────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ STP/RSTP 或其他 Region │
└────────────────────────────────────────────────────────────┘
CIST = CST + IST,是理解区域边界的第一把钥匙。 CST(Common Spanning Tree)把每个 MST 区域抽象为一台“虚拟桥”进行外部计算;IST 是区域内部实例0,负责承载未明确映射的 VLAN。因此即使只规划了实例1、实例2,实例0 依然存在,它决定 CIST 根、区域边界端口和兜底路径。
MSTI 的隔离是“生成树隔离”,不是“二层转发隔离”。 同一 VLAN 映射到同一实例,不同 VLAN 可映射到不同实例;一个 VLAN 不能同时属于多个实例。VLAN 在不同设备上的映射关系若不一致,区域边界计算就会出现差异,导致负载分担失效或部分流量绕行。
5_3_2 区域三要素:名称、修订号、VLAN-实例映射
同一 MST 区域内所有设备必须对这些参数达成一致。它不是“只要都写了 MSTP 就能同步”,而是基于 MST Configuration Identifier 的一致性判断。
同一 MST 区域必须完全一致:
① 区域名称 name set stp name <name>
② 修订版本号 revision set stp revision <0-65535>
③ VLAN-实例映射 set stp instance <id> add vlan <list>
任一要素不一致
→ 两台设备被判定在不同区域
→ 区域边界出现 CST 交互
→ MSTI 负载分担失效或路径不符合预期
实例范围固定为 0-15。 实例0 保留给 IST/CIST,不能删除;实例1-15 用于业务。不要为每一个 VLAN 建立一个实例,那样会失去 MSTP 简化控制平面的意义;应按业务、优先级或核心路径把 VLAN 聚合为少数几组。
区域分裂示意:
CORE-01 ── CORE-02 配置:ZTE-REGION-1 / rev 1 / VLAN10→1
│ │
│ │
ACC-01 ───── ACC-02 配置:ZTE-REGION-1 / rev 1 / VLAN10→1
(正常:同一区域,MSTI 可跨设备协同)
ACC-02 错配为 ZTE-CAMUPS / rev 2 / VLAN10→2
→ ACC-02 与其余设备不在同一区域
→ 区域边界计算变化,CST 接管相关交互
→ VLAN10/20 可能出现非预期阻塞、时通时断或无法按规划分流
【案例故事】某园区网割接后,办公 VLAN10/20 白天偶发中断,重启接入交换机后恢复几分钟,随后又出现部分终端无法跨网段访问。四台核心/接入设备的 show stp 区域名都显示“ZTE-CAMPUS”,看似一致。继续比对时发现,一台旧 ACC 的区域名实际是 ZTE-CAMUPS——工程师从 PDF 复制时少了字母 P。同时该设备的 revision 还是 0,VLAN10 被映射到实例2。结果该接入被视为独立区域,CIST 边界改变,某些 VLAN 的阻塞点漂移。show spantree mst-config 的 HMD5 摘要与其他设备完全不同。逐字符修正名称、revision 和映射后,摘要恢复一致,故障再未复现。教训:比对区域三要素不能只看肉眼近似,必须逐字符、逐数字、逐 VLAN 核对。
5_3_3 实例与 VLAN 映射设计:以“双核心互备”为模板
实例规划应遵循“少而明确”:实例0 兜底,业务实例成对互备。下列模板可直接用于双核心、少量业务组的项目;业务较多时,可按部门、服务等级或网段继续聚合,但每个核心承担的主根/备根关系必须清晰。
| 实例 | VLAN | 主根 | 备根 | 阻塞链路(规划值) | 业务 |
|---|---|---|---|---|---|
| 0(IST) | 1, 100(管理/未分配) | CORE-01 | CORE-02 | 不强制指定 | 管理与兜底 |
| 1 | 10, 20(办公) | CORE-01 | CORE-02 | 右侧链路 | 办公流量优先走左 |
| 2 | 40, 50(安防/语音) | CORE-02 | CORE-01 | 左侧链路 | 实时业务优先走右 |
规划模板的可复用规则:
- 每个 VLAN 只映射到一个业务实例;未规划 VLAN 由实例0 承载。
- 核心优先级采用 4096 步长:
4096(主)、8192(备)、默认 32768(接入)。 - 一台核心不能同时是全部业务实例的绝对主根,除非明确接受单侧绕行。
- 映射变更属于网络行为变更,应先在维护窗口、测试环境或离线配置中核对。
- 所有设备保存同一份“实例—VLAN—根桥—阻塞点”矩阵,禁止凭记忆配置。
【可复用规划骨架】
核心A:instance 0 = 4096,instance 1 = 4096,instance 2 = 8192
核心B:instance 0 = 8192,instance 1 = 8192,instance 2 = 4096
接入: instance 0/1/2 保持默认(或按现场规范统一),绝不参与抢根
区域: name/revision/映射 全网一致
5_4 MSTP 配置命令全解
本节要解决什么问题:本节把 MSTP 的基本命令、端口控制、时间参数与显示命令一次讲全,并给出时间参数的约束公式。
5_4_1 基本配置:12 条命令的现场含义
以下为 12 条基本配置命令全表。命令行保留原始语法;方括号表示应替换或可选内容,实际输入时不输入方括号。体系A 以 zte(cfg)# 为例,体系B 见 5_5_6。
| # | 功能 | 命令 |
|---|---|---|
| 1 | 使能/关闭 STP | set stp {enable|disable} |
| 2 | 强制 STP 类型 | set stp forceversion {mstp|rstp|stp} |
| 3 | VLAN 与实例映射 | set stp instance [0-15] [add|delete] vlan [vlanlist] |
| 4 | 网桥优先级 | set stp instance [0-15] bridgeprio [0-61440] |
| 5 | 实例端口优先级 | set stp instance [0-15] port [portname] priority [0-255] |
| 6 | 实例 Trunk 优先级 | set stp instance [0-15] trunk [trunkid] priority [0-255] |
| 7 | 实例端口费用 | set stp instance [0-15] port [portname] cost [1-200000000] |
| 8 | 实例 Trunk 费用 | set stp instance [0-15] trunk [trunkname] cost [1-200000000] |
| 9 | 端口 Root 保护 | set stp instance [0-15] port [portname] root-guard {enable|disable} |
| 10 | 端口 Loop 保护 | set stp instance [0-15] port [portname] loop-guard {enable|disable} |
| 11 | Trunk Root 保护 | set stp instance [0-15] trunk [trunkname] root-guard {enable|disable} |
| 12 | Trunk Loop 保护 | set stp instance [0-15] trunk [trunkname] loop-guard {enable|disable} |
命令怎么用:
set stp enable:开局第一句;若协议未开,后面所有实例和保护配置都没有防环效果。forceversion mstp:显式锁定模式,避免被老旧邻居或默认配置影响;跨厂商时仍需确认 BPDU 格式。instance X add vlan:先做规划再加映射;删除时先确认没有其他设备仍把该 VLAN 映射到此实例。bridgeprio:控制根桥的主工具。值越小越优先;采用 4096 倍数,便于排错与扩展。port/trunk priority:仅在两条上行等价、需要精确指定指定端口时使用;应先记录原值。port/trunk cost:用于改变路径选择;手动修改后,务必检查所有实例的累积开销。root-guard:通常配在核心的下行口或面向可能抢根的端口;loop-guard常用于互联口或光纤链路。
配错现象与验证:
zte(cfg)#set stp enable
zte(cfg)#set stp forceversion mstp
zte(cfg)#set stp instance 1 add vlan 10,20
zte(cfg)#set stp instance 1 bridgeprio 4096
zte(cfg)#set stp instance 1 port 23 priority 128
zte(cfg)#set stp instance 1 trunk 1 priority 128
zte(cfg)#set stp instance 1 port 23 cost 20000
zte(cfg)#set stp instance 1 trunk 1 cost 20000
zte(cfg)#set stp instance 1 port 23 root-guard enable
zte(cfg)#set stp instance 1 port 23 loop-guard enable
zte(cfg)#set stp instance 1 trunk 1 root-guard enable
zte(cfg)#set stp instance 1 trunk 1 loop-guard enable
验证时应逐项查看:show stp 是否 enable、show stp instance 1 的根桥和本桥优先级、show stp port 23 的角色/状态、show stp trunk 1 的 STP 参与情况。若根桥不是规划设备,先查全局 enable、实例映射、桥优先级和上游 BPDU,不要先改 cost。
5_4_2 端口与 Trunk 控制:边缘、BPDU、链路类型和报文格式
| 功能 | 命令 |
|---|---|
| 端口 STP 开关 | set stp port [portlist] {enable|disable} |
| Trunk STP 开关 | set stp trunk [trunklist] {enable|disable} |
| 端口 BPDU 保护 | set stp port [portlist] bpdu-guard {enable|disable} |
| 端口 STP 类型检查 | set stp port [portlist] pcheck |
| 端口 Link Type | set stp port [portlist] linktype {point-point|shared} |
| Trunk Link Type | set stp trunk [trunklist] linktype {point-point|shared} |
| 端口报文类型 | set stp port [portlist] packettype {ieee|cisco|huawei|hammer|extend} |
| Trunk 报文类型 | set stp trunk [trunklist] packettype {ieee|cisco|huawei|hammer|extend} |
端口控制的核心原则:面向终端和面向网络的端口必须分类配置。
PC/打印机/摄像头/服务器
────────────────────────────────
edge-port + bpdu-guard
目的:终端接入立即 Forwarding;若有人私接交换机,立刻触发保护
交换机之间、聚合口、上行口
────────────────────────────────
通常 STP enable
linktype point-point(全双工点对点)
按需 root-guard / loop-guard
绝不能再配 edge-port
bpdu-guard:边缘口收到 BPDU 时执行保护动作(通常为 shutdown/error-disable,具体依型号)。恢复前要清除根因,不能只执行shutdown/no shutdown。pcheck:用于类型或参数一致性检查;现场应结合具体版本说明和?帮助理解其作用范围。linktype point-point:全双工直连互联的前提;若设备无法自动识别,手工配置能避免退化为共享介质行为。packettype:跨厂商 BPDU 兼容的关键。标准对接优先ieee;与思科/华为私有实现互操作时,按现网测试结果选择。更改报文格式会导致邻居重新处理 BPDU,应在维护窗口操作。
【踩坑】边缘端口不能配置在交换机互联口。 边缘端口假定对端没有桥、不会发 BPDU,因此跳过普通参与计算。如果互联口误配为边缘端口,一旦形成环,失去正常阻塞机会,极易造成风暴。正确顺序是:先确认端口角色,再配置 STP 属性。
5_4_3 时间与区域参数:稳定网络优先保持默认值
| 功能 | 命令 |
|---|---|
| Hello Time | set stp hellotime [1-10] |
| Forward Delay | set stp forwarddelay [4-30] |
| Max Age | set stp agemax [6-40] |
| 最大跳数 | set stp hopmax [1-40] |
| MST 区域名称 | set stp name [name] |
| MST 版本号 | set stp revision [0-65535] |
| STP Relay | set stp relay {enable|disable} |
| 边缘端口 | set stp edge-port {add|delete} port [portlist] |
| HMD5 摘要 | set stp hmd5-digest {cisco|huawei} [0,0x00..0-0xff..f] |
| HMD5 关键字 | set stp hmd5-key {cisco|huawei} [0,0x00..0-0xff..f] |
参数边界:
hellotime:1-10 秒;常见默认 2 秒。forwarddelay:4-30 秒;常见默认 15 秒。agemax(Max Age):6-40 秒;常见默认 20 秒。hopmax:1-40;用于限制 BPDU 在 MST 区域中的传播跳数,依实现和场景配置。name:区分大小写、逐字符匹配,务必复制配置文本而非手打。revision:0-65535;建议工程采用有含义的版本号,变更时递增。hmd5-digest / hmd5-key:跨厂商兼容时使用;普通中兴同区域组网仍以三要素一致性为先。
区域配置必须作为一个整体提交。 修改 name、revision 或 VLAN 映射前,先确认所有相关设备的配置版本、变更窗口和回退方案。特别是 instance X delete vlan,应先确认该 VLAN 在邻居设备上的新归属,避免同一区域出现临时映射不一致。
5_4_4 显示命令:从全局到端口的“三层查看法”
| 功能 | 命令 |
|---|---|
| 显示 STP 信息 | show stp |
| 显示实例信息 | show stp instance [[0-15]] |
| 显示端口信息 | show stp port [[portlist]] |
| 显示 Trunk 信息 | show stp trunk [trunklist] |
| 显示 Relay 信息 | show stp relay |
推荐的排障读取顺序:
show stp:先看全局 enable/disable、版本、桥 ID、区域名和 revision;show stp instance X:确认根桥、本桥角色、各端口角色;show stp port/trunk:确认 STP 是否参与、link-type、状态、BPDU 收发;show stp relay:仅在涉及 Relay 穿透/跨设备场景使用。
体系B 的常见对应命令见 5_5_6。现场如遇命令不存在,应进入配置模式使用 ?,并查看运行配置,禁止猜测关键字。
5_4_5 三个时间参数约束:改一个,就要验算整组
标准的 STP 时间参数必须满足:
2 × (ForwardDelay − 1) ≥ MaxAge ≥ 2 × (HelloTime + 1)
典型默认值:
HelloTime = 2s
ForwardDelay = 15s
MaxAge = 20s
验算:
左侧 = 2 × (15 − 1) = 28
右侧 = 2 × (2 + 1) = 6
不等式:28 ≥ 20 ≥ 6 ✅ 满足
这组约束的本质是“BPDU 老化与状态迁移要匹配”。 Max Age 决定根桥信息多久过期;Forward Delay 决定 Listening/Learning 时长;Hello Time 决定 BPDU 发送间隔。若只把 Max Age 改小,可能使 BPDU 过早老化,网络频繁重算;若只改大 Forward Delay,收敛时间又会拉长。
【踩坑】除非有充分测试和明确需求,否则保持默认值。若必须调整,先把三个参数代入约束公式,再在实验环境模拟根桥切换、链路震荡和 BPDU 丢失。现场常见的“改小 Hello 后更快检测到变化”并不是没有代价:BPDU 频率、CPU 负荷及邻居处理节奏都应纳入评估。
5_5 MSTP 工程配置实例
本节要解决什么问题:从本节开始进入可落地的工程配置:双核心拓扑、主备根、边缘端口、体系B 的 spantree 原生写法与 HMD5 判读。
5_5_1 拓扑与规划:先把根桥、阻塞点和保护点画出来
┌──────────┐ ┌──────────┐
│ CORE-01 │═════════│ CORE-02 │
│ 实例1主根 │ 聚合 │ 实例2主根 │
└────┬─────┘ └─────┬────┘
│ │
┌──────────┘ └──────────┐
│ │
┌─────▼─────┐ ┌──────▼────┐
│ ACC-01 │══════════════════════════════│ ACC-02 │
└───────────┘ 冗余链路(可能产生环路) └───────────┘
规划:
区域名称:ZTE-REGION-1
版本号:1
实例0:VLAN 1, 100(管理/兜底)
实例1:VLAN 10, 20(办公) → CORE-01 主根、CORE-02 备根
实例2:VLAN 40, 50(安防/语音)→ CORE-02 主根、CORE-01 备根
工程前置检查:
- 所有互联接口已 UP,双工/速率符合规划;
- 聚合(如有)已正常、成员口一致;
- VLAN 已创建并在 Trunk 上放行;
- 管理地址、静态路由/VRRP 与生成树阻塞点无冲突;
- 配置前已备份
running-config,并准备回退脚本。
5_5_2 CORE-01:实例1 的主根、实例2 的备根
zte(cfg)#set stp enable
zte(cfg)#set stp forceversion mstp
! ---------- 区域三要素 ----------
zte(cfg)#set stp name ZTE-REGION-1
zte(cfg)#set stp revision 1
zte(cfg)#set stp instance 1 add vlan 10,20
zte(cfg)#set stp instance 2 add vlan 40,50
! ---------- 实例优先级(值越小越优先,步长 4096) ----------
zte(cfg)#set stp instance 0 bridgeprio 4096 ! 兜底根
zte(cfg)#set stp instance 1 bridgeprio 4096 ! 实例1:CORE-01 为主根
zte(cfg)#set stp instance 2 bridgeprio 8192 ! 实例2:CORE-01 为备份根
! ---------- 链路类型(聚合与骨干链路设为点到点,启用快速收敛) ----------
zte(cfg)#set stp trunk 1 linktype point-point
zte(cfg)#set stp port 1-24 linktype point-point
! ---------- 边缘端口(接终端,不参与 STP 计算,立即转发) ----------
zte(cfg)#set stp edge-port add port 3-20
! ---------- 边缘端口加 BPDU 保护(收到 BPDU 立即关闭端口) ----------
zte(cfg)#set stp port 3-20 bpdu-guard enable
! ---------- 上行口 Root 保护(防止接入交换机抢占根桥) ----------
zte(cfg)#set stp instance 0 port 21 root-guard enable
zte(cfg)#set stp instance 1 port 21 root-guard enable
zte#show stp
zte#show stp instance 1
现场解释:
- 核心同时做实例1 主根和实例2 备根,是为了在一台核心失效时仍能保持所有实例有确定根桥。
trunk 1对应核心互联聚合口;若现场聚合编号不同,必须替换为真实 Trunk ID。port 3-20若实际接服务器或终端才设为边缘端口;如连接其他交换机,应删除edge-port并配置loop-guard。root-guard配在下行口,防止接入设备因更高优先级 BPDU 抢根;它不是“禁止根桥发 BPDU”,而是限制对端改变根角色。
5_5_3 CORE-02:实例2 的主根、实例1 的备根
zte(cfg)#set stp enable
zte(cfg)#set stp forceversion mstp
zte(cfg)#set stp name ZTE-REGION-1
zte(cfg)#set stp revision 1
zte(cfg)#set stp instance 1 add vlan 10,20
zte(cfg)#set stp instance 2 add vlan 40,50
zte(cfg)#set stp instance 0 bridgeprio 8192
zte(cfg)#set stp instance 1 bridgeprio 8192 ! 实例1:备份根
zte(cfg)#set stp instance 2 bridgeprio 4096 ! 实例2:主根
zte(cfg)#set stp edge-port add port 3-20
zte(cfg)#set stp port 3-20 bpdu-guard enable
为什么两台核心不能都用 4096? 若优先级完全相同,根桥会进一步比较 MAC,结果依赖设备 MAC,无法稳定控制。采用 4096/8192 互备,既明确主备,又给未来增加第三台核心留出优先级空间。接入保持默认 32768,确保不会在根桥选举中反超核心。
5_5_4 ACC-01 / ACC-02:接入层保持默认根优先级
zte(cfg)#set stp enable
zte(cfg)#set stp forceversion mstp
zte(cfg)#set stp name ZTE-REGION-1 ! 必须与核心完全一致
zte(cfg)#set stp revision 1 ! 必须与核心完全一致
zte(cfg)#set stp instance 1 add vlan 10,20
zte(cfg)#set stp instance 2 add vlan 40,50
! 接入交换机优先级保持默认(32768),确保不抢占根桥
! 上行口设为点到点
zte(cfg)#set stp port 23-24 linktype point-point
! 用户口设为边缘端口 + BPDU 保护
zte(cfg)#set stp edge-port add port 1-20
zte(cfg)#set stp port 1-20 bpdu-guard enable
接入层最重要的不是“配得更复杂”,而是“不抢根、不误当边缘”。 上行口必须参与 STP,并配置 P/A 前提;用户口采用 edge + bpdu-guard;下联口禁止套用核心的 root-guard 模板。若接入下联又接接入,应重新评估拓扑,不能机械复制脚本。
5_5_5 验证清单:先证明规划,再证明连通性
show stp ! 全局:协议版本、区域名、版本号、本桥 ID
show stp instance 1 ! 实例1:根桥是谁、本桥角色、端口角色
show stp instance 2 ! 实例2:根桥应该是 CORE-02
show stp port 23 ! 端口角色(Root/Designated/Alternate)、状态
show stp trunk 1 ! 聚合口的 STP 状态
| 检查项 | 预期 | 不符时排查方向 |
|---|---|---|
show stp 区域名/版本号 |
四台设备完全一致 | 核对 name/revision 字符、设备配置版本 |
| 实例1 根桥 | CORE-01 | 检查 enable、bridgeprio、上游 BPDU |
| 实例2 根桥 | CORE-02 | 检查 CORE-02 实例2 优先级与映射 |
| CORE 到 ACC 端口角色 | 实例1/2 分别形成规划的根/指定/阻塞关系 | 查 cost、port priority、link-type |
| ACC 是否为根 | 否 | ACC 应保持默认 32768;检查误配 root-guard |
| 边缘端口状态 | 上线即 Forwarding | 确认 edge-port、终端无 BPDU、端口 UP |
| BPDU 收发 | 互联口 rx/tx 均增长 | 单通链路、光模块、中间设备 ACL/过滤 |
| 聚合口状态 | Trunk 参与 STP、成员口正常 | 聚合模式、负载分担、Trunk STP enable |
5_5_6 体系B 的 spantree:模式、全局开关与区域参数
中兴中高端设备可能采用 spantree 配置模式,与体系A 的 set stp 在命令风格、默认值和视图位置上有明显差异。开工前必须先确认软件版本、CLI 提示符和实际关键字;下列内容保留原始真实写法,并用“现场确认”兜底。
标准配置流程(体系B)
! ---------- 1. 进入 STP 配置模式并全局启用 ----------
ZXR10(config)#spantree ! 进入 STP 配置模式
ZXR10(config-stp)#enable ! 全局启用(注意:部分型号全局默认 DISABLE!)
ZXR10(config-stp)#spantree mode mstp ! 设置模式为 MSTP
! ---------- 2. 配置 MST 区域三要素 ----------
ZXR10(config-stp)#mst name ZTE-CAMPUS ! 区域名(默认是设备系统 MAC)
ZXR10(config-stp)#mst revision 1 ! 版本号(默认 0)
ZXR10(config-stp)#instance 1 vlan 10,20 ! 实例-VLAN 映射
ZXR10(config-stp)#instance 2 vlan 40,50
ZXR10(config-stp)#exit
! ---------- 3. 端口级配置 ----------
ZXR10(config-stp)#interface gei-0/1/0/5
ZXR10(config-stp-if-gei-0/1/0/5)#enable ! 端口启用 STP(端口默认通常是启用)
ZXR10(config-stp-if-gei-0/1/0/5)#packet-type ieee ! 报文类型(默认 IEEE)
ZXR10(config-stp-if-gei-0/1/0/5)#exit
! ---------- 4. 验证 ----------
ZXR10(config)#show spantree mst-config ! 看模式、Name、Revision、HMD5
ZXR10(config)#show spantree mst ! 看实例映射与摘要
ZXR10(config)#show spantree instance 0 ! 看实例 0(未启用会提示 STP is disabled)
ZXR10(config)#show spantree interface gei-0/1/0/5 ! 看端口角色与状态
体系B 关键默认参数(与盒式不同,考试易错)
| 参数 | 体系B(5900E/8900E)默认 | 体系A(盒式)默认 |
|---|---|---|
| STP 工作模式 | MSTP | 依型号,建议 set stp forceversion mstp |
| STP 全局开关 | disable(默认关闭!) | 依型号 |
| 端口 STP 开关 | enable(默认开启) | 依型号 |
| MST 区域名 | 设备系统 MAC 地址 | 空/默认 |
| MST 修订版本号 | 0 | 0 |
| BPDU 报文类型 | IEEE 标准 | IEEE |
【踩坑】“全局 STP 默认关闭”是体系B 最危险的默认值。 若只配置端口参数而漏掉 spantree → enable,show spantree instance 0 会提示 STP is disabled!,此时网络没有生成树防环能力。开局脚本必须将“进入 spantree 模式、全局 enable、配置模式、保存配置”作为一个原子步骤执行。
上线前逐字符核对清单:
[ ] spantree / spanning-tree 关键字是否与本版本一致
[ ] 全局 enable 是否已提交
[ ] mode 是否 mstp(若需求为 MSTP)
[ ] mst name 是否与全网完全一致(区分大小写、空格、连字符)
[ ] mst revision 是否一致
[ ] instance X vlan 是否一致,VLAN 是否实际存在
[ ] 各核心 bridgeprio / root priority 是否符合主备规划
[ ] 互联口 STP enable、link-type、保护配置是否应用
[ ] edge-port 是否仅面向终端;bpdu-guard 是否配套
[ ] 配置是否已 write/save,重启后是否仍生效
[ ] show spantree mst-config 的 HMD5 是否已与其他设备比对
5_5_7 HMD5 摘要判读:区域一致性的第一证据
show spantree mst-config 的 HMD5 字段由区域名、修订号、VLAN-实例映射等信息共同参与计算。它不是随便填的密钥,而是判断设备是否属于同一配置区域的重要证据。
ZXR10(config)#show spantree mst-config
spanning-tree mode: [MSTP]
Name Revision Instance Vlans mapped
[zte] 0 0 1-4094
CISCO Hmd5-key : 0x13ac06a62e47fd51f95d2ba243cd0346
CISCO Hmd5-digest : 0x00000000000000000000000000000000
HUAWEI Hmd5-key : 0x13ac06a62e47fd51f95d2ba243cd0346
HUAWEI Hmd5-digest : 0x00000000000000000000000000000000
判读规则:
- 两台设备的
Hmd5-key/digest完全相同:区域三要素一致,属于同一 MST 区域; - 任一侧 不相同:很可能处于不同区域,应优先检查 name、revision、VLAN-实例映射和厂商私有摘要选项;
- 摘要一致但拓扑仍异常:再检查优先级、cost、端口角色、link-type 和 BPDU 收发;
- 摘要不一致时,不要先调整 cost 或保护特性,那样只会掩盖区域分裂。
HMD5 的正确使用边界: 它是配置一致性校验工具,不是“把摘要改成相同就能互通”的配置对象。若设备显示的摘要算法、厂商标记不同,应先统一标准配置和 packet-type,让摘要自然一致,而不是手工复制对端摘要。依型号/软件版本不同,摘要显示字段可能不同,现场以实际 show spantree mst-config 为准。
5_5_8 官方排障四步:把环路风暴收敛为四个 Yes/No
STEP 1 检查全局 STP 是否启用
ZXR10(config)#show spantree instance 0
→ 若显示 "STP is disabled!":
ZXR10(config)#spantree
ZXR10(config-stp)#enable
STEP 2 检查环上互联端口是否启用 STP
ZXR10(config)#show spantree interface gei-0/1/1/5
→ 若显示 "NON_STP" 或 "The port is STP disable":
ZXR10(config-stp)#interface gei-0/1/1/5
ZXR10(config-stp-if-gei-0/1/1/5)#enable
→ 正常输出示例:
Mst Instance Prio.Nbr Port ID Cost State Role
MST00 128.3 128.3 20000 Forward Designated
STEP 3 检查环上各端口的 BPDU 报文类型是否一致
ZXR10(config-stp-if-gei-0/1/1/5)#packet-type ?
cisco huawei hammer ieee
→ 全网建议统一为 ieee
STEP 4 检查 BPDU 收发是否正常
ZXR10#debug spantree bpdu-rx interface gei-0/1/1/5
ZXR10#debug spantree bpdu-tx interface gei-0/1/1/5
→ 若只有 tx 没有 rx:单向链路(光纤收发光故障)或 BPDU 被中间设备丢弃
四步的内在逻辑是“由全局到局部、由控制面到物理层”。 第一步排除“根本没有防环协议”;第二步排除端口被排除在生成树外;第三步排除 BPDU 方言不一致;第四步验证邻居是否真实交换控制报文。任何一步为 No,都不应跳过后续步骤直接改业务配置。
【踩坑】debug 会产生大量日志并增加 CPU 负担,必须指定接口、限定时间;确认后立即 undebug 或退出调试。生产环境应先评估日志输出、终端连接和设备负载。
5_6 保护特性与单向链路定位
本节要解决什么问题:配好 STP 不等于安全。本节讲四大保护特性,并给出「只发不收即单向链路」这一最难查故障的定位手段。
5_6_1 四大保护机制:分别解决私接、抢根、单通与终端接入
① BPDU 保护(bpdu-guard)
场景:边缘端口(接 PC)本不该收到 BPDU
用户私接交换机 → 边缘口收到 BPDU → 立即 shutdown 端口
┌────────┐ BPDU ┌──────────┐
│ 私接SW │─────────►│边缘端口 │──► 端口被关闭,产生告警
└────────┘ └──────────┘
② Root 保护(root-guard)
场景:上行口收到“更优的 BPDU”(对端宣称自己是根)
→ 拒绝接受,端口进入不一致/阻塞状态,保护根桥地位
注意:配置在“可能接收到更优根 BPDU”的端口,通常是核心下行口
③ Loop 保护(loop-guard)
场景:链路单向故障,收不到 BPDU
→ 端口不会盲目从阻塞切为转发
作用:收不到 BPDU 时保持阻塞,降低单向转发形成环路的风险
④ 边缘端口(edge-port)
接终端的端口跳过普通计算,直接 Forwarding
风险:一旦接交换机成环 → 必须配 BPDU 保护
保护不是互相替代,而是分别覆盖不同故障模型:
| 特性 | 适用位置 | 触发条件 | 防止的故障 | 不宜使用位置 |
|---|---|---|---|---|
| BPDU Guard | 终端/服务器边缘口 | 收到 BPDU | 私接桥、边缘成环 | 交换机互联口 |
| Root Guard | 下行/可能抢根的口 | 收到更优根 BPDU | 根桥被意外抢占 | 已确定的根端口上游 |
| Loop Guard | 互联口、光纤链路 | 持续收不到 BPDU | 单向链路后误转发 | 边缘口(已由 bpdu-guard 处理) |
| Edge Port | 终端口 | 端口连接终端 | 接入等待过久 | 交换链路、聚合口 |
Root Guard 和 Loop Guard 的区别是高频考点。 Root Guard 关心“根角色是否被更优 BPDU 改变”;Loop Guard 关心“本应收到 BPDU 的端口是否失去控制报文”。二者可针对不同风险同时部署,但必须确认型号实现、端口状态和恢复机制。
5_6_2 保护配置组合:写入开局模板
| 端口类型 | edge-port | bpdu-guard | root-guard | loop-guard |
|---|---|---|---|---|
| 用户接入(PC/打印机/摄像头) | 是 | 是 | — | — |
| AP 接入 | 是(或按型号) | 是 | — | — |
| 上行至核心/汇聚 | — | — | 是(下行口) | 可选 |
| 服务器端口 | 是 | 是 | — | — |
| 交换机互联 | — | — | 视拓扑 | 是(推荐) |
【体系A 模板片段】
set stp edge-port add port 1-20
set stp port 1-20 bpdu-guard enable
set stp port 23-24 linktype point-point
set stp instance 0 port 23-24 loop-guard enable
set stp instance 0 port 21 root-guard enable
保护配置必须带恢复方案。 例如 BPDU Guard 触发后,端口可能进入 error-disable。恢复流程应先拔除私接设备、确认拓扑,再执行 shutdown/no shutdown 或自动恢复(依型号支持情况)。禁止在根因未清除时反复 no shutdown,否则会形成“保护—恢复—再环—再保护”的振荡。
5_6_3 跨厂商对接:先统一方言,再讨论根桥
set stp port <list> packettype {ieee|cisco|huawei|hammer|extend}
set stp trunk <list> packettype {ieee|cisco|huawei|hammer|extend}
set stp hmd5-digest {cisco|huawei} <key> ! 摘要密钥,兼容厂商私有摘要算法
set stp hmd5-key {cisco|huawei} <key>
对接原则:
- 标准设备对接:优先
ieee; - 思科私有 PVST+/MST 场景:依现网测试选择
cisco; - 华为场景:依现网测试选择
huawei; - 摘要不匹配是区域协商失败的高频原因;
- 不要跨厂商假设所有 RSTP/MSTP 扩展完全一致,先抓 BPDU 或在测试环境验证。
保护特性决策树:
端口对端是终端吗?
├─ 是 → edge-port = yes
│ └─ 再问:是否可能私接交换机?
│ ├─ 是 → bpdu-guard = yes
│ └─ 否 → 仍建议 bpdu-guard(纵深防御)
└─ 否(交换机/聚合/光纤)
├─ 是否需要保护根桥?
│ └─ 是 → root-guard = yes
└─ 是否存在单向故障风险?
└─ 是 → loop-guard = yes
5_6_4 单向链路定位:debug spantree bpdu-rx/tx
单向链路是生成树最隐蔽的故障之一。光纤一根断裂、光模块单向劣化、清洁不良、中间透明设备丢弃 BPDU,都可能导致一侧持续发送、另一侧完全收不到。此时端口物理状态可能仍是 UP,Ping 也可能时好时坏,但 STP 控制面已经不对称。
正常双向链路:
SW-A ──(tx BPDU)──► SW-B
SW-A ◄──(rx BPDU)── SW-B
rx/tx 均有计数且持续变化
单向链路:
SW-A ──(tx BPDU)──► SW-B ✅ tx 有输出
SW-A ◄──(rx ?)───── SW-B ❌ rx 无输出
→ 只发不收 = 单向链路嫌疑
判据:debug spantree bpdu-tx 有输出而 bpdu-rx 无输出,等于“只发不收”,应优先排查单向链路。 但必须与普通“邻居未开 STP”区分:若对端根本未发送 BPDU,也会 rx 为零;若 tx 也在同一接口持续增加、对端确认未发送,则更可能是配置或中间设备问题;若物理层已经出现收光异常,则更偏向光模块/光纤。
ZXR10#debug spantree bpdu-rx interface gei-0/1/1/5
ZXR10#debug spantree bpdu-tx interface gei-0/1/1/5
观察 30~60 秒:
- rx/tx 都增长:控制面基本正常,继续看角色与优先级
- 仅 tx 增长:单向链路或 BPDU 被丢弃
- rx/tx 都无:本端或邻居 STP 未 enable,或接口未参与
确认后立即取消调试:
ZXR10#undebug all
【案例故事】某汇聚环在凌晨间歇性出现广播风暴,端口没有 CRC 增长、光功率曲线也在阈值内,Ping 有时正常,团队一度怀疑是 ARP 或病毒。连续两次风暴后,我们在汇聚口启用 debug spantree bpdu-rx/tx,只观察一个周期:一端 bpdu-tx 每 2 秒增加一次,bpdu-rx 始终为 0;对端接口则相反。更换该段一根 LC-LC 跳线并交叉测试光模块后,rx 恢复。复盘发现该链路曾因施工弯折,长期属于“物理 UP、控制面单通”。随后在所有核心/汇聚互联口补配 Loop Guard,并把 BPDU 收发计数纳入巡检。教训:没有 CRC 不等于没有二层故障;生成树异常时,第一手证据是 BPDU rx/tx。
5_7 故障排查、笔记方法与验证清单
本节要解决什么问题:STP 故障的共同特点是「现象吓人、原因很小」。本节给出决策树、笔记模板与验证清单。
5_7_1 故障排查决策树
现象:网络成环/广播风暴/部分 VLAN 不通/收敛慢
│
├─ ① show stp STP 是否 enable?版本是否 mstp?
│ └─ 未开 → 立即开启(成环时这是急救)
│
├─ ② show stp instance 0 根桥是谁?
│ └─ 根桥是接入交换机?→ 立即调整核心优先级为 4096/0
│
├─ ③ 区域三要素是否一致? 名称/版本号/VLAN映射
│ └─ 不一致 → 区域分裂 → MSTP 退化成 CST → 负载分担失效、VLAN 不通
│
├─ ④ show stp port 端口角色与状态是否合理?
│ └─ 期望转发的口被 Discarding?→ 查 cost/优先级配置
│ └─ 端口被 root-guard 阻断?→ 检查是否有设备试图抢根
│
├─ ⑤ show stp port 边缘端口是否误配在交换机互联口上?
│ └─ 边缘口成环的第一大原因
│
├─ ⑥ 跨厂商对接 packettype 与 hmd5 是否匹配?
│
└─ ⑦ 成环应急 先 shutdown 疑似环路端口止血,再排查
决策树的执行纪律: 每一步记录命令、实际输出和判断结论。不能因为“业务恢复”就停止排查;否则根因未除,下一次拓扑变化还会复发。
5_7_2 成环应急处理流程:识别—止血—验证—排查—加固—复盘
① 识别:交换机 CPU 飙升、端口流量打满、MAC 表剧烈漂移、全网变慢
② 止血:shutdown 广播包增长最快的端口(或先拔线)
zte(cfg)#set port <id> disable
③ 验证:CPU 与流量下降,网络恢复
④ 排查:确认环路点(是否是私接交换机、是否光纤错连、STP 是否未开)
⑤ 加固:开启 STP、边缘端口 + BPDU 保护、端口描述规范
⑥ 复盘:写入变更与验收文档
止血动作必须可逆且有记录。 执行 set port disable 或拔线前,应记录端口、所属设备、影响范围、时间和操作人;恢复时逐条回退。对核心互联口尤其不能盲目 shutdown,否则可能把局部环路问题升级为大面积断网。
5_7_3 高频故障速查表
| 现象 | 原因 | 判据 | 处理 |
|---|---|---|---|
| 全网卡顿、CPU 100% | 二层环路 | 端口流量打满、MAC 漂移 | 止血后开启 STP |
| 根桥是接入交换机 | 未配置优先级 | show stp instance 0 |
核心设 bridgeprio 4096 |
| VLAN 间时通时断 | 区域三要素不一致 | 四台设备 show stp 比对 |
统一名称/版本号/映射 |
| 接入端口 30s 才能上网 | 未配边缘端口 | show stp port 状态变化慢 |
set stp edge-port add port |
| 私接交换机后全网异常 | 未配 BPDU 保护 | 边缘口收到 BPDU | 补 bpdu-guard enable |
| 汇聚被抢占根桥 | 未配 Root 保护 | show stp instance |
下行口 root-guard enable |
| 与华为设备无法同区域 | packettype/hmd5 不匹配 | show stp |
设 packettype huawei + hmd5 |
| 单向光纤导致环路 | 未配 Loop 保护 | 端口收不到 BPDU | loop-guard enable |
| STP Relay 相关异常 | relay 配置不当 | show stp relay |
按需求关闭/开启 |
| 体系B 显示 STP is disabled | 全局 STP 默认关闭 | show spantree instance 0 |
spantree → enable |
| 端口显示 NON_STP | 端口 STP 被关闭 | show spantree interface <口> |
端口下 enable |
| 跨厂商 MSTP 不生效 | HMD5 摘要不一致 | show spantree mst-config 比对 |
对齐三要素 + packet-type |
| 只有 tx 没有 rx | 单向链路 | debug spantree bpdu-rx/tx |
换光模块/光纤,加 Loop Guard |
5_7_4 【笔记方法】一、STP 拓扑基线记录表
每次开局、变更或排障后更新。基线存在的意义是:故障时能快速判断“现在和正常哪里不同”。
# STP 拓扑基线记录表
设备名称:__________
采集时间:__________
协议模式:MSTP / RSTP / STP
全局状态:enable / disable
区域名称:__________
修订号:__________
HMD5(Cisco/Huawei):__________ / __________
| 实例 | 根桥 | 主根 | 备根 | 本桥优先级 | 根端口 | 指定端口 | 阻塞端口 |
| ---- | ---- | ---- | ---- | ---------- | ------ | -------- | -------- |
| 0 | | | | | | | |
| 1 | | | | | | | |
| 2 | | | | | | | |
关键互联口:
| 接口 | 对端设备 | STP enable | link-type | role | state | BPDU rx | BPDU tx | 保护 |
| ---- | -------- | ---------- | --------- | ---- | ----- | ------- | ------- | ---- |
| | | | | | | | | |
变更后复核:
[ ] 根桥符合规划
[ ] 每个实例阻塞点符合规划
[ ] 区域三要素全网一致
[ ] 无边缘口误用于互联
[ ] BPDU rx/tx 正常
5_7_5 【笔记方法】二、区域三要素核对表
# MST 区域三要素核对表(上线前逐字符核对)
| 设备 | name(复制粘贴) | revision | instance 0 vlan | instance 1 vlan | instance 2 vlan | HMD5一致 |
| ---- | ---------------- | -------- | --------------- | --------------- | --------------- | -------- |
| CORE-01 | | | | | | |
| CORE-02 | | | | | | |
| ACC-01 | | | | | | |
| ACC-02 | | | | | | |
核对规则:
[ ] name:大小写、空格、连字符、字符数全部一致
[ ] revision:十进制数值一致
[ ] instance-vlan:每个 instance 的 VLAN 集合一致
[ ] 不存在同一 VLAN 在不同设备映射到不同 instance
[ ] show spantree mst-config / show stp 摘要一致
[ ] 配置已保存,重启后三要素仍一致
5_7_6 【笔记方法】三、拓扑变更事件记录模板
# 拓扑变更事件记录
日期/时间:__________
触发原因:链路 UP/DOWN / 设备重启 / VLAN 变更 / 设备接入 / 手工操作
影响范围:VLAN/实例/接入区域:__________
变更前:
- 根桥/阻塞点/关键端口角色:__________
变更操作(逐条命令):
1.
2.
变更后验证:
- show stp:__________
- show stp instance 0/1/2:__________
- show stp port/trunk:__________
- BPDU rx/tx:__________
异常/回退:
[ ] 无异常
[ ] 已回退;回退步骤:__________
结论:该变更是否符合预期?是 / 否
后续动作:__________
5_7_7 【验证】验收矩阵:至少覆盖全局、实例、端口、区域和单通
| 验证命令 | 预期结果/关键字段 | 不符时的排查方向 |
|---|---|---|
show stp |
全局 enable;版本 mstp;name/revision 与规划一致 | 检查全局开关、配置模式、区域配置是否保存 |
show stp instance 0 |
CIST 根桥是核心;本桥优先级符合主备 | 核对 bridgeprio、桥 MAC、上游 BPDU |
show stp instance 1 |
根桥为规划主根;各端口 role/state 符合基线 | 检查映射、优先级、cost、link-type |
show stp instance 2 |
根桥为主根的另一台核心 | 确认互备优先级,避免两台完全相同 |
show stp port <id> |
互联口 STP enable、link-type point-point、角色合理 | 查边缘误配、端口 disable、保护状态 |
show stp trunk <trunkid> |
聚合口参与 STP;成员状态正常 | 查聚合配置、Trunk STP、负载分担 |
show spantree mst-config(体系B) |
Name/Revision/实例映射及 HMD5 与全网一致 | 逐字符核对三要素;先对齐配置再查摘要 |
show spantree interface <口> |
非 NON_STP,有正确 role/state |
接口 STP enable、物理 UP、邻居参与 |
show logging |
edge/bpdu-guard/root-guard 事件符合预期 | 查私接桥、抢根设备、配置漂移 |
debug spantree bpdu-rx/tx |
rx、tx 均按预期增长 | 单向链路、光模块、BPDU 被丢弃 |
| 断开主用上行测试 | 业务在预期时间内切换,阻塞点迁移 | 检查 P/A、Alternate、保护、VRRP 联动 |
| 接入终端上线测试 | 边缘口快速 Forwarding;无 BPDU 触发保护 | 检查 edge-port、bpdu-guard、终端连接 |
5_8 考点速记与自检清单
本节要解决什么问题:最后是考点速记与自检清单。
5_8_1 考点速记
- 协议演进:STP(802.1D)收敛 30~50 秒、单实例、无负载分担;RSTP(802.1w)收敛 1~2 秒、单实例;MSTP(802.1s)收敛 1~2 秒、实例 0-15、可按 VLAN 负载分担。
- MSTP 负载分担原理:把 VLAN 映射到 MSTI;不同实例可阻塞不同链路,实现业务分流。它不是逐流哈希,也不是给每个 VLAN 单独建树。
- 区域三要素:区域名称、修订版本号、VLAN-实例映射;任一项不一致都会造成区域分裂、MSTP 退化为 CST。
- 实例范围:0-15;实例0 是 IST/CIST 兜底;业务使用 1-15。每个 VLAN 只映射到一个实例。
- 根桥选举:桥 ID = 优先级 + MAC,数值越小越优;优先级默认 32768,常见主备步长为 4096。
- 端口角色:Root、Designated、Alternate、Backup;根端口在非根桥上,指定端口负责链路转发,Alternate 是 RP 备份。
- 端口状态:Discarding、Learning、Forwarding;RSTP/MSTP 不再使用 STP 的 5 状态混合模型。
- P/A 握手:Proposal/Agreement 实现逐段快速收敛;前提为点到点、全双工链路,
linktype point-point必须正确。 - 保护特性:BPDU Guard 防私接;Root Guard 防抢根;Loop Guard 防单向故障;Edge Port 用于终端快速上线,必须与 BPDU Guard 配套。
- 时间参数约束:
2×(ForwardDelay-1) ≥ MaxAge ≥ 2×(HelloTime+1);默认 2/15/20 满足约束。改参先验算,稳定网络优先保持默认。 - 路径开销:传统标准与新标准数值差异大;调整 cost 前统一口径、记录原值并核对累积路径。
- 体系B:使用
spantree模式;全局可能默认 disable,端口可能默认 enable;默认区域名为系统 MAC、revision 0。进入配置后必须enable。 - HMD5:由 name + revision + VLAN-实例映射参与计算;同区域摘要应一致。摘要不一致先对齐三要素,而不是手工复制摘要。
- 官方排障四步:全局 enable → 端口 enable → packet-type 一致 → BPDU 收发正常。
- 单向链路判据:
debug spantree bpdu-tx有输出、bpdu-rx无输出,即“只发不收”,优先排查光纤/光模块/中间设备;同时检查 Loop Guard。
浙公网安备 33010602011771号