前言
基于可靠性的考虑 局域网中通常会存在冗余链路 网络中也就产生了路径环路的问题 为了避免形成广播风暴 需要生成树来阻塞冗余链路 消除环路 当主链路故障时 又可以将冗余链路自动切换为转发状态。
知识准备
STP
桥协议数据单元
STP采用的协议报文时BPDU,BPDU中包含了足够的信息来完成生成树的计算
- 配置BPDU 用来进行生成树计算和维护生成树拓扑的报文
- TCN BPDU 当拓扑发生变化时,用来通知相关设备网络拓扑结构发生变化的报文
STP协议配置BPDU报文携带以下重要信息
- 根桥ID(root id)由根桥的优先级和mac地址(设备背板MAC)组成 通过比较根桥id stp决定谁是根桥
- 根路径开销(root path cost)到根桥最小的路径开销 如果时根桥,开销为0 非根桥为到达根桥最短路径开销之和
- 指定桥ID(desigenated bridge id)生成或转发BPDU的桥id 由桥id和mac地址(设备背板MAC)组成
- 指定端口ID(desigenated port id)发送BPDU的端口id,由端口优先级和端口索引号组成
各台设备的各个端口在初始时会生成以自己为根桥的配置消息,根路径开销为0。指定桥ID为自身设备ID,指定端口为本端口。各台设备都向外发送本设备的配置消息,同时也会收到其他设备发送的配置消息。通过比较这些配置消息,交换机进行生成树计算,选举根桥,决定端口角色。
- 对于整个stp,唯一的根桥被选举出来
- 对于所有非根桥,选举出根端口和指定端口
BPDU报文分析
-
使用组播地址 01-80-C2-00-00-00
-
根桥选举
- root identifier 发送此配置BPDU交换机所认为的根交换机的交换机标识
- root path cost 发送此配置BPDU交换机到达根交换机的最短路径总开销,含交换机根端口的开销,不含发送此BPDU的端口开销
- bridge identifier 发送此配置BPDU交换机的交换机标识
- port identifier 发送此配置BPDU交换机端口的端口标识
BPDU类型
-
配置BPDU:configuration
- **选举根交换机以及确定每个交换机端口的角色和状态
- **在初始化过程中,每个桥都主动发送配置BPDU
- **在网络拓扑稳定后 只有跟桥主动发送配置BPDU 其他交换机在收到上游传来的配置BPDU后 才会发送自己的配置BPDU
- **发送周期为 hello time 默认2秒 根桥发送BPDU间隔
- **老化时间为 max age 默认20秒 保持阻塞的最大时间(没有收到BPDU)
- **转发时间 forward delay 15秒 监听和学习的持续时间
- message age 配置BPDU每经过一个交换机,Message Age就会加1。如果Message Age 大于Max age,非跟桥就会丢弃该配置BPDU [原因:避免设备太多 stp性能太差]
-
拓扑变更通告BPDU-TCN BPDU
- 下游交换机感知到拓扑发生变化时想上游发送拓扑变化通知
确定端口角色
非根桥交换机在选举指定端口时,分别依据根路径开销、BID、PID
- 根桥上的所有端口为指定端口
- 每个非根桥选择根路径开销最小的那个端口为根端口,该端口到根桥的路径是此网桥到根桥的最佳路径
- 每个物理段选出根路径开销最小的那个网桥作为指定桥,该指定桥到该物理段的端口为指定端口,负责物理段的数据转发
- 既不是指定端口也不是根端口的端口置于阻塞状态,不转发普通以太网数据帧
根路径开销 [到达根桥的总开销 根桥开销为0]
根路径开销确定端口角色

桥ID作用 [本身的优先级+背板mac]
桥ID确定端口角色 上游指定桥ID最小的选举为指定桥,端口为指定端口

端口ID作用 [用于选举非根桥端口角色(是否阻塞) 先看开销 然后上游设备桥id 然后端口id]
如果非根桥多个端口经过相同的上游到达桥根,且路径开销相同,则协议比较端口所连上游桥ID,所连指定端口ID最小的选举为根端口

端口状态
-
Disable 失效状态 不接收和发送任何报文 导致原因可能是端口物理状态为down或adm
-
Blocking 处于这个状态的端口不能参与或转发数据报文,但是可以接收BPDU配置消息 不过不能发送配置消息,也不能进行地址学习
-
listening 处于这个状态的端口不能参与数据转发,可以BPDU配置消息的接收 不学习mac
-
learning 处于这个状态的端口不能参与数据转发,但是开始地址学习和BPDU配置消息的接收与发送与处理 学习mac
-
forwarding 可以转发数据 地址学习 BPDU处理、发送与接收
-
在选举跟桥时候 所有接口都为阻塞状态discarding
-
然后进入listening状态,listening进入learning需要15s,learning进入forwarding需要15s[转发延迟forward delay]
STP故障
-
根桥故障 [根桥没有了 重新选举根桥]
- 非根桥会在BPDU老化之后开始根桥的重新选举(20s)
- 然后进行30s后链路收敛稳定
-
直连链路故障 [设备根端口没有,原阻塞端口变为根端口]
- 检测到直连链路物理故障后,会将预备端口转换为根端口
- 预备端口会在30s后恢复到转发状态 [原阻塞端口变为指定端口]
-
非直连链路故障 [设备根端口没有, 指定端口对端为阻塞端口]
- 预备端口50s后恢复转发状态 SWB会认为自己是根桥 SWC不认为SWB为根桥 会保持阻塞状态 直至20s老化后 30s后变为指定端口
- 拓扑改变导致MAC地址表错误[TCN的应用]
- mac地址表项的默认老化时间是300秒。在这段时间内,交换机无法将数据从其他端口转发
- 为了拓扑变化与mac表项保持一致 在下游交换机拓扑发生变化时 向上游报送BPDU-TCN报文 上游发送TCA确认 直至根桥 根桥向下游发送TC[TC的通知所有下游交换机把MAC地址表记录老化时间从300秒改为15秒]
RSTP
RSTP减少了端口从阻塞到转发的时延,尽可能快的恢复网络连通性
端口状态[由原来的五个缩减到三个]
- discarding 不转发用户流量,不学习mac地址 [disable blocking listening]
- learing 不转发用户流量,学习mac地址
- forwarding 转发用户流量,学习mac地址
MSTP
MSTP可以在网络中定义多个生成树实例 每个实例对应多个VLAN 每个实例可维护自己独立的生成树,可以使不同的VLAN具有完全不同的生成树拓扑,不同的VLAN在相同的端口可以具有不同的状态
生成树基本配置
- 使能或关闭生成树
[Switch] stp enable
[Switch] stp disable
2. STP工作模式
[Switch] stp mode {stp|rstp|mstp} // 默认mstp
3. 指定网桥优先级
[Switch] stp [instance <instance-id>] priority <priority> // 缺省32768
4. RSTP指定某端口为边缘端口
[Switch-g1/0/1] stp edged-port enable
5. 配置与维护
[Switch] display stp
[Switch] display stp brief // stp简略信息
[Switch] display stp root // 查看stp根桥 (MST-ID ROOT-BID 开销 根桥端口等信息)
MSTP配置举例

SWA配置
[SWA]vlan 10
[SWA-vlan10]qu
[SWA]vlan 20
[SWA-vlan20]qu
[SWA]interface GigabitEthernet1/0/1
[SWA-GigabitEthernet1/0/1]port link-type trunk
[SWA-GigabitEthernet1/0/1]port trunk permit vlan 10 20
[SWA-GigabitEthernet1/0/1]undo port trunk permit vlan 1
[SWA-GigabitEthernet1/0/1]qu
[SWA]interface GigabitEthernet1/0/2
[SWA-GigabitEthernet1/0/2]port link-type trunk
[SWA-GigabitEthernet1/0/2]port trunk permit vlan 10 20
[SWA-GigabitEthernet1/0/2]undo port trunk permit vlan 1
[SWA-GigabitEthernet1/0/2]qu
[SWA]interface Vlan-interface 10
[SWA-Vlan-interface10]ip address 192.168.1.1 24
[SWA-Vlan-interface10]qu
[SWA]interface Vlan-interface 20
[SWA-Vlan-interface20]ip address 192.168.2.1 24
[SWA-Vlan-interface20]qu
[SWA]stp mode mstp // 修改stp模式 默认MSTP
[SWA]stp region-configuration
[SWA-mst-region]region-name H3C // 配置区域名称[可选]
[SWA-mst-region]revision-level 1 // 修订版本 [可选]
[SWA-mst-region]instance 10 vlan 10 // 配置VLAN 10对应MSTI10
[SWA-mst-region]instance 20 vlan 20 // 配置VLAN 20对应MSTI20
[SWA-mst-region]active region-configuration // 激活配置消息
[SWA-mst-region]qu
[SWA]
[SWA]stp instance 10 root primary // 配置SWA为实例10首选根桥
[SWA]stp instance 20 root primary // 配置SWA为实例20首选根桥
SWB配置
[SWB]vlan 10
[SWB-vlan10]port GigabitEthernet 1/0/3
[SWB-vlan10]qu
[SWB]interface GigabitEthernet1/0/1
[SWB-GigabitEthernet1/0/1]port link-type trunk
[SWB-GigabitEthernet1/0/1]port trunk permit vlan 10 20
[SWB-GigabitEthernet1/0/1]undo port trunk permit vlan 1
[SWB-GigabitEthernet1/0/1]qu
[SWB]interface GigabitEthernet1/0/2
[SWB-GigabitEthernet1/0/2]port link-type trunk
[SWB-GigabitEthernet1/0/2]port trunk permit vlan 10 20
[SWB-GigabitEthernet1/0/2]undo port trunk permit vlan 1
[SWB-GigabitEthernet1/0/2]qu
[SWB]stp mode mstp // 修改stp模式 默认MSTP
[SWB]stp region-configuration
[SWB-mst-region]region-name H3C // 配置区域名称[可选]
[SWB-mst-region]revision-level 1 // 修订版本 [可选]
[SWB-mst-region]instance 10 vlan 10 // 配置VLAN 10对应MSTI10
[SWB-mst-region]instance 20 vlan 20 // 配置VLAN 20对应MSTI20
[SWB-mst-region]active region-configuration // 激活配置消息
[SWB-mst-region]qu
[SWB]
SWC配置
[SWC]vlan 20
[SWC-vlan20]port GigabitEthernet 1/0/3
[SWC-vlan20]qu
[SWC]interface GigabitEthernet1/0/1
[SWC-GigabitEthernet1/0/1]port link-type trunk
[SWC-GigabitEthernet1/0/1]port trunk permit vlan 10 20
[SWC-GigabitEthernet1/0/1]undo port trunk permit vlan 1
[SWC-GigabitEthernet1/0/1]qu
[SWC]interface GigabitEthernet1/0/2
[SWC-GigabitEthernet1/0/2]port link-type trunk
[SWC-GigabitEthernet1/0/2]port trunk permit vlan 10 20
[SWC-GigabitEthernet1/0/2]undo port trunk permit vlan 1
[SWC-GigabitEthernet1/0/2]qu
[SWC]stp mode mstp // 修改stp模式 默认MSTP
[SWC]stp region-configuration
[SWC-mst-region]region-name H3C // 配置区域名称[可选]
[SWC-mst-region]revision-level 1 // 修订版本 [可选]
[SWC-mst-region]instance 10 vlan 10 // 配置VLAN 10对应MSTI10
[SWC-mst-region]instance 20 vlan 20 // 配置VLAN 20对应MSTI20
[SWC-mst-region]active region-configuration // 激活配置消息
[SWC-mst-region]qu
[SWC]
显示与维护
[SWA]display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 DESI(指定端口) FORWARDING(转发) NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
10 GigabitEthernet1/0/1 DESI FORWARDING NONE
10 GigabitEthernet1/0/2 DESI FORWARDING NONE
20 GigabitEthernet1/0/1 DESI FORWARDING NONE
20 GigabitEthernet1/0/2 DESI FORWARDING NONE
[SWA]
[SWB]display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT FORWARDING NONE
0 GigabitEthernet1/0/2 DESI FORWARDING NONE
0 GigabitEthernet1/0/3 DESI FORWARDING NONE
10 GigabitEthernet1/0/1 MAST FORWARDING NONE
10 GigabitEthernet1/0/3 DESI FORWARDING NONE
[SWB]
[SWC]display stp brief
MST ID Port Role STP State Protection
0 GigabitEthernet1/0/1 ROOT(根端口) FORWARDING NONE
0 GigabitEthernet1/0/2 ALTE DISCARDING(阻塞) NONE
0 GigabitEthernet1/0/3 DESI FORWARDING NONE
20 GigabitEthernet1/0/1 MAST FORWARDING NONE
20 GigabitEthernet1/0/3 DESI FORWARDING NONE
[SWC]
<PCA>ping -a 192.168.1.2 192.168.1.1
Ping 192.168.1.1 (192.168.1.1) from 192.168.1.2: 56 data bytes, press CTRL_C to break
56 bytes from 192.168.1.1: icmp_seq=0 ttl=255 time=1.064 ms
56 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=0.964 ms
56 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=0.765 ms
56 bytes from 192.168.1.1: icmp_seq=3 ttl=255 time=0.649 ms
56 bytes from 192.168.1.1: icmp_seq=4 ttl=255 time=0.960 ms
--- Ping statistics for 192.168.1.1 ---
5 packet(s) transmitted, 5 packet(s) received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.649/0.880/1.064/0.151 ms
<H3C>%Apr 28 15:37:06:134 2024 H3C PING/6/PING_STATISTICS: Ping statistics for 192.168.1.1: 5 packet(s) transmitted, 5 packet(s) received, 0.0% packet loss, round-trip min/avg/max/std-dev = 0.649/0.880/1.064/0.151 ms.
