目录
一、背景介绍
二、环路引发的危害
1、广播风暴
2、MAC 地址表震荡
三、STP生成树
1、STP的作用
2、STP工作过程
3、根桥选举
4、根端口选举
5、指定端口选举
6、BPDU报文分析
7、计时器
8、端口状态转化
总结
一、背景介绍
为了提高网络可靠性,交换网络中通常会使用冗余链路。
然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及MAC 地址表不稳定等问题,进而会影响到用户的通信质量。生成树协议STP(Spanning Tree Protocol)可以在提高可靠性的同时又能避免环路带来的各种问题。

二、环路引发的危害
- 交换机之间通过多条链路互连时,虽然能够提升网络可靠性,但同时也会带来环路问题。
- 随着局域网规模的不断扩大,越来越多的交换机被用来实现主机之间的互连。如果交换机之间仅使用一条链路互连,则可能会出现单点故障,导致业务中断。为了解决此类问题,交换机在互连时一般都会使用冗余链路来实现备份。
- 冗余链路虽然增强了网络的可靠性,但是也会产生环路,而环路会带来一系列的问题,继而导致通信质量下降和通信业务中断等问题。
1、广播风暴
根据交换机的转发原则,如果交换机从一个端口上接收到的是一个广播帧,或者是一个未知目的MAC 地址的单播帧,则会泛洪。如果交换网络中有环路,则这个帧会被无限转发,此时便会形成广播风暴,网络中也会充斥着重复的数据帧。
- 环路会引起广播风暴。
- 网络中的主机会收到重复数据帧
如下图所示案例:
主机A 向外发送了一个单播帧,假设此单播帧的目的MAC 地址在网络中所有交换机的MAC 地址表中都暂时不存在。SWB 接收到此帧后,将其转发到SWA 和SWC,SWA 和SWC 也会将此帧转发到除了接收此帧的其他所有端口,结果此帧又会被再次转发给SWB,这种循环会一直持续,于是便 产生了广播风暴。
交换机性能会因此急速下降,并会导致业务中断。

2、MAC 地址表震荡
MAC地址表是交换机根据所接收到的数据帧的源地址和接收端口生成MAC 地址表项的。
环路会引起MAC 地址表震荡。
如下图案例所示:
主机A 向外发送一个单播帧,假设此单播帧的目的MAC 地址在网络中所有交换机的MAC 地址表中都暂时不存在。SWB 收到此数据帧之后,在MAC地址表中生成一个MAC 地址表项,00-05-06-07-08-AA 对应端口为G0/0/3,并将其从G0/0/1 和G0/0/2 端口转发。此例仅以SWB 从G0/0/1 端口转发此帧为例进行说明。
- SWA 接收到此帧后,由于MAC 地址表中没有对应此帧目的MAC 地址的表项,所以SWA 会将此帧从G0/0/2 转发出去。
- SWC 接收到此帧后,由于MAC 地址表中也没有对应此帧目的MAC 地址的表项,所以SWC 会将此帧从G0/0/2 端口发送回SWB,也会发给主机B。
- SWB 从G0/0/2 接口接收到此数据帧之后,会在MAC 地址表中删除原有的相关表项,生成一个新的表项,00-05-06-07-08-AA 对应端口为G0/0/2。
此过程会不断重复,从而导致MAC 地址表震荡。

三、STP生成树
1、STP的作用
- 在以太网中,二层网络的环路会带来广播风暴,MAC 地址表震荡,重复数据帧等问题,为解决交换网络中的环路问题,提出了STP。
- STP(Spanning Tree Protocol)是生成树协议的英文缩写。
- STP 协议是用于网络树型拓扑结构的建立,起到防止网络中的冗余链路形成环路。
- STP 通过阻塞端口来消除环路,并能够实现链路备份的目的。
STP的作用 | 说明 |
消除环路 | 通过阻断冗余链路来消除网络中可能存在的环路。 |
链路备份 | 当活动路径发生故障时,激活备份链路,及时恢复网络连通性。 |
如下图所示:
2、STP工作过程
STP 通过构造一棵树来消除交换网络中的环路。
每个STP 网络中,都会存在一个根桥,也就是根交换机,其他交换机为非根桥。根桥或者根交换机位于整个逻辑树的根部,是STP 网络的逻辑中心,非根桥是根桥的下游设备。当现有根桥产生故障时, 非根桥之间会交互信息并重新选举根桥,交互的这种信息被称为BPDU 。BPDU 中包含交换机在参加生成树计算时的各种参数信息。如下图所示:

工作过程:
- 选举一个根桥(Root Bridge)
- 每个非根交换机选举一个根端口(Root Port)
- 每个网段(链路)选举一个指定端口(Designated Port)
- 阻塞非根、非指定端口
端口角色 | 说明 |
根端口 (Root Port) | 根端口是非根交换机去往根桥路径最优的端口。 在一个运行STP 协议的交换机上最多只有一个根端口。 根桥上没有根端口。 |
指定端口 (Designated Port) | 指定端口是交换机向所连网段转发配置BPDU 的端口, 每条链路有且只能有一个指定端口。 一般情况下,根桥的每个端口总是指定端口。 |
预备端口 (Alternate Port) | 如果一个端口既不是指定端口也不是根端口,则此端口为预备端口。 预备端口将被阻塞。 |
3、根桥选举
STP 中根桥的选举依据的是桥ID,STP 中的每个交换机都会有一个桥ID(Bridge ID)。桥ID 由16 个比特位的桥优先级(Bridge Priority)和48位的MAC 地址构成。
在STP 网络中,桥优先级是可以配置的,取值范围是0~65535,默认值为32768。优先级最高的设备会被选举为根桥,数值越小越优先。如果优先级相同,则会比较MAC 地址,MAC 地址越小则越优先。
交换机启动后就自动开始进行生成树收敛计算。默认情况下,所有交换机启动时都认为自己是根桥,自己的所有端口都为指定端口,这样BPDU 报文就可以通过所有端口转发。对端交换机收到BPDU 报文后,会比较BPDU 中的根桥ID 和自己的桥ID。如果收到的BPDU 报文中的桥ID 优先级低,接收交换机会继续通告自己的配置BPDU 报文给邻居交换机。如果收到的BPDU 报文中的桥ID 优先级高,则交换机会修改自己的BPDU 报文的根桥ID 字段,宣告新的根桥。
如下图所示,4096的桥优先级数值最小,因此根桥是它:

4、根端口选举
非根交换机在选举根端口时分别依据该端口的根路径开销、对端BID(Bridge ID)、对端PID(Port ID)和本端PID。

- 默认情况下端口的开销和端口的带宽有关,带宽越高,开销越小。从一个非根桥到达根桥的路径可能有多条,每一条路径都有一个总的开销值,此开销值是该路径上所有接收BPDU 端口的端口开销总和(即BPDU 的入方向端口),称为路径开销。非根桥通过对比多条路径的路径开销,选出到达根桥的最短路径,这条最短路径的路径开销被称为RPC(Root Path Cost,根路径开销),并生成无环树状网络。根桥的根路径开销是0。
- 每个非根桥都要选举一个根端口。根端口是距离根桥最近的端口,这个最近的衡量标准是靠路径开销来判定的,即路径开销最小的端口就是根端口。
- 端口收到一个BPDU 报文后,抽取该BPDU 报文中根路径开销字段的值,加上该端口本身的端口开销即为本端口路径开销。如果有两个或两个以上的端口计算得到的累计路径开销相同,那么选择收到发送者BID 最小的那个端口作为根端口。
- 如果两个或两个以上的端口连接到同一台交换机上,则选择发送者PID 最小的那个端口作为根端口。如果两个或两个以上的端口通过Hub 连接到同一台交换机的同一个接口上,则选择本交换机的这些端口中的PID 最小的作为根端口。
一般情况下,企业网络中会存在多厂商的交换设备,华为系列交换机支持多种STP 的路径开销计算标准,提供最大程度的兼容性。缺省情况下,华为系列交换机使用IEEE 802.1t 标准来计算路径开销。
5、指定端口选举
非根交换机在选举指定端口时分别依据根路径开销、BID、PID。未被选举为根端口或指定端口的端口为预备端口,将会被阻塞。
在链路上抑制其他端口(无论是自己的还是其他设备的)发送BPDU 报文的端口,就是该链路的指定端口。每个链路都应该有一个指定端口,根桥的所有端口都是指定端口(除非根桥在物理上存在环路)。
指定端口的选举也是首先比较累计路径开销,累计路径开销最小的端口就是指定端口。如果累计路径开销相同,则比较端口所在交换机的桥ID,所在桥ID 最小的端口被选举为指定端口。如果通过累计路径开销和所在桥ID 选举不出来,则比较端口ID,端口ID 最小的被选举为指定端口。
网络收敛后,只有指定端口和根端口可以转发数据。其他端口为预备端口,被阻塞,不能转发数据,只能够从所连网段的指定交换机接收到BPDU报文,并以此来监视链路的状态。

6、BPDU报文分析
BPDU 包含桥ID、路径开销、端口ID、计时器等参数。
为了计算生成树,交换机之间需要交换相关的信息和参数,这些信息和参数被封装在BPDU(Bridge Protocol Data Unit)中。
BPDU有两种类型:配置BPDU 和TCN BPDU:
- 配置BPDU 包含了桥ID、路径开销和端口ID 等参数。STP 协议通过在交换机之间传递配置BPDU 来选举根交换机,以及确定每个交换机端口的角色和状态。在初始化过程中,每个桥都主动发送配置BPDU。在网络拓扑稳定以后,只有根桥主动发送配置BPDU,其他交换机在收到上游传来的配置BPDU 后,才会发送自己的配置BPDU。
- TCN BPDU 是指下游交换机感知到拓扑发生变化时向上游发送的拓扑变化通知。
配置BPDU 中包含了足够的信息来保证设备完成生成树计算,其中包含的重要信息如下:
重要字段 | 说明 |
根桥ID (BID) | 由根桥的优先级和MAC 地址组成,每个STP 网络中有且仅有一个根桥。 |
根路径开销 (RPC) | 到根桥的最短路径开销。 |
指定桥ID (ROOT ID) | 由指定桥的优先级和MAC 地址组成。 |
指定端口ID (PID) | 由指定端口的优先级和端口号组成。 |
Message Age | 配置BPDU 在网络中传播的生存期。 |
Hello Time | 配置BPDU 发送的周期。 |
Forward Delay | 端口状态迁移的延时。 |
7、计时器
配置BPDU 报文每经过一个交换机,Message Age 都加1。如果Message Age 大于Max Age,非根桥会丢弃该配置BPDU。
STP 协议中包含一些重要的时间参数,这里举例说明如下:
- Hello Time 是指运行STP 协议的设备发送配置BPDU 的时间间隔,用于检测链路是否存在故障。交换机每隔Hello Time 时间会向周围的交换机发送配置BPDU 报文,以确认链路是否存在故障。当网络拓扑稳定后,该值只有在根桥上修改才有效。
- Message Age 是从根桥发送到当前交换机接收到BPDU 的总时间,包括传输延时等。如果配置BPDU 是根桥发出的,则Message Age 为0。实际实现中,配置BPDU 报文每经过一个交换机,Message Age 增加1。
- Max Age 是指BPDU 报文的老化时间,可在根桥上通过命令人为改动这个值。Max Age 通过配置BPDU 报文的传递,可以保证Max Age 在整网中一致。非根桥设备收到配置BPDU 报文后,会将报文中的Message Age 和Max Age 进行比较:如果Message Age 小于等于Max Age,则该非根桥
- 设备会继续转发配置BPDU 报文。如果Message Age 大于Max Age,则该配置BPDU 报文将被老化掉。该非根桥设备将直接丢弃该配置BPDU ,并认为是网络直径过大,导致了根桥连接失败。
8、端口状态转化
端口状态转换的场景:
- 端口初始化或者赋予角色;
- 端口被选为根端口或指定端口。
- 端口不再是根端口或指定端口。
- forward delay 计时器超时。
- 端口禁用或链路失效。
图中所示为STP 的端口状态迁移机制,运行STP 协议的设备上端口状态有5 种:
端口状态 | 说明 |
Forwarding 转发状态 | 端口既可转发用户流量也可转发BPDU 报文, 只有根端口或指定端口才能进入Forwarding 状态。 |
Learning 学习状态 | 端口可根据收到的用户流量构建MAC 地址表,但不转发用户流量。 增加Learning 状态是为了防止临时环路。 |
Listening 侦听状态 | 端口可以转发BPDU 报文,但不能转发用户流量。 |
Blocking 阻塞状态 | 端口仅仅能接收并处理BPDU,不能转发BPDU,也不能转发用户流量。 此状态是预备端口的最终状态。 |
Disabled 禁用状态 | 端口既不处理和转发BPDU 报文,也不转发用户流量。 |
总结
STP 是为了解决二层环路产生的问题而诞生的,二层环路会产生广播风暴,MAC 地址表震荡,充斥大量重复帧。
STP 通过逻辑上的阻塞端口来消除环路。
从设备角色上看STP 分为:根桥和非根桥。
从端口角色上看STP 分为:指定端口(DP),根端口(RP)、预备端口(AP)
STP 根桥选举过程:
- 每台交换机初始状态都认为自己是根桥并向其他交换机发送BPDU;
- 交换机比较BPDU 中的BID(桥ID),先会比较优先级,数值越小越优先。优先级相同则会比较MAC 地址,越小越优先。
根端口的选举过程:
- 选择到根桥路径开销最小的为根端口,路径累计开销依据是带宽,带宽越高开销越小。
- 如果多个累计路径开销相同,选择收到发送者BID 最小的那个端口作为根端口。
- 如果BID 还相同,比较对端端口PID 最小的哪个的端口为跟端口。
指定端口的选举过程:
- 根桥的端口都为指定端口
- 非根桥选举指定端口依据累计开销选举,累计开销小的为指定端口。
- 若累计开销相同则会比较自己的桥ID,桥ID 小的为指定端口。
预备端口的选举过程:
- 如果一个端口没有被选成根端口和指定端口,那么它就是预备端口,而且会被阻塞。被阻塞的端口不能转发数据,只能监听BPDU。