STP(Spanning Tree Protocol)是生成树协议的英文缩写。该协议可应用于在网络中建立树形拓扑,消除网络中的二层环路,并且可以通过一定的方法实现路径冗余(不是一定可以实现路径冗余),实现冗余备份;同时避免因环路的存在而造成广播风暴的问题。

明白了STP大致是干什么的之后,现在来了解一下他的过程:

运行STP协议的交换机的端口总共有四种状态:
⑴阻塞BLK(20s)
⑵监听LIS(15s)
⑶学习LRN(15s)
⑷转发FWD

交换机通电后,该网络内的交换机即为阻塞状态,此阶段各交换机向外发送自己的BPDU(网桥协议数据单元Bridge Protocol Data Unit),并接收所收到的BPDU。通过分析BPDU数据来选举根桥交换机。

根桥交换机的选举原则:BID(bridge id)

BID中包含网桥优先级和桥MAC

选举时首先比较bridge priority(桥优先级),bridge priority 越小越优,默认为32768,优先级必须为4096的倍数。
STP基础+高级特性+实验模拟_第1张图片
如上图所示,优先级的数值为32768+vlan名(如:vlan 1,优先级即为32768+1)。

若设备的优先级相同,则比较桥MAC地址。桥MAC地址同桥优先级一样,越小越优

根桥交换机选举完成后,各端口即进入监听状态。此阶段与阻塞状态的过程有些类似,但目的不同。此阶段各交换机的各个端口向外发送自己的BPDU,同时接收其他交换机的BPDU。通过分析BPDU的数据来选举根端口RP和指定端口DP。

  • 选举根端口(RP)
    在每个非根桥交换机上选举一个根端口。

选举规则为:
⑴到根网桥最低的路径开销
⑵发送BPDU的网桥ID较小
⑶端口ID较小的

路径开销cost值如下图所示:
链路开销
端口ID由端口优先级与端口编号组成。默认的端口优先级为128。端口优先级根据对端交换机的端口优先级计算,越小越优。
当端口优先级相同时,则比较端口号(port-number),端口号越小越优,同样与对端交换机的端口进行比较。

  • 选举指定端口(DR)

每个网段上选举一个指定端口。

选择顺序为:
⑴根路径成本较低

⑵发送BPDU的交换机的网桥ID值较小

⑶本端口的ID值较小。

另外,根网桥的接口皆为指定端口,因为根网桥上端口的根路径成本为0。

小结:生成树协议运行生成树算法(STA)。生成树算法很复杂,但是其过程可以归纳为以下3步:

(1)选举根网桥

(2)选举根端口

(3)选举指定端口


通过实验进行验证,实验拓扑图如下所示:
STP基础+高级特性+实验模拟_第2张图片
基本配置:
SW-1

SW-1(config)#vlan 10
SW-1(config-vlan)#vlan 20
SW-1(config-vlan)#exit
SW-1(config)#interface range g0/0-1
SW-1(config-if-range)#switchport trunk encapsulation dot1q 
SW-1(config-if-range)#switchport mode trunk 
SW-1(config-if-range)#exit
SW-1(config)#spanning-tree vlan 10 priority 4096
SW-1(config)#spanning-tree vlan 20 priority 0
//修改模式为pvst
SW-1(config)#spanning-tree mode pvst 

SW-2

SW-2(config)#vlan 10
SW-2(config-vlan)#vlan 20
SW-2(config-vlan)#exit
SW-2(config)#interface range g0/0-1
SW-2(config-if-range)#switchport trunk encapsulation dot1q 
SW-2(config-if-range)#switchport mode trunk 
SW-2(config-if-range)#exit
SW-2(config)#spanning-tree vlan 10 priority 0
SW-2(config)#spanning-tree vlan 20 priority 4096
//修改模式为pvst
SW-2(config)#spanning-tree mode pvst 

SW-3

SW-3(config)#vlan 10
SW-3(config-vlan)#vlan 20
SW-3(config-vlan)#exit
SW-3(config)#interface range g0/0-1
SW-3(config-if-range)#switchport trunk encapsulation dot1q 
SW-3(config-if-range)#switchport mode trunk 
SW-3(config-if-range)#exit
SW-3(config)#interface g0/2
SW-3(config-if)#switchport mode access 
SW-3(config-if)#switchport access vlan 10
SW-3(config-if)#exit
SW-3(config)#interface g0/3
SW-3(config-if)#switchport mode access 
SW-3(config-if)#switchport access vlan 20
SW-3(config-if)#exit
//修改模式为pvst
SW-3(config)#spanning-tree mode pvst 

验证思路:基本配置完成后,以vlan 10为例,我们先关闭SW-3上对应vlan 10的interface G0/2端口,然后再打开。由前面的理论我们知道,STP的收敛速度是很慢的。因此我们可以在no shutdown G0/2接口后不断的输入show spanning-tree命令来查看接口的状态信息,以此来摸清运行 STP协议 的网络的状态变化过程。

先关闭,后打开G0/0接口后的状态变化过程(白色部分为时间):

  1. 阻塞→监听

在这里插入图片描述

  1. 监听→学习(15s)
    在这里插入图片描述
  2. 学习→转发(15s)
    在这里插入图片描述
    通过观察上面几个过程及计算时间,我们不难得知,监听→学习需15s, 学习→转发需15s。

协议缺点:
1、拓扑收敛慢,当网络拓扑发生改变的时候,生成树协议需要50-52秒的时间才能完成拓扑收敛。

2、不能提供负载均衡的功能。当网络中出现环路的时候,生成树协议简单的将环路进行Block,这样该链路就不能进行数据包的转发,浪费网络资源。


STP高级特性

通过上面的实验,我们可得知STP的收敛速度是很慢的,需50s才能收敛完成。这种情况是一些实时以及对带宽敏感的网络应用是不能接受的。针对这一情况,Cisco公司提出了三种新的端口特性来予以解决。

1.portfast:连接终端设备的端口(边缘端口edge),当RP失效,马上启动阻断端口保持通信。这样收敛时间很快,不用重新进行STP运算,可从监听状态直接变为转发状态,从而节约30s的时间。

2.uplinkfast:针对直连链路的故障解决。当直连链路发生故障时,设备要重新选举端口。此时开启了uplinkfast特性的接口可直接从监听状态变为转发状态,从而节省30s的收敛时间。

3.backbonefast:若使用此端口特性,则需要在该网络的每一台交换机上开启。通过backbonefast的特性,让其他和根桥断掉的交换机主动发送查询消息,查询是否还有到达根桥的备份路径。 若没有备份路径,则该端口称为新的根端口。若有,则该端口变为指定端口。

BackboneFast是对UplinkFast的一种补充:UplinkFast能够检测直连链路的失效,BackboneFast是用来检测间接链路的失效。当启用了BackboneFast的交换机检测到间接链路失效之后,会马上使阻塞的端口进入监听状态,少了20S的老化时间。

实验验证:
同样是上文的拓扑和配置,我们只需多输入几条命令即可实现。

portfast:SW-3

SW-3(config)#interface g0/2
SW-3(config-if)#spanning-tree portfast edge default
//输入上面一条命令时,会弹出警告
%Warning: portfast should only be enabled on ports connected to a single
 host. Connecting hubs, concentrators, switches, bridges, etc... to this
 interface  when portfast is enabled, can cause temporary bridging loops.
 Use with CAUTION

%Portfast has been configured on GigabitEthernet0/2 but will only
 have effect when the interface is in a non-trunking mode.
//现在将端口关闭再打开,查看状态变化
SW-3(config-if)#shutdown 
SW-3(config-if)#no shutdown 

在这里插入图片描述
我们可以看到,该端口直接变为了转发状态,节省了监听和学习共30s的时间。
STP基础+高级特性+实验模拟_第3张图片
当然我们也可以在全局模式下开启portfast特性(使用需谨慎):
在这里插入图片描述


uplinkfast:SW-3(非根桥上开启)

SW-3(config)#spanning-tree uplinkfast 
SW-3(config)#interface g0/0
SW-3(config-if)#shutdown 
SW-3(config-if)#no shutdown 

STP基础+高级特性+实验模拟_第4张图片
关闭接口后会直接弹出这条提示,查看spanning-tree:
STP基础+高级特性+实验模拟_第5张图片
可以看出,端口关闭后新的根端口立刻选举了出来并变为转发状态,节省了从监听到转发状态所需的30s时间。


backbonefast:假定某一端口出现故障
SW-1

SW-1(config)#spanning-tree backbonefast 

SW-2

SW-2(config)#spanning-tree backbonefast 
SW-2(config)#interface g0/0
SW-2(config-if)#shutdown 

SW-3

SW-3(config)#spanning-tree backbonefast 

SW-2的G0/0口出现故障后,SW -3上可看见如下提示:
STP基础+高级特性+实验模拟_第6张图片
STP基础+高级特性+实验模拟_第7张图片
可发现SW-3上直接变为监听状态,省去了BPDU老化的20s时间。


补充:root guard根防护功能

Root Guard:防止新加入的交换机(有更低根网桥ID)影响一个已经稳定了(已经存在根网桥)的交换网络,阻止未经授权的交换机成为根网桥。
工作原理:当一个端口启动了此特性,当它收到了一个比根网桥优先值更优的BPDU包,则它会立即阻塞该端口,使之不能形成环路等情况。这个端口特性是动态的,当没有收到更优的包时,则此端口又会自动变成转发状态。当收到更优的包时,该端口将变为根不连续的阻塞状态。

配置根防护的命令

//接口下配置
SW(config-if)#spanning-tree guard root

在这里插入图片描述

当收到更优数据包时,查看对应vlan的信息,可发现该端口的状态变为根不连续的阻塞状态。
STP基础+高级特性+实验模拟_第8张图片
相关查看配置的命令

SW#show spanning-tree inconsistentports

root guard作用位置:
1.交换机上未使用的端口
2.接入的端口


BPDU guard

前面提到了portfast特性是适用与连接终端设备的端口特性。但是不能排除配置时人为造成的错误配置。若两台交换机之间的链路开启了portfast特性,这两个端口将跳过侦听和学习阶段,不参与STP的计算而直接进入转发状态,从而造成存在环路的风险。为了避免出现这种情况,我们引入了BPDU guard的概念:BPDUGuard使具备PortFast特性的端口在接收到BPDU时进入err-disable状态来避免桥接环路,其可在全局或接口下进行配置(默认关闭)。

为消除因portfast造成的环路,主要有两种方法:
1.开启BPDU guard特性
2.将问题接口的portfast特性移除
STP基础+高级特性+实验模拟_第9张图片
现在我们做个实验来做一些验证。

//全局下开启portfast特性
SW-2(config)#spanning-tree portfast edge default

现在SW-2的状态如下所示STP基础+高级特性+实验模拟_第10张图片
现在我们在SW-2上开启BUDP guard特性

//全局下开启BUDP guard
SW-2(config)#spanning-tree portfast edge bpduguard default
//接口下开启BUDP guard
SW-2(config-if)#spanning-tree bpduguard enable
//开启因触发BPDU guard惩罚而关闭的端口自动恢复
SW-2(config)#errdisable recovery cause bpduguard 
//修改自动恢复的时间
SW-2(config)#errdisable recovery interval 30

现在我们打开SW-1的e0/0端口,SW-2会弹出如下日志:
STP基础+高级特性+实验模拟_第11张图片

查看SW-2的所有端口状态可发现,e0/0端口确实已经关闭:
STP基础+高级特性+实验模拟_第12张图片
当SW-2的e0/0端口接收到BPDU报文时,端口将关闭;未接收到BPDU 报文时,端口将自动恢复。默认恢复时间为300s。


此外,另一种解决办法:移除问题端口的portfast特性

//全局下开启针对portfast特性的bpdufilter
SW-2(config)#spanning-tree portfast edge bpdufilter default
//接口下开启bpdufilter
SW-2(config)#spanning-tree bpdufilter enable

全局下开启时,当某个交换机的edge端口收到了BPDU,将端口的portfast特性移除,使其回归到原始的生成树状态,参与STP的计算。

接口下开启bpdufilter后,该端口将不再发送BPDU报文,也不会再接收BPDU报文。

重复上文实验,查看端口状态可以验证此特性。
STP基础+高级特性+实验模拟_第13张图片