第17篇:STP 端口状态迁移:从 Disable 到 Forwarding

关键词:STP状态机、Blocking、Listening、Learning、Forwarding、Hello时间、Forward Delay、TCN、拓扑变更


一、引言

在上一篇文章中,我们学习了 STP 的选举算法,知道了端口被选举为根端口、指定端口或非指定端口。但端口从启动到能够转发数据帧,并不是瞬间完成的,而是要经过一系列状态迁移。这个迁移过程是 STP 防止临时环路的关键机制。本文将深入讲解 STP 的端口状态机、定时器机制以及拓扑变更的处理流程。

二、核心概念

2.1 STP 五种端口状态

标准 STP(802.1D)定义了五种端口状态:

状态 数据转发 学习 MAC 收发 BPDU 持续时间
Disable 否 否 否 管理员手动关闭
Blocking 否 否 是(仅接收) Max Age(默认 20 秒)
Listening 否 否 是(收发) Forward Delay(默认 15 秒)
Learning 否 是 是(收发) Forward Delay(默认 15 秒)
Forwarding 是 是 是(收发) 稳定状态

2.2 状态迁移的完整路径

状态迁移的完整路径 - 图示

2.3 STP 三大定时器

定时器 默认值 说明
Hello Time 2 秒 根桥发送 BPDU 的时间间隔
Forward Delay 15 秒 Listening 和 Learning 状态的持续时间
Max Age 20 秒 BPDU 的最大存活时间,超过后认为链路失效

2.4 端口从 Disable 到 Forwarding 的总耗时

端口从 Disable 到 Forwarding 的总耗时 - 图示

总计约 50 秒的收敛时间:Max Age(20 秒)+ Listening(15 秒)+ Learning(15 秒)。这个耗时在现代网络中不可接受,这也是 RSTP(快速生成树)被引入的原因。

三、技术细节

3.1 各状态的详细行为

Disable 状态

端口被管理员手动关闭或检测到物理层故障。

# 手动关闭端口
[HUAWEI] interface GigabitEthernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] shutdown
[HUAWEI-GigabitEthernet0/0/1] quit

# 恢复端口
[HUAWEI-GigabitEthernet0/0/1] undo shutdown
[HUAWEI-GigabitEthernet0/0/1] quit

Blocking 状态

端口刚启动时首先进入 Blocking 状态。在此状态下,端口只接收 BPDU,不发送 BPDU,不转发数据,不学习 MAC 地址。

行为 说明
接收 BPDU 用于了解网络拓扑,判断是否有更好的路径
不发送 BPDU 避免干扰现有拓扑
不转发数据 防止环路
不学习 MAC MAC 地址表不会被更新

注意:Blocking 状态的持续时长由 Max Age 定时器决定(默认 20 秒),不是固定的 30 秒。其作用是等待一段时间以确认当前收到的 BPDU 信息是否仍然有效。

Listening 状态

端口开始参与生成树的计算,发送和接收 BPDU。

行为 说明
收发 BPDU 参与拓扑计算,选举指定端口
不转发数据 仍在防止环路
不学习 MAC 避免基于不完整的拓扑学习 MAC

Learning 状态

端口已经确定了自己在生成树中的角色,开始构建 MAC 地址表。

行为 说明
收发 BPDU 继续参与拓扑维护
不转发数据 仍不转发用户数据
学习 MAC 开始学习源 MAC 地址,填充 MAC 地址表

为什么 Learning 阶段不转发数据? 因为如果直接转发,MAC 地址表为空,所有帧都会被泛洪,可能产生临时环路。

Forwarding 状态

端口完全正常工作,转发数据、学习 MAC、收发 BPDU。

3.2 拓扑变更(Topology Change)机制

当网络拓扑发生变化时(如链路故障或恢复),STP 需要通知所有交换机更新 MAC 地址表。

拓扑变更(Topology Change)机制 - 图示

触发拓扑变更的条件: | 事件 | 说明 | |------|------| | 端口从 Forwarding 变为非 Forwarding | 链路故障或 STP 重新计算 | | 端口从非 Forwarding 变为 Forwarding | 链路恢复或 STP 重新计算 | | 收到 TCN BPDU | 下游交换机通知拓扑变更 |

拓扑变更的处理: 1. 检测到变更的交换机向上游发送 TCN BPDU 2. 根桥收到后,向全网发送带 TC(Topology Change)标志的配置 BPDU 3. 所有交换机将 MAC 地址表的老化时间从 300 秒缩短到 Forward Delay(15 秒) 4. 15 秒后恢复正常老化时间

3.3 为什么需要 50 秒收敛

STP 的 50 秒收敛时间是出于防止临时环路的考虑:

阶段 耗时 为什么需要等待
Blocking → Listening Max Age(20 秒) 等待 BPDU 老化,确认旧拓扑信息已失效
Listening → Learning Forward Delay(15 秒) 等待全网完成拓扑计算,确保所有端口角色确定
Learning → Forwarding Forward Delay(15 秒) 等待 MAC 地址表初步学习完成,避免泛洪

这 50 秒中,端口无法转发数据,对需要高可用性的业务(如 VoIP、视频会议)影响巨大。

四、实战配置/案例分析

4.1 案例一:观察 STP 端口状态迁移

# 在交换机上观察端口 STP 状态的变化
<HUAWEI> display stp brief
  PortName   PortRole  PortSt
  GE0/0/1    Root      Forwarding
  GE0/0/2    Desi      Forwarding
  GE0/0/3    NDP       Discarding

# 手动触发端口重新协商
[HUAWEI] interface GigabitEthernet 0/0/1
[HUAWEI-GigabitEthernet0/0/1] shutdown
[HUAWEI-GigabitEthernet0/0/1] undo shutdown
[HUAWEI-GigabitEthernet0/0/1] quit

# 持续观察状态变化(每 5 秒执行一次)
<HUAWEI> display stp brief
  PortName   PortRole  PortSt
  GE0/0/1    Root      Blocking      ← 刚开始(等待 BPDU 老化)
  # 约 20 秒后(Max Age 超时)
  GE0/0/1    Root      Listening
  # 约 35 秒后(Forward Delay 15 秒)
  GE0/0/1    Root      Learning
  # 约 50 秒后(Forward Delay 15 秒)
  GE0/0/1    Root      Forwarding     ← 正常转发

提示:上表对应"链路故障/恢复"场景(约 50 秒)。若是"根端口失效、备份端口接管"场景,因已有完整的 BPDU 信息,收敛时间约 30 秒(2 × Forward Delay);若根桥本身失效,则需要重新选举,仍约 50 秒。


### 4.2 案例二:STP 定时器调整

```bash
# 查看当前定时器
<HUAWEI> display stp
  Cfg Hello Time: 2s
  Cfg Max Age: 20s
  Cfg Forward Delay: 15s

# 调整定时器(不推荐,容易引发问题)
[HUAWEI] stp hello-time 1
[HUAWEI] stp max-age 10
[HUAWEI] stp forward-delay 10

# 注意:调整定时器有约束
# 2 × (Forward Delay - 1) >= Max Age >= 2 × (Hello Time + 1)
# 否则交换机会自动修正

4.3 案例三:拓扑变更导致 MAC 地址表清空

故障描述:某台接入交换机重启后,全网短暂断网约 15 秒。

# 排查:检查拓扑变更计数
<Core-SW> display stp topology-changes
  Topology Change: Yes
  Topology Change Count: 156       ← 频繁拓扑变更
  Topology Change Time: 00:02:15

# 根因:接入交换机重启导致端口频繁 UP/DOWN
# 每次 UP/DOWN 都触发拓扑变更
# 全网交换机的 MAC 地址表老化时间缩短为 15 秒
# MAC 地址表频繁清空 → 大量泛洪 → 网络延迟

# 解决:接入交换机端口配置边缘端口
[Access-SW] interface GigabitEthernet 0/0/1
[Access-SW-GigabitEthernet0/0/1] stp edged-port enable
[Access-SW-GigabitEthernet0/0/1] quit
# 边缘端口状态变化不触发拓扑变更

4.4 案例四:STP 配置模板

# ========== 标准 STP 配置 ==========
[SW] stp mode stp              # 传统 STP(仅兼容性需求时使用)
[SW] stp enable
[SW] stp priority 4096         # 设为根桥
[SW] stp global-edged-port enable  # 默认所有端口为边缘端口

# ========== 端口级别配置 ==========
[SW] interface GigabitEthernet 0/0/1
[SW-GigabitEthernet0/0/1] stp edged-port enable     # 边缘端口
[SW-GigabitEthernet0/0/1] stp cost 20000            # 端口开销
[SW-GigabitEthernet0/0/1] stp port priority 128     # 端口优先级(缺省 128,取值 0~240、步长 16)
[SW-GigabitEthernet0/0/1] stp link-type point-to-point  # 点对点链路
[SW-GigabitEthernet0/0/1] quit

# ========== 验证 ==========
<SW> display stp brief
<SW> display stp
<SW> display stp port

五、总结

端口状态 转发数据 学习MAC 收发BPDU 持续时间
Disable 否 否 否 管理员控制
Blocking 否 否 仅接收 Max Age(默认 20 秒)
Listening 否 否 收发 Forward Delay(15 秒)
Learning 否 是 收发 Forward Delay(15 秒)
Forwarding 是 是 收发 稳定
定时器 默认值 作用
Hello Time 2 秒 BPDU 发送间隔
Forward Delay 15 秒 Listening/Learning 状态持续时间
Max Age 20 秒 BPDU 最大存活时间
收敛时间 传统 STP 说明
端口从 Blocking 到 Forwarding 约 50 秒 Max Age(20s)+Listening(15s)+Learning(15s)
链路故障检测 约 20~50 秒 Max Age 超时 + 状态迁移
拓扑变更 MAC 老化 15 秒 Forward Delay 期间快速老化
排错命令 用途
display stp brief 查看端口角色和状态
display stp 查看完整 STP 信息
display stp topology-changes 查看拓扑变更统计
display stp port 查看端口详细 STP 参数

思考

  1. 为什么 STP 需要 Listening 和 Learning 两个状态,不能合并为一个状态?
  2. 如果一个端口被配置为边缘端口(edge port),它的状态迁移过程和普通端口有什么不同?
  3. 拓扑变更时,为什么 MAC 地址表老化时间要缩短为 Forward Delay(15 秒),而不是直接清空?

下篇预告:第18篇:RSTP 快速生成树:边缘端口与 P/A 机制