🐈 STP
(Spanning Tree Protocl,生成树协议)是一种 用于解决二层交换网络环路的协议
,在二层的以太帧不存在防止环路的机制,一旦存在环路就会造成报文在环路内不断循环和增生,产生广播风暴,从而占用大量带宽和资源,使网络变得不可用。
它通过 有选择性地阻塞网络冗余链路
来达到消除网络二层环路的目的,同时具备链路备份功能。经过几代的更新迭代,最初版本是 IEEE 802.1d—1998 STP,随后在其基础上产生了 IEEE 802.1w RSTP (快速生成树协议)和 IEEE 802.1s MSTP(多生成树协议)。
6.1 交换机环路问题分析
1. 环路的形成
什么情况下才会出现交换网络环路问题?交换网络环路是由什么原因导致的?在部署交换网络时,为了提高网络的可靠性和冗余,往往都会增加多台交换机并且交换机之间会有多条链路级联,下面分析一下环路是怎么形成的。

首先,假设所有的交换机MAC地址表都为空,PC1与PC2进行通信,PC1将数据帧发送给SW2,由于 SW2地址表中没有 目的MAC地址,SW2会向除接收端口以外的其他端口泛洪数据。这样 SW1和 SW3也会进行同样的步骤,学习数据 源MAC并进行泛洪,直到数据帧通过PC2并进行回复后才结束。因为这是一个未知单播帧造成的环路,但是如果同样的场景换成广播帧(比如 ARP广播),环路就会一直存在。
数据帧不同于IP包,在 IP包中可以通过TTL值防止三层数据环路,而数据帧中没有这种机制,这就会造成二层的永久环路,交换网络会基本瘫痪,会出现以下三种后果:
1. 广播风暴
2. MAC地址不稳定(MAC地址漂移)
3.重复的帧拷贝
2. STP的基础概念及其工作原理
(1) STP的基础概念
STP包括:狭义STP 和 广义STP 这两个含义。狭义STP是指 IEEE 802.1d—1998 定义的STP ;广义的是指后期更新改进的STP技术,本章提到的作用均为 狭义STP。STP的基本思想十分简单:自然界中生长的树是不会出现环路的,让网络流量走向像树一样就不会存在环路了。通过构造“一棵树”的方法达到 裁剪冗余环路
的目的,同时实现 链路备份和路径最优化
。用于 构建这棵树的算法被称为生成树算法 (Spanning Tree Algorithm)。
STP有以下几个基础概:
● 桥ID(Bridge ID,BID):IEEE 802.1D标准中规定BID 由16位的桥优先级(Bridge Priority)与桥MAC地址构成
。每一台运行STP的交换机都拥有一个 唯一的BID
。BID桥优先级占据高16bit,其余的低48bit是桥MAC地址。

● 根桥(Root Bridge):根桥是一个STP交换网络中的“树根”。STP开始工作后,会在交换网络中选举一个根桥,根桥是生成树进行拓扑计算的重要“参考点”,桥ID最小的设备会被选举为根桥。
● 根端口(Root Port,RP):根桥选举完后,除被选为根桥的交换机外其他交换机都成为非根交换机,而每一台非根交换机都需要选举出一个到达根桥的根端口。 根端口的主要作用是 接收
BPDU报文的端口。
● 指定端口(Designated Port,DP):为了防止环路在每条链路上还要再选举出一个指定端口,本质上仍然是离根桥最近的端口,有且只有一个。指定端口的主要作用是 发送
生成树报文的端口。
● 代替端口(Alternate Port,AP):如果一个端口既不是根端口也不是指定端口,那么该端口会被阻塞(Blocking),变为代替端口。阻塞后的端口只会侦听并接收 BPDU报文,但不会发送 BPDU报文和数据帧。
● 路径开销(Path Cost):每一个激活了STP的接口都维护着一个Cost值,接口的Cost主要用于计算根路径开销,也就是到达根的开销。接口带宽越大,则Cost值越小,用户可以根据需要通过命令调整接口的Cost。
● 根路径开销(Root Path Cost):在STP的拓扑计算过程中,一个非常重要的环节就是“丈量” 交换机某个接口到根桥的“成本”
,也即RPC。
● 接口ID(Port ID,PID):运行STP的交换机使用接口ID来标识每个接口,接口ID主要用于在 特定场景下选举指定接口
。接口ID由两部分构成的,高4 bit是接口优先级,低12 bit是接口编号。激活STP的接口会维护一个缺省的接口优先级,在华为交换机上,该值为128。
要实现以上功能,交换机之间必须要进行信息交互,这些信息交互单元被称为 BPDU (Bridge Protocol Data Unit, 网桥协议数据单元 )。STP BPDU是一种二层报文,被封装在以太网数据帧中,目的MAC地址是 多播地址 01-80-C2-00-00-00
,所有支持STP的网桥都会接收并处理这种报文,报文中携带了用于生成树计算的所有信息。

(2) STP工作原理
首先进行根桥的选举。 选举依据: 网桥优先级 和 网桥 MAC 地址组合成的网桥 ID(Bridge ID), 网桥ID最小的将成为网络中的根桥
,网络中 只能有一个根桥
,其他交换机都为非根桥,可以把它们统称为 下游网络
。根桥的所有端口都连接到下游网桥,所有端口角色都成为指定端口(DP)。
接下来,连接根桥的下游网桥将各种选择一条“最粗壮”的树枝作为到根桥的路径,相应的端口角色称为根端口(RP)。循环该过程到网络的边缘,DP和RP确定之后一颗生成树就完成了。生成树经过一段时间(默认值是30s左右)稳定之后,指定端口和根端口进入转发状态,其他端口进入堵塞状态。 STP BPDU报文会定时从各个网桥的指定端口发出以维护链路状态。
如果网络拓扑发生变化,生成树就会重新计算,端口状态也会随之改动。
随着应用深入和网络技术的发展,STP的缺陷也暴露出来:主要表现在他基于时间进行收敛。当拓扑发送变化后,整个网络需要重新执行生成树收敛计算,而该计算延时称为 Forward Delay(转发延迟),协议默认是15s。收敛的状态下不会转发数据帧,这对于某些实时业务时是不能接受的。
6.2 STP的选举
6.2.1 BPDU报文格式
生成树协议通过交互 BPDU报文来计算一个无环树,下图展示了 BDPU报文格式。
BPDU报文各字段含义:
● Protocol IDentifier(协议ID):协议标识符。协议 ID=0
● Protocol Version IDentifier(协议版本ID):协议版本标识符:
◆ STP——0;
◆ RSTP——2;
◆ MSTP——3
● BPDU Type(BPDU类型):
STP BPDU 类型有两种:
◆ 0x00——STP 的配置 BPDU (Configuration BPDU);
◆ 0x80——STP 的拓扑改变通告 BPDU(TCN BPDU);
RSTP/MSTP BPDU 类型:
◆ 0x02——RST BPDU(快速生成树),当协议版本ID为3时代表 MST BPDU(多生成树)
● Flag(标志位):Flag 由8比特组成,其中 STP只使用 2 比特 ,网络拓扑变化标志:
◆ 第1比特位(左边,高位)——TCA(拓扑改变确认);
◆ 最后1比特位(右边,低位)——TC(拓扑改变)
● Root IDentifier(根ID):根ID是通告根桥的ID,由8字节组成,前2字节由根桥优先级(默认32768)+扩展系统 ID(VLAN ID)组成,后6字节表示根 桥的 背板MAC地址
。
● Root Path Cost(根路径开销):指BPDU报文的发送者到达根桥的距离,如果是根桥发送的 BPDU 报文,该值为 0(根桥到自己的距离为0)
● Bridge IDentifier(网桥ID):本设备的BID。对于MSTP,是指CIST(总生成树)的域根设备ID,即IST Master-的ID,结构和根桥ID一致。
● Port IDentifier(端口ID):BPDU报文发送者的端口ID,由2字节组成,前1字节标识端口优先级,后一字节标识端口ID。
● Message Age(消息生存周期):如果配置BPDU是根桥发出的,则Message Age为0。否则,Message Age是 从根桥发送到当前桥接收到BPDU的总
时间
,包括传输延时等。实际实现中,配置 BPDU报文经过一个桥,Message Age增加1
。
● Max Age(最大生存周期):BPDU报文的最大老化时间,默认值为20秒。如果超过20秒没有收到BPDU报文,则认为网络出现故障重新执行STP计 算,收敛/中断网络。
◆ BPDU 报文传递报文判断过程如下:交换机收到 BPDU报文后将 Message Age 和 Max Age 进行对比,如果 Message 大于 Max ,丢弃 BPDU报文 不转发; Message 小于 Max 或者等于 Max ,转发 BPDU报文,并将 Message Age加一。
● Hello Time(Hello 时间):Hello Time定时器,默认为2秒,即发送两个相邻BPDU报文的时间间隔。
● Forward Delay(转发延迟):Forward Delay定时器,默认为15秒。控制Listening和Learning状态的持续时间。
6.2.2 根桥选举
根桥是STP树的根节点(树根)。想要生成一颗STP树,首先需要选举出树根,网络中只能存在一个根桥,通常核心交换机是根桥。
运行 STP 的交换机 初始启动
后都会认为自己是根桥,并在发送的 BPDU报文中标识自己为根桥
。当在网络中收到其他交换机发送的 BPDU 报文后,会将 BPDU 报文中的 网桥ID 和自己的网桥ID进行对比。在不断的对比中交互 BPDU报文,最终会选举出一台网桥ID 最小的交换机作为根桥。
网桥ID的比较原则是: 先比较优先级,如果一样比较 系统MAC地址
上图可知,比较网桥ID后,选举 SW1 为根桥,因为SW1的网桥ID最小。
MAC地址比较方法:
● MAC地址的长度是48比特(6字节),48位二进制数,12位16进制数组成,即0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f ;从左到右的数字一位比一位小。
● 在比较MAC地址时,从第一位开始 每一位都要相互比较。
6.2.3 根端口选举(RP)
根桥选举完成后,除被选为根桥的交换机外,其他交换机都是非根交换机,而 每一台非根交换机都需要选出一个达到根桥的根端口。
根端口是作为该 非根桥与根桥之间进行报文交互的端口,一台非根交换机最多一个根端口。
STP 协议根据 比较 根路径开销
来选举根端口 ,将交换机的端口到根桥的累计开销(经过的所有链路开销之和)成为该端口的根路径开销(Root Path Cost,RPC)。交换机本地端口的开销称为PC(Path Cost),该开销的计算与端口速率有关, 端口速率越大,开销越小
,交换机G口默认端口速率为:2000。
◆ 根路径开销:交换机的端口到达根桥的路径开销之和
◆ 路径开销:本地端口的开销
端口 RPC 计算公式是: BPDU 报文中通告的 RPC + 接收端口的PC
完成根桥选举后,所有的非根桥都需要选出一个到达根桥的根端口。以图上的SW2交换机为例,G0/0/3口和G0/0/2口都收到了BPDU报文,根据计算公式:G0/0/3口的RPC为20000(0+20000),而G0/0/2口是从SW3转发的BPDU报文,所以G0/0/2口到达根桥的RPC为40000(20000+20000)。交换机有限选举RPC小的端口作为根端口(根端口可以用RP来表示)。
根端口(RP)的选举参考以下步骤进行
:
① 比较 BPDU报文中的根ID(RID),越小越优(在网络中只能有一个根桥,所以RID可能都是一致的);
② 如果RID一致,比较到达根桥的累计路径开销(RPC),越小越优;
③ 如果到达根桥的 RPC一致,比较 BPDU 报文发送者(上游交换机)的网桥ID,越小越优;
④ 如果到达根桥的BID一致,比较 BPDU报文发送者的端口ID,越小越优;
⑤ 如果 发送者的端口ID一致,比较 BPDU报文接收者的本地端口ID,越小越优。
举例:
1.根据发送者端口ID选举出根端口:
在上图中,SWA为根桥,那么SWB哪个端口会成为根端口呢?
① 比较 RID(根桥ID),两个端口收到的 BPDU报文中的RID都是SWA,所以 RID一致;
② 比较两个端口到达根桥的 RPC,由于两个端口都是G口,计算出来的RPC都是20000;
③ 比较 BPDU发送者BID(桥ID),都是SWA发送的,也无法比较出结果;
④ 比较 BPDU发送者的端口ID , SWA从G0/0/1口发送的 BPDU报文中标识的端口ID为1; G0/0/2口发出的 BPDU报文的端口ID为2。SWB 通过比较发送端的端口ID(还需要注意比较端口优先级,默认情况下优先级是128),最终选择G0/0/2作为根端口。
2.根据自身端口ID选举出根端口:
在上图中,SW8作为根桥通过Hub与SW7进行 BDPU的报文传输,根据选举规则:RID一致、RPC一致、BID一致、发送者的端口ID一致,只能比较自身的接口ID来判断。 G0/0/1接收的 BPDU报文端口ID为1,G0/0/2接收的 BPDU报文端口ID 为2,所以 G0/0/1作为SW7的根端口。
6.2.4 指定端口选举(DR)
根端口保证了非根桥到根桥路径的唯一性和最优性,为了防止环路还需要选举出一个指定端口。通常 根桥所有的端口都是指定端口
,和根桥连接的链路无须选举。
指定端口(DP)的选举参考以下步骤进行:
① 比较报文到达根桥的累计根路径开销(RPC),越小越优;
② 如果 RPC相同,则比较端口所在交换机自身的网桥ID(BID),越小越优;
③ 如果RPC 和 BID 都比较不出来,则比较本地端口ID,越小越优。
举例:
SW2 和 SW3 之间的链路上哪个端口会选举出指定端口?套用判断条件进行端口选举:
① 比较 RPC,SW2的G0/0/2的RPC继承自 G0/0/1(因为 收
BPDU的报文是同一台交换机),即为 20000,SW3的G0/0/2同理为 20000;
② 比较 端口所在交换机
的网桥ID(BID),很明显 SW2 和 SW3的优先级一样,由于SW2的 MAC地址较小,所以 SW2的G0/0/2端口成为指定端口(DP)
6.2.5 替代端口选举(Non-DP)
如果一个端口既不是根端口也不是指定端口,那么该端口会被堵塞(Blocking),变为替代端口(Alternate Port,AP)。通常替代端口是根端口的备份,一旦根端口发生故障,替代端口将升级成根端口。阻塞后的端口只会 侦听并接收 BPDU报文
,但不会发送 BPDU报文和数据帧。
该图中,SW3的G0/0/2端口既不是根端口也不是指定端口,所以只作为替代端口,不转发用户数据。
6.2.6 边缘端口(终端)
将交换机连接终端(计算机、服务器等)的端口配置为 边缘端口可以减少端口的30秒的转发延迟时间
, 即跳过Listening、Learning,直达Forwarding 。同时边缘端口的开启和关闭不会造成因网络拓扑改变(TCN BPDU)带来的 MAC地址表频繁被老化导致短暂广播风暴问题。
如果边缘端口收到一个配置 BPDU报文,则该端口将丢失边缘端口角色,变成一个普通端口并执行生成树选举。边缘端口支持配置STP 安全策略,如 BPDU防护和 BPDU过滤等,该策略可以防止边缘端口因接入支持STP的交换机而导致的网络拓扑改变。
原理是:配置BPDU保护功能后,如果边缘端口收到BPDU报文,边缘端口将会被error-down,边缘端口属性不变。
边缘端口由于快速转发特性,也会出现临时环路问题,临时环路的持续时间为0~2s
。将两个边缘端口连接到一起 或 接入不支持 STP的交换机就会造成临时环路,环路的解决方法是收到 配置BPDU报文 ,从而变成普通的生成树端口。
6.2.7 STP端口角色及端口状态
STP 有三种端口角色:根端口、指定端口、替代端口。
STP 有5种端口状态: Disabled、Listening、Learning、Forwarding、Blocking状态。
① Disabled状态:禁用状态,端口不处理和转发 BPDU报文,也不转发数据帧。只有在设备没有连线,或者接口关闭时才会是此状态;
② Listening状态:侦听状态,端口可以接收和转发 BDPU报文,但不能转发数据帧。监听生成树的BPDU报文用于选举, 监听时间需要15秒
;
③ Learning状态:学习状态,交换机此时将端口上所有能够学习到的MAC记录到MAC地址表中,但不转发数据帧。增加 Learning 状态是为了防止未知单播数据帧造成的临时环路,学习时间15秒---Forward Delay转发延迟
。
④ Forwarding状态: 转发状态
,端口既可以转发数据帧也可以转发 BPDU 报文。 当经历 两个转发延迟后
,最终一个端口才可以真正的进入到转发状态,STP收敛的时间最少30秒,只有根端口或指定端口可以进入该状态
。
⑤ Blocking状态:阻塞状态,端口仅接收并处理 BPDU报文,但不转发 BPDU报文,此状态是替代端口的最终状态。
STP端口状态间的转换条件如下:
① 端口初始化或使能
② 端口被选为根端口或指定端口
③ 端口不再是根端口或指定端口
④ Forward Delay 计时器超时(15秒),即15秒内没有收到 BPDU报文
⑤ 端口被禁用或者链路失效
STP 端口变化过程

● STP的交换机端口初始化后,所有的端口都处于 禁用(Disabled)状态
,这意味着这些端口不会转发或接收任何数据。
● 在启动之后,端口进入阻塞状态。在 阻塞(Blocking)状态
下,不会转发任何数据帧,但会接收 STP BPDU消息,这些消息用于交换机之间的信 息沟通, 交换机通过比较接收到的 BPDU消息的优先级和MAC地址来选择根交换机。
● 如果端口被选举为根端口或者指定端口,就会 自动进入侦听(Listening)状态
,端口开始发送自己的BPDU消息,并继续监听网络上的其他BPDU消息。端口在此状态下的时间通常等待Forward delay 15s。
● 如果没有出现意外情况退回到 Blocking状态, 端口会进入学习( Learning)状态
。在 学习状态
下,此时端口仍然不会转发数据帧,可以接收和发送 BPDU报文,同时开始构建 MAC地址表,为转发用户数据做准备。端口在此状态下的时间同样持续Forward delay 15s。
● 最后端口从 学习状态进入转发状态(Forwarding)
,开始转发数据帧。
在整个状态迁移过程中,端口一旦被关闭或者发生了链路故障,就会进入 Disabled(禁用状态),生成树开始重新计算收敛网络。
6.3 STP报文类型
STP的 BPDU 报文类型一共有两种:配置 BPDU报文(类型值为 0x00)和 TCN BPDU 报文(类型为 0x80),下面介绍这两种类型的区别
6.3.1 配置BPDU 报文
在配置 BPDU报文中,BPDU类型(BPDU Type)的值被设置为 0x00,主要作用如下:
① 用于选举根桥以及端口角色;
② 通过定期发送(每两秒发送一次)配置 BPDU 报文维护状态;
③ 用于确认接收到的 TCN BPDU报文;
④ 用于选举根桥及端口角色。
配置 BPDU报文转发过程如下, STP 收敛后 只有根桥才会定期发送配置 BPDU报文
,其他非根桥收到 BPDU报文后会进行转发,通过这种方式维护端口状态。
非根桥收到配置 BPDU报文后,会先将配置 BPDU报文中的 Message Age 和 Max Age 进行对比(规则上面的内容已提过)。对于转发的配置 BPDU报文会修改以下内容:
① 将网桥ID修改为转发者的网桥ID
② 将端口ID修改为发送配置 BPDU报文的端口 ID (包括端口优先级和端口 ID)
③ 将Message Age加1(可以限制BPDU的范围)
6.3.2 TCN BPDU报文
TCN BPDU 报文中BPDU类型的指被设为0x80,其作用是 通告网络中拓扑发生了改变
,但必须说明的是TCN BPDU的通告和STP的收敛没有任何的关系。但是如果没有TCN BPDU报文,网络变化后数据帧会如何处理:
在拓扑中(默认 SW1 为根桥),STP收敛完成后 SW2的G0/0/2口被选举成AP端口并阻塞,主机A访问主机B的数据帧会通过SW1转发到SW3。两台主机完成通信后,SW2的MAC地址表如图中所示,现在如果SW1和SW3的链路端口断开会出现以下问题:
由于链路发生故障,导致 STP 重新收敛,现在主机A和主机B通信依然按照 SW2 的 MAC地址表进行,但是当数据从 G0/0/1口转发出去后 SW1将直接丢弃,原因是链路故障导致端口关闭。
现在状态下主机A不能和主机B进行通信了吗?答案是,需要经过 300s MAC地址老化,当 SW2的 MAC地址表重新从 G0/0/2口进行学习,才能通信。
能否修改 MAC地址的老化时间,让通信恢复更快呢? 不能,因为老化时间一但短,刚学的MAC地址如果没有一个持续访问流量,那么MAC地址很快会老化并被删除,再次收到同一单播帧就会导致新一轮的泛洪,产生网络不稳定的问题。
🧐TCN BPDU 解决方法
以下 TCN BPDU报文简称:TCN报文
① SW3 发现拓扑改变后会从根端口发送一个 TCN报文,目的是要将发生拓扑改变的消息 通知根桥 ;
② SW2 从自己的指定端口收到了 SW3 发的TCN报文后,SW2 会向 SW3 BPDU Flag
被设置为 TCA的配置BPDU报文
(回复确认收到报文);
③ SW2 继续从自己的根端口转发 TCN报文;
④ SW1收到 TCN报文后也同样向 SW2 回复一个 BPDU Flag 被设置为 TC 的配置BPDU报文,并将自己的 MAC地址表老化时间修改为15秒
(一个转发延迟的时间)。同时向所有指定端口发送一个 Flag 被设置为 TC 的报文,目的是告诉非根桥拓扑已经发生了改变
。SW1 发送该配置 BPDU 报文会 连续发送35秒
(Max Age + Forward Delay时间)
⑤ 非根桥在收到 TC置位的配置 BPDU 报文后会从所有的指定端口 转发
,同时也将自己的 MAC地址表老化时间修改为15秒
,TC报文只会发送35s(Max Age+Forward Delay)的时间。
注: STP中 TC 置位的配置 BPDU 报文只能由根桥发送,目的是加速MAC地址老化,尽快恢复数据转发。
STP在以下三种情况下会发送 TCN报文:
● 端口从转发状态过渡到阻塞状态(Blocking)或禁用状态
● 非根桥从一个指定端口收到 TCN报文后会从自己的根端口向交换机转发。
● 端口进入到转发状态并且桥设备已经存在一个指定端口。
🦈TCN 拓扑变更通告报文

🦈TCA确认包

🦈TC 置位报文

6.3.3 STP收敛时间
STP完全收敛需要依赖定时器的计时,端口状态从 Blocking 迁移到 Forwarding 至少需要两倍的转发延迟时间(30s),下面列举三种STP常见的故障:
说明:正常的STP网络中,非根桥会定期收到来自根桥的BPDU报文
第一种 根桥设备故障
如果下游交换机一直收不到BPDU报文,MaxAge计时器(缺省:20s)就会超时,从而导致已经收到的BPDU报文失效,此时,非根桥会互相发送配置BPDU,重新选举新的根桥。
SW3、SW2两台交换机都会认为自己是根桥,此时端口状态会更新为:监听——学习——转发;拓扑整个收敛时间为:50s(20s+15s+15s)
第二种 非AP端口链路故障
若SW1与SW2之间的链路发生了某种故障(非物理故障),因此SW2一直收不到来自根桥SW1的BPDU报文,MaxAge计时器 (缺省:20s)就会超时,从而导致已经收到的BPDU报文失效。
SW2会自己选举成为根桥,当重新收到SW1的BPDU报文后才会重新更新端口;拓扑整个收敛时间为:50s(20s+15s+15s)
第三种 AP直连链路故障
当SW3的根端口故障时,AP端口会重新收敛,从SW2中获取SW1的BPDU报文,G0/0/1端口状态会更新为:禁用——监听——学习——转发;拓扑整个收敛时间为:30s(15s+15s)