什么是STP
STP(Spanning Tree Protocol)即IEEE 802.1D,其作用主要有三个,第一是eliminate logical
loops消除逻辑环,第二自动选取最有效的网络路径,第三是当某条链路失效时,自动切换到备份链路,实
现所谓的failover功能。STP协议有很多种类,可分为STP(802.1D)、RSTP(802.1W)、MSTP(802.1S)、
PVST/PVST+ PVRST/PVRST+。STP的基本原理是通过在交换机之间传递一种特殊的协议报文,网桥协议数
据单元(Bridge Protocol Data Unit,简称 BPDU),来确定网络的拓扑结构。
常用术语
● Bridge ID: BID,由网桥优先级和MAC地址构成。
● Port ID: 由两部分组成,在 BPDU 中共占用两个字节,高位字节为优先级,低位字节为端口号。优
先级值缺省为128。
● Path Cost: 路径开销,用 cost 值来计算两个设备之间的“距离”。
● BPDU:(Bridge Protocol Data Unit), 网桥协议数据单元,它是 STP 赖以工作、在交换机
之间进行交互的二层数据帧,交换机所定义的参数、网络中拓扑的改变都通过 BPDU 进行传递。 BPDU 共
分为二类, Configuration BPDU 和 Topology Change Notification BPDU。
● Root Bridge: 根桥, STP 的基本思想就是按照”树”的结构构造网络的拓扑结构,树的根是一个称为
根桥的桥设备,根桥的确立是由交换机或网桥的 BID(Bridge ID)确定的, BID最小的设备成为二层网络
中的根桥。
● 指定桥(Designated Bridge):在每个网段中,到根桥(Root Bridge)的路径开销最低的(lowes
t Root Path Cost)桥将成为指定桥(Designated Bridge),数据包将通过它转发到网段。一旦所有的
交换机具有相同的根路径开销(Root Path Cost),那么具有最低的桥标志级数的(lowest Bridge Iden
tifier)交换机才会被定为指定桥(Designated Bridge)。
● 桥的优先级(Bridge Priority):是一个用户可以设定的参数。设定的值越小,优先级越高。交换机
具有越高的优先级,才越有可能成为根桥。
STP标准参数:
● Hello time: 2 秒
● Max age:20 秒
● Forward Delay 15 秒
● 这些参数都可进行修改,但只有对根桥的修改才起作用,非根桥上的这些timer参数只在其产生TCN
BPDU 时才起作用
STP 的具体工作机制(三原则)
● 每个STP组(STG)或所谓实例(Instance)中要选出一个根桥(root)
● 每个非根桥要选出一个根端口(root port)
● 每条链路(segment)上要有一个指派端口(designated port)
STP 实现的算法(四步算法)
● Step 1. Lowest Root BID —产生根桥
● Step 2. Lowest Root Path Cost —产生根端口及指派端口
● Step 3. Lowest Sending BID (在 step 2 相同的情况下)
● Step 4. Lowest Port ID(在 step 3 相同的情况下)
端口状态
● Blocking(阻塞状态): 端口不会参与数据帧的转发。 但是会接收BPDU来检测网络的变化,判断根交
换机的位置和根ID,以及在 STP 拓扑收敛结束之后,各交换机端口应该处于什么状态,在默认情况下,端口
会在这种状态下停留20秒钟时间。
● Listening(侦听状态): 生成树此时已经根据交换机所接收到的BPDU而判断出了这个端口应 该参与
数据帧的转发。于是交换机端口就将不再满足于接收 BPDU,而同时也开始发送自己的 BPDU,并以此通告邻
接的交换机该端口会在活动拓扑中参与转发 数据帧的工作。在默认情况下,该端口会在这种状态下停留 15
秒钟的时间。
● Learning(学习状态): 端口准备参与数据帧的转发,并开始填写MAC表。在默认情况下,端口会在这种
状态下停留 15 秒钟时间。
● Forwarding(转发状态): 端口已经成为了活动拓扑的一个组成部分,它会转发数据帧,并同时收发
BPDU。
● Disabled(禁用状态): 端口不会参与生成树,也不会转发数据帧。
端口的角色
● 根端口(root port):非根网桥到根网桥开销最小的端口是根端口。
● 指派端口(designated port):根网桥的所有端口都是指定端口,非根网桥与其他网桥的根端口相连
的端口都是指定端口。
● 阻塞端口(blocking port):既不是根端口又不是指定端口的就成为阻塞端口。
PVST
首先们来看一下PVST,PVST(Per LVAN Spanning Tree),是Cisco交换机预设的生成树模式,通过PVST
交换机之间可以建立起一个Loop-free的拓扑,也就是没有环路的网络。现在基本上都是PVST+协议。我们通
过下面的拓扑来看一下STP的工作原理,三台交换机互联,形成一个环路,看STP如何来消除环路。
1、选举根桥(root bridge),PVST会先选择Bridge Priority最小的Switch来成为Root Bridge,这个
Bridge Priority默认值是32768,PVST通过这个值+VLAN Number来计算出新的Bridge Priority。每一
个VLAN里面的Bridge Priority可以各不相同,所以每个VLAN可以拥有自己的STP拓扑。
2、由于PVST在Cisco交换机上默认是开启的,所以在我们的拓扑中,生成树已经是在工作状态。 每个交换
机默认只有一个VLAN 1,所以可以看到Bridge Priority是32769(32768+1),这也是默认值。
3、我们创建一个VLAN 2,可以看到VLAN 2的Bridge Priority是32770,也就是32768+2。
4、从上面的截图可以看到,当前VLAN 1和VLAN 2的根桥都是CoreSW02,我们通过更改CoreSW02的Bridge
Priority来看看会发生什么变化。我们将Priority都改成36864。注意,Priority必需是4096的倍数。
spanning-tree vlan 1 priority 35864
spanning-tree vlan 2 priority 35864
5、可以看到将Bridge Priority的值增大后,CoreSW02已经不再是VLAN1和VLAN2的根桥了。
6、通过上面的验证,说明Bridge Priority最小的Switch将会成为Root Bridge。现在我们来看一下
CoreSW01和CoreSW03,这两个的交换机的Bridge Priority我们没有改过,所以都是默认的,也就是相同
的,在这种情况下,Switch就会通过MAC地址的大小来进行选举,MAC最小的将成为根桥。从下图可见,Core
SW01和CoreSW03的Bridge Priority相同,但是CoreSW01的MAC地址比CoreSW02的MAC地址小,所以CoreS
W01被选举为Root Bridge。
7、现在VLAN1和VLAN2的根桥都是CoreSW01,并且VLAN1和VLAN2各自的STP中被Block掉的端口都是Core
SW02的e0/1。这种情况下虽然网络是正常的,但是并没有起到负载均衡的效果,端口e0/1将不会有任何生
产数据通过。由于PVST是Per Vlan的,所以可以为每个VLAN设置不同的Root bridge。这样一个端口只是
相对某个VLAN是Block的,对其它VLAN就是可用的。这就可以有效利用交换机上的每一个端口,避免流量过
于集中在某个或某些端口上,而Block的端口却没有得到使用。
8、现在我们把VLAN2的根桥调整为CoreSW02,VLAN1保持不变。可以通过调整VLAN2的Bridge优先级,也
可以在CoreSW02通过下面的命令直接调整。
spanning-tree vlan 2 root primary
9、我们再建立一个VLAN 3,然后将其的根桥设置为CoreSW03。这样现在三个VLAN的根桥就分别是三台交
换机,每个VLAN的STP中Block的端口都不相同。
CoreSW01: Root Bridge for VLAN 1, Port e0/0 blocked for VLAN 3
CoreSW02: Root Bridge for VLAN 2, Port e0/1 blocked for VLAN 1
CoreSW03: Root Bridge for VLAN 3, Port e0/0 blocked for VLAN 2
关于Root Port根端口
1、Root Port是指距离Root bridge最近的Port,除了Root bridge,其它交换机都会选择一个Root
Port。以VLAN 1为例,CoreSW01是VLAN 1的根桥,所以没有root port。
2、根据拓扑,CoreSW02的e0/0距离根桥(CoreSW01)距离最近,所以e0/0是root port。
3、根据拓扑,CoreSW03的e0/0距离根桥(CoreSW01)距离最近,所以e0/0是root port。
关于Designated Port指派端口
1、每一段网段只允许有一个端口成为Designated Port,网段里最接近根桥的端口成为Designated port
,如果只有两个端口,则与Root Port相对的端口就自然成为了Desg端口。所以下图中根桥(CoreSW01)的
两个端口都是Desg端口。
2、CoreSW02与CoreSW3再根据Switch Priority和MAC地址的大小选出Desg端口,数值小的胜出,另一个
端口就变成了Alternate Port, 也就是被Blocking掉的端口。 这样生成树就完成了所有端口的选举。
通过以上的实验,我们就完成了一个完整的STP形成的过程,我们来总结一下:
1、选举Root Bridge,通过比较Bridge Priority, ID值小的胜出。
2、如果Bridge Priority相同,再通过MAC地址比大小,同样MAC值小的胜出。
3、选出Root Bridge后,再通过Root Cost选出 Root Port,Cost值小的胜出。
4、选出Desg Port,非根桥同样通过比较Bridge Priority进行对比,ID值小的胜出。
5、如果Bridge Priority相同,再通过MAC地址比大小,同样MAC值小的胜出。
6、胜出的端口被选举为Desg端口,亚军就变成了Altn端口,被Block掉。
7、至此,生成树形成,消除网络环路。
关于BPDU
1、BPDU(Bridge Protocol Data Unit)是交换机之间用来传送STP信息的报文。BPDU传递的信息里面
包括(Bridge ID、Cost值和Port ID)等信息。只有Root Bridge根桥可以发送BPDU。但是有一种情况
是当一台交换机刚刚启动时,它会认为自己就是根桥并会发送BPDU,直到它收到的BPDU中包含比它更小的
Bridge ID时,它才知道自己不是根桥,从而停止发送BPDU。
2、BPDU默认每2秒发送一次,这个值就是HELLO Time,而交换机接收到BPDU只会存储20,这就是Max-ag
e,也就是说如果交换机超过20秒没有收到BPDU,就会判断原来的根桥已经死了,它会再次认为自己是根桥
并开始发送BPDU。STP中还有另一个值叫Forward Delay,它的作用就是用来调整 Listening和Learning
状态的时间。
3、修改这些timer值是有很大险的操作,设置错误会导致网络瘫痪掉,所以一般情况下不建议修改这些值。
如果一定要修改的话,也不建议直接修改某个值,建议使用Diamater指令让系统自动修改。Diamater会根
据网络中从一端到另一端最多要经过多少交换机来进地判断。
关于PortFast、UplinkFast、BackboneFast
1、PortFast是为了让接入的非交换机设备快速进入转发(Forwarding)状态。假如一台Server接入到了
交换机,与交换机连接的是Server的网卡,这个接入是不会改变交换机的STP拓扑的。但默认情况下,接入
Server或Server有重启等操作后,端口都要再次经历Blocking–Listening–Learning–Forwarding这
个过程,这对于网卡设备是没有必要的,所以Cisco交换机可以开始PortFast功能,跳过Listening和Lear
ning,直接进入Forwarding状态,这可以使服务器网络快速上线。 开启了PortFast的端口,如果检测到接
入的是一台Switch,就会按正常的顺序走Listening–Learning–Forwarding的过程,如果检测到是非交
换机,就会让端口快速进入Forwarding状态。
● 只开启某个端口
SW(config)#interface ethernet 0/1
SW(config-if)#spanning-tree portfast
● 全局开启
SW(config)#spanning-tree portfast default
2、UplinkFast
以下图为例,在这个生成树实例中,CoreSW02的e0/0处于转发状态,e0/1是Bloking状态。侧如e0/0突然
出现故障,根桥会重新计算STP拓扑启用e0/1,根据前面我们学习的内容可以知道要将e0/1从blocking转
到Forwarding这个时间需要30秒。对于一个实际使用的网络来说,这30秒的中断可能是不可接受的。那么,
通过开启UplinkFast,可以将当前Blocking端口e0/1设置为Standby状态,这时当root port死掉以后,
Standby的端口就会立刻转成Forwarding状态。避免了30秒的中断。
● 开启方式如下:
SW(config)#spanning-tree uplinkfast
3、BackboneFast
如下图,如果CoreSW01与CoreSW03之间的链路中断,CoreSW02是不知道的,它要接收由CoreSW03发送的
数据扔是等待经过CoreSW01传过来的这条路径。直到STP重新计算完毕,这又造成了几十秒的中断。如果开
启了BackboneFast,当发现收不到BPDU时就会主动在Root port上主动发送一个RLQ(ROOT LINK QUERY)
,通知根桥刚才没收到BPDU。如果没有收到根桥的回复,就认定这条链路真的断了,它就会立刻重新计算ST
P,从而省掉了标准过程当中的20秒,再配合UplinkFast,甚至可以无中断的跳过root port。
Root Guard和BPDU Guard
当STP拓扑建立好以后,需要一些手段来进行保护,尤其是防止现有的STP拓扑和各Switch的角色被新接入
的设备抢过去,这样会造成网络中断甚至瘫痪。这时就需要Root Guard和BPDU Guard登场了。
1、Root Guard
Root Guard可以使STP免受Bridge Priority小的新接入的Switch抢了现有根桥的位置。开启后,当有一
个新接入的交换机的Bridge Priority比现有根桥小时,这个端口会被置于Root Inconsistent状态,它
会被Block掉而不会转发和接收任何数据。
● 开启方式如下:
SW(config)#interface ethernet 0/1
SW(config-if)#spanning-tree guard root
2、BPDU Guard
BPDU Guard比Root Guard更加严格,只要收到BPDU Message,无论它是不是要成为Root Bridge,都立
刻把此端口变成Err Disable。这种情况下,只要有一个新的交换机接入,该端口就会被马上ErrDisable。
● 开启方式如下:
SW(config)#interface ethernet 0/1
SW(config-if)#spanning-tree bpduguard enable