STP生成树协议

3149 字
16 分钟
STP生成树协议

STP生成树协议#

[TOC]


初认知#

根桥的选举(树根)#

BID#

BIDBridge ID网桥标识符 )的缩写,它是 STP(生成树协议)选举 根桥 时的核心依据

你可以把它理解为“交换机在 STP 世界里的身份证”

BID 由两部分组成:

BID = 桥优先级(Bridge Priority) + MAC 地址

  • 桥优先级:16 位(2 字节),默认值是 32768

  • MAC 地址:48 位(6 字节),是交换机的背板 MAC(不是某个接口的 MAC)

✅ 总长度:64 位(8 字节)

例如:

  • 交换机 MAC 是 00e0-fc12-3456

    我们通常用两个 - 来区分

  • 默认优先级是 32768

    范围0-65535 ,步长是 4096

  • 那么它的 BID 就是:32768.00e0-fc12-3456


🔍 BID 用来干什么???

STP(生成树) 通过比较所有交换机的 BID,选出最小的那个作为“根桥”(Root Bridge)

🏆 根桥 选举规则:(树根)

  1. 比较 Bridge Priority(优先级) 数值越小越优

  2. 如果优先级相同 → 比较 MAC 地址

    MAC 地址越小越优

根端口(R)的选举#

🍔距离 树根 最近的端口,除 根桥 外,每个交换机都要有一个 根端口 ,有且只有一个

  • 相同 则比较下一个,若不同则直接得出结论

①比较根路径开销#

(从根桥到交换机)

image-20260126083642424
image-20260126083642424

  1. 根路径开销低的为根端口

  2. 根桥 出发到 交换机的端口 进去才是端口的 根路径开销

这里 LSW4 为根桥

LSW1的GE0/0/4的 根路径开销 是2万

LSW1的GE0/0/1的 根路径开销 是4万

路径开销#

image-20260126084122438
image-20260126084122438

上图这样的端口的 路径开销 设置特别容易弄混

所以建议两端的端口的路径开销一致

②比较上行设备BID#

image-20260126084635625
image-20260126084635625

  • BID = 优先级 + MAC地址

    (优先级默认等于32768 ,范围0-65535 ,步长是4096)

比如LSW8是根网桥(树根)

  • 则LSW6到根网桥的根路径开销(①)相同,我们就要比较②了

  • 上行设备BID

    其实就是与端口连接的设备,比较他们的BID

③比较上行设备PID#

  • PID = 端口优先级 + 端口标识

    端口优先级 默认等于 128 ,端口优先级的范围0-240,步长为 16

  • 端口标识 是e0/0/1之类的号码(e0/0/1比e0/0/2的端口标识小)

  1. 先比较 端口优先级 ,低的入选

  2. 若端口优先级相同再比较 端口标识 ,低的入选

image-20260126090724628
image-20260126090724628

LSW10是根网桥,那么 E0/0/1E0/0/2 哪个是根端口呢??

  1. 很显然,①路径开销和②对应端口的上行设备的BID都相同

  2. 则需要比较 与之对应端口 (上行设备)的PID(端口ID)

    一般端口的优先级是相同的,只要比较端口标识就行了

    看的是 LSW10 端口的PID

则在 LSW9 中 E0/0/1 为根端口

④比较自己的PID#

image-20260126091746153
image-20260126091746153

这个的①②③都是一样的,所以只有比较自己端口的PID

指定端口(D)的选举#

  • ❤️每个 主干链路 上一定要选举一个 指定端口 ,且只有一个

    根端口(R)不参与选举 根桥 上的端口全为 指定端口

image-20260126091954517
image-20260126091954517

若第一个相同则比较下一个,若不同则直接得出结论

  • ①比较根路径开销(从各自当前交换机的 根端口(R)根桥 )低的获选

    把一条链路劈开,两个端口,自然是从这两个端口上选,比较根路径开销

  • ②比较各自本交换机的BID

    如果根路径开销相同的时候,则比较各自端口所在的交换机的BID

  • ③比较各自的本端口的PID

    当①②都相同的时候,就比较自己端口的PID

阻塞端口(A)#

根端口指定端口 选出来后,剩下的就是 阻塞端口

  • 既不是 根端口 也不是 指定端口 的端口

基础命令#

Terminal window
<Huawei>
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sys SW1
1.生成树的类型
[SW1]stp mode ?
mstp Multiple Spanning Tree Protocol (MSTP) mode
rstp Rapid Spanning Tree Protocol (RSTP) mode
stp Spanning Tree Protocol (STP) mode
# 生成树的类型,我们后面的实验都是以stp为准
# 所以我们需要手动修改为stp
[SW1]stp mode stp
Info: This operation may take a few seconds. Please wait for a moment...done.
'一定要强制修改为STP模式'
2.手动指定根桥优先级
[SW1]stp root ?
primary Primary root switch #primary是主根桥
secondary Secondary root switch #secondary是副根桥
'也可以直接修改优先级为多少 stp priority 4096'
stp root primary 根网桥(前面两个字节优先级就为0)
stp root secondary 副网桥 (前面两个字节优先级就为4096)
3.显示stp的整体运行状态
[SW1]dis stp
-------[CIST Global Info][Mode STP]-------
CIST Bridge :32768.4c1f-cc29-1345
'这个就是根桥的BID'
Config Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
Active Times :Hello 2s MaxAge 20s FwDly 15s MaxHop 20
...............
4.查看端口的角色
[LSW4]dis stp bri
MSTID Port Role STP State Protection
0 Ethernet0/0/1 ALTE DISCARDING NONE
'ALTE备份端口'
0 Ethernet0/0/3 ALTE DISCARDING NONE
0 Ethernet0/0/9 DESI FORWARDING NONE
'DESI指定端口'
0 G...rnet0/0/1 ALTE DISCARDING NONE
0 G...rnet0/0/2 ROOT FORWARDING NONE
'ROOT根端口'

image-20260126103025827
image-20260126103025827

  • 相同的实验,不同的根桥 ,不同的端口

综合实验#

image-20260126113402644
image-20260126113402644

关闭生成树协议,体验mac地址表的震荡!

Terminal window
<Huawei>sys
Enter system view, return user view with Ctrl+Z.
[Huawei]sys SW1
[SW1]stp disable
Warning: The global STP state will be changed. Continue? [Y/N]Y
# 输入Y确定!
Info: This operation may take a few seconds. Please wait for a moment...done.
'SW2,和SW3类似,三台设备都要进行关闭生成树协议'
# 别忘记配PC机的IP地址和子网掩码
# 接着测试PC1和PC2的连通性!
PC>ping 10.0.0.2
Ping 10.0.0.2: 32 data bytes, Press Ctrl_C to break
Request timeout!
......
Request timeout!
'自然是ping不通的,请求超时'
# 我们来进行抓包看一下

image-20260126114154441
image-20260126114154441

现象:广播风暴,一直再问mac地址

Terminal window
# 我们也来看一下,SW3的mac地址表( dis mac-address )
5489-985c-6841 #他就是PC1的mac地址
5489-98b7-1fed #他是PC2的mac地址
[SW3]dis mac-address
MAC address table of slot 0:
---------------------
5489-985c-6841 1 - - GE0/0/1 dynamic 0/-
5489-98b7-1fed 1 - - GE0/0/2 dynamic 0/-
---------------------
Total matching items on slot 0 displayed = 2
'再来简单查看几次,一直在震荡!!!'
'主要变的是接口地址,一直在变化'
---------------------
5489-985c-6841 1 - - GE0/0/2 dynamic 0/-
5489-98b7-1fed 1 - - GE0/0/4 dynamic 0/-
---------------------
5489-985c-6841 1 - - GE0/0/2 dynamic 0/-
5489-98b7-1fed 1 - - GE0/0/2 dynamic 0/-
---------------------
5489-985c-6841 1 - - GE0/0/1 dynamic 0/-
5489-98b7-1fed 1 - - GE0/0/4 dynamic 0/-
---------------------
'当我们开始stp功能后,一切就都恢复正常了'
[SW1]stp enable
Warning: The global STP state will be changed. Continue? [Y/N]Y
# Y确认
Info: This operation may take a few seconds. Please wait for a moment...done.

image-20260126095246243
image-20260126095246243

  • SW1

image-20260126095309196
image-20260126095309196

  • SW2

image-20260126095317424
image-20260126095317424

  • SW3

image-20260126095336395
image-20260126095336395

  • SW4

image-20260126095347905
image-20260126095347905

STP的缺点#

STP 为什么慢,因为依靠计时器完成计算!

STP 的3种的计时器#

  1. hello时间:端口发送的BPDU报文的时间间隔:默认是 2秒

    1. 转发延迟(forward delay):

      1. 侦听—学习:15秒

      2. 学习—转发:15秒

      3. 阻塞(接收,但不转发,等待(根网桥)发的BPDU)

        阻塞端口发现等不到根的BPDU(老化时间20秒),就从阻塞—>监听—>学习—>转发(30秒)

  2. 最大老化时间(Max Age)(这个时间可以自己设置)

    一个端口最大的“没有接收BPDU”的时间间隔:20秒

  3. STP的最大收敛时间:30秒~50秒

    根交换机故障:STP的收敛时间约50秒 链路故障:STP的收敛时间约30~50秒

STP收敛速度慢:30秒~50秒,导致网络中断时间过长

故障案例#

直接故障#

image-20260126142410775
image-20260126142410775

  1. 存在AP端口(阻塞端口)的非根交换机出现RP的直连链路故障时

(图中SW3的RP所在链路故障)在经历阻塞—>监听—>学习—>转发(30秒),AP 成为新的 RP,故障恢复

❤️RP链路直接故障,不需要等待20秒的老化时间

SW3的 RP 失效,但 AP 收到的一直都是最优的,AP也不用经历老化时间,被选举为新的RP

  1. 不存在AP端口的非根交换机出现RP的直连链路故障时

    (图中SW2的RP所在链路故障)

  • 该交换机(SW2),连续 20 秒(Max Age) 没有收到更优的 BPDU

    同时 SW3 的 AP端口 也收不到最优BPDU,它也要等待20s的最大老化时间

  • SW2以为根网桥挂了,认为自己可以当老大了,会发送以自己为根的BPDU

    同时 SW3 等了20s后,仍未收到根交换机的BPDU,AP端口在经历阻塞—>监听—>学习—>转发(30秒)

    此时 SW3 的 AP(阻塞端口) 变为 DP(指定端口) 同时处理 SW2 自以为是的BPDU

    并转发通过其他路径(SW3的RP端口)传来更优BPDU给SW2

    SW2 收到更优 BPDU 后,会撤销自己“当老大”的想法,重新选举,恢复正确拓扑

这种故障类型恢复需要50s

根交换机故障#

image-20260126150521614
image-20260126150521614

  1. 当根桥发生故障时,SWB 和 SWC 都会经历一个20s的老化时间,在此之后仍然没有收到最优的BPDU,则它们会认为根交换机失效,此时会发送以自己为 根交换机 的BPDU

  2. 当两台交换机开始交互彼此的BPDU报文时,不管选举的结果如何,一定是一个为 RP,一个为 DP

    都要经历从listening----->learning----->fowarding的状态,经历30s的时间

故这种故障类型恢复需要也需要50s

间接故障#

image-20260126151135394
image-20260126151135394

存在 AP端口 的交换机出现RP的间接故障后

RP的BPDU老化需要20秒,AP成为新的RP需要30秒,50s故障恢复

❤️如果是RP直接故障,不需要等待20秒的老化时间​

不存在AP端口的交换机出现RP的间接故障,这个也同理,需要50s故障恢复

解决方案:RSTP#

快速生成树

STP端口状态#

  1. Disabled(端口没有启用)(就是用shoutdown关闭了) 此状态下端口不转发数据帧,不学习MAC地址表,不参与生成树计算

  2. Blocking(阻塞状态) 此状态下端口不转发数据帧,不学习MAC地址表,此状态下端口 只接收并处理BPDU

    处理的是原根桥的BPDU,如果是邻居的BPDU需要老化时间,但是不转发BPDU

  3. Listening(侦听状态) 此状态下端口不转发数据帧,不学习MAC地址表, 只参与生成树计算,接收并发送BPDU

  4. Learning(学习状态) 此状态下端口 不转发数据帧 ,但是学习MAC地址表,参与计算生成树,接收并发送BPDU

  5. Forwarding(转发状态) 此状态下端口正常转发数据帧,学习MAC地址表,参与计算生成树,接收并发送BPDU

RSTP端口状态#

接下来就是 RSTP 的端口状态: 端口状态的重新划分

  • 如果不转发用户流量也不学习MAC地址,那么端口状态就是 Discarding 状态
  • 如果不转发用户流量但是学习MAC地址,那么端口状态就是 Learning 状态
  • 如果既转发用户流量又学习MAC地址,那么端口状态就是 Forwarding 状态

对比表#

STP端口状态RSTP端口状态端口在拓扑中的角色
DisabledDiscarding包括Disable
BlockingDiscarding包括Alternate端口、Backup端口
ListeningDiscarding包括根端口、指定端口
LearningLearning包括根端口、指定端口
ForwardingForwarding包括根端口、指定端口
功能STPRSTP
端口状态数量5 种3 种(更简洁)
收敛速度慢(30~50 秒)快(通常 < 1 秒)
端口角色无明确角色区分明确区分(根/指定/Alternate/Backup)
链路类型感知是(点到点 / 共享)

端口角色#

image-20260126154134400
image-20260126154134400

以前(STP),RP,DP都是由 AP 来备份的

而现(RSTP)在就不用了;AP备份RP,BP备份DP

根端口/指定端口快速切换

      【Alternate-替代】端口---->根端口R故障,直接启用替代端口

      【Backup-备份】端口---->指定端口D,直接启用备份端口

边缘端口#

image-20260126154252321
image-20260126154252321

有些特殊情况,我们已经知道这个端口不能连其他交换机了,就把他的BPDU功能给关了,而他又偏偏出现了BPDU​;🙉可能出现了安全隐患

边缘端口【Edge Port】

  1. 不再与交换设备连接,只与终端设备直连,这种接口设置为 边缘端口

  2. 边缘端口不参与RSTP计算,由Discarding直接进入Forwarding状态

  3. 注(如果没有开启保护):边缘端口接入交换设备收到配置BPDU,丧失边缘端口属性,成为普通STP端口,重新计算生成树,导致网络震荡

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

STP生成树协议
https://www.kpyun.fun/posts/network/network04/
作者
久棹
发布于
2026-01-30
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录