生成树之STP
STP目的
STP:生成树协议,旨在将一个环型网络结构修剪成一个树型的结构,达到防环的作用
STP的步骤
STP有如下几个步骤,选举出四种角色,共同构建起STP生成树
1、开启生成树的交换机,会互相发送BPDU
2、交换完BPDU信息之后,在通过SPA算法,确定这个网络中存在像下图这样的环路,就会开始选举一个交换机为根桥
3、选举出根桥后,会根据哪个端口离根桥最近的基本原则,去选举出根端口(RP)
4、选举出根端口后,在每一条STP链路上,会选举出指定端口(DP)
5、全部的端口都已经基本确定,接下来将没有生成树角色的端口进行阻塞掉即可(Block)
STP中的角色
STP中选举的过程中,诞生出了几种端口角色和交换机角色
交换机角色:根桥ROOT,端口角色:根端口(RP),指定端口(DP)
根桥的产生
先来了解一下根桥的产生,在互相发送BPDU的信息中,存在着每台设备的Bridge ID,也就是桥id
选举根桥的时候,会优先比较桥id,桥id更小的成为根桥
若是桥id一致时,则会比较优先级,优先级越小的成为根桥,同时根桥是可以由我们手动进行配置的,但优先级必须是4096的整数倍
手动修改交换机STP优先级命令如下
spanning-tree mode stp //开启生成树,并配置其模式为stp
spanning-tree priorit ? //查看优先级范围,结果显示只能为4096的整数倍<0-61440> Bridge priority in increments of 4096 (default value: 32768)
spanning-tree priorit 4096 //配置优先级为4096
如果再不济,优先级相同的话,可以比较MAC地址,MAC地址更小的则成为根桥
MAC地址可以通过show sysmac查看
根端口(RP)的产生
在表面上来看,根端口的产生是根据在非根交换机上哪个端口离根交换机最近的
实际上,这句话的信息量很大,1、根端口是产生于非根交换机上,而不会产生根交换机上
2、离根交换机最近,就需要看几个方面,①收到BPDU的cost值,即该端口去往根交换机所产生的开销,当然,开销越小,大多数离的越近
注意,这里不是普通的cost值,而是端口接收BPDU的cost值
如下图,通过计算开销得知,当然是①和②端口成为根交换机
当然,我们可以手动地去修改端口接收BPDU的cost值
int g0/1 //进入端口
spanning-tree cost ? //查看g0/1接收BPDU的cost值的范围 <1-200000000> Port path cost
如果将接收BPDU的cost值改为一致,就需要比较在收到BPDU报文中桥id值,根据越小越优先的原则,桥id值最小的BPDU的接收端口将成为根端口(RP),其实某种意义上,这样的方式,也是变相地决定了桥id值最小的是离根交换机最近的端口,因为本身根桥的桥id就是最小的,所以哪个端口最先收到这个BPDU报文,哪个端口就是离根交换机最近的端口
当然,前面我们在选举根桥的时候就遇到了桥id一致的情况,这时就要看我们BPDU的端口id了,即端口优先级,依然是越小越优先的原则,哪个端口的端口id越小,则哪个端口就将成为根端口(RP)。同样地,端口id/端口优先级的数值也是可以进行配置的,但需要注意的是端口id只能是16的整数倍
int g0/1 //进入g0/1端口,更改BPDU端口id
spanning-tree port-priority ? //查看端口id可配置范围<0-240> Port priority in increments of 16 (default value: 128) //范围为0-240,且为16的整数倍,默认值为128
指定端口(DP)的产生
在选举完根桥、根端口后,就会开始指定端口的选举,需要注意的是,与前两者不同,指定端口产生的范围是在每个开启STP的链路上
也就是说每个STP的链路上都会选举出一个指定端口,指定端口最重要是通过比较同一条链路上BPDU
与选举根端口的套路相似,也是越小越优先,比较的顺序也相似,只不过,场景变换成了在链路上的端口,而不是在同一台交换机上的端口
1、先比较链路上发送BPDU端口中的cost值,cost较小的发送端口将成为指定端口(DP)
2、若是cost值一致,则比较发送端口发送BPDU的桥id大小,也是根据越小越优先的原则,桥id较小的成为DP
3、最后,若是桥id一致,则在同一条链路上比较端口上发送BPDU的port id,也就是端口id/端口优先级,port id较小的则成为DP
实际上,因为根端口一旦确定,就代表着指定端口也已经确定下来了。因为根端口和指定端口的选举看的东西都是一样的,如cost值、桥id、端口id
Block端口的产生
Block端口即阻塞端口,这就很简单了,那些除了RP和DP的端口,都是被阻塞的端口
RP、DP的作用
前面说了RP、DP是怎么产生的,但是还没有讲它们的作用是怎么样的
RP:是用来接收BPDU报文的
DP:是用来发送BPDU报文的
没错,就是这么的简单!!!
生成树的几个状态
从交换机通过spanning-tree命令开启生成树,到生成树建立完成,或是故障恢复时,交换机一共经历了4个阶段
1、blocking,阻塞阶段。2、listening,监听阶段。3、learning,学习阶段。4、forwarding,转发阶段,这也是表示创建成功的最后一个阶段
其中当出现某条线路故障的时候,生成树因为原本起到了一个阻塞端口的作用,就表示哪个阻塞的端口可以成为备份端口,当网络出现故障的时候,还有备份端口顶上去
其中恢复故障也是需要一定的时间的,从监听到学习MAC地址就要花费30s的时间,而由学习MAC地址表完成则又需要15s的时间
还有一种端口状态为disable,可以理解为STP中最懒的一个端口状态
这五种端口状态除了在不同时期体现出来,还体现在BPDU报文的处理
1、disable状态:不接受、不发送和不监听BPDU报文
2、blocking状态:不接收、不转发数据,接收但是不转发BPDU报文(这叫做持续监听BPDU报文),不会对地址进行学习
监听的目的则是时刻保证生成树的能够重新计算
3、listening:不接受、不转发数据,接收并发送BPDU报文,不会对地址进行学习
端口角色的选举
4、learning:不接受、不转发数据,接收并发送BPDU报文,开始对地址进行学习
5、forwarding:开始接收并转发数据,接收并发哦是那个BPDU报文,对地址进行学习
STP原理
上述说的一切一切都是基于STP所用的算法,即SPA算法
开启STP之后,SPA算法会判断在网络中是否有环路,只有产生了环路,才会进行后续的工作
判断有环路之后,SPA就会使得交换机发送BPDU报文,使得BPDU报文在交换机之间进行交换
各个交换机根据收到的BPDU报文,依据BPDU报文中的各类信息(如桥id,cost值和端口id)进行各类端口角色的选举
SPA和BPDU
BPDU就是由SPA算法进行发送的
上述进行说到BPDU中的桥id、cost值和端口id,实际上,桥id、cost值和端口id就是BPDU报文中包含的信息
桥id:桥id是由MAC地址+交换机开启STP的优先级组成
cost:根路径开销,就是交换机到达根交换机的开销值。这个开销值是依赖于带宽的,带宽越大,开销值就越低
端口id:端口id由端口的优先级和端口的编号所组成
恢复故障时间以及场景
当网络出现故障或是网络拓扑出现变化的时候,生成树才会进行重新的收敛
重新收敛可以理解为交换机重新进行生成树的计算
所以重新收敛的时间=开启生成树接口的时间+接口进入转发状态的时间
而这个重新收敛的时间取决不同的场景,但可以肯定的是至少需要30s的时间,前15s用来从listening状态到learning状态。这个前15s是用来进行各个端口角色的重新选举了,后15s就是从learning状态到forwarding状态,这个后15s使用来学习MAC地址表的
而故障的类型主要分为直连故障和非直连故障
直连故障需要30s的时间来恢复,如下图,这30s就是前面经常提到的listening---->learning的15s+learning ----->forwarding的15s=30s
非直连故障
非直连故障则需要等待50s的恢复时间,即上述说过的重新计算的30s+等待老化时间20s=50s
非直连故障主要在于理解那个老化时间是什么
老化时间,类似于OSPF中的hello时间,因为网络使一个动态的过程,随时都有可能发生变化
所以交换机就是通过老化时间,经过固定的时间后重新了解网络拓扑发生的什么变化
简单来说,交换机也不能闭门造车,也需要看看外面的世界发生了什么
STP配置
STP的配置非常简单,只需要开启生成树,配置优先级即可
SW1(config)#spanning-tree
SW1(config)#spanning-tree mode stp //默认开启的是MSTP
SW1(config)#spanning-treen port-priority ? //查看优先级的配置范围
<0-240> Port priority in increments of 16 (default value: 128)
STP高级特性之postfast端口
postfast端口最主要是针对在生成树当中,交换机与PC相连的接口
由于与PC相连的接口是没有必要列入到生成树的计算当中的,否则将会产生不必要的时间进行运算
还有最重要的一点是,若是下连PC的端口没有配置的portfast端口的话,则会导致下连PC的端口也参与到生成树的计算当中,由于SPA的计算至少需要30s时间,所以会导致用户的上网体验及其不佳
配置的portfast端口之后,则会直接跳过那SPA计算的30s,即直接进入forwarding状态
为什么Portfast端口还会发送BPDU呢?因为portfast端口需要让其它生成树范围内的端口认为这是一个portfast端口
但如果一不小心,将portfast端口加入到与交换机连接的端口的话,由于portfast不会进行生成树的计算
一旦不进行生成树的计算的话,就会容易出现大问题,即产生环路,因为不做生成树配置的端口就相当于普通的端口一样了
所以当一个portfast端口收到了BPDU报文之后,则经过30s(2个forwarding delay时间)后porttfast端口将会重新到生成树的计算当中,即进入forwarding的状态
配置命令
int g0/1
spanning-tree portfast
STP高级特性之BPDU Guard
BPDU Guard意思为BPDU 保护,BPDU保护是针对那些不应该受到BPDU报文的端口,如(portfast端口)
当配置上BPDU Guard端口之后,如果再次收到了BPDU报文之后,就会立即关闭端口,即非人为的shutdown掉端口
并将端口设置为error-disabled状态,意思就是错误地关闭
如果想将error-disabled端口重新开启之后的话,有两种方式,手动和自动
1、手动开启端口,进入端口之后敲no shutdown
2、全局下配置命令
errdisabled recovery interval 300s //将error-disabled的端口经过30s之后重新开启
BPDU Guard端口的配置
1、可以选择全局下配置
spanning-tree portfast bpduguard default
2、在接口下启用BPDU Guard
int g0/1
spanning-tree bpduguard enabled
STP高级特性之BPDU Filter
BPDU Filter最主要的功能是过滤掉接口上收到或发出的BPDU报文
如果将BPDU Filter与portfast端口相互结合,原本还发送BPDU的portfast报文的端口,现在变为即不接收BPDU报文也不发送BPDU报文了
需要注意的是portfast+BPDU Filter的组合,当portfast失效了之后,则BPDU Filter也就失效了
因为portfast端口失效后,就表示开始发送BPD报文了,由于BPDU Filter的作用是过滤收到或发出的BPDU报文,那中不能对自己的BPDU报文进行过滤吧
BPDU Filter端口的配置命令
全局模式下配置
spanning-tree portfast bpdufilter default
接口下配置
int g0/1
spanning-tree bpdufilter enabled
STP高级特性之TC-protection
TC-protection即为TC-BPDU的保护
我们首先需要了解TC-BPDU这种包,TC-BPDU就是一个携带者TC标志的BPDU报文
当交换机收到TC-BPDU报文之后,则表示网络拓扑发生了变化,交换机会进行对MAC地址表项的删除动作,对于三层交换机,还会引发转模块的重新打通,并改变ARP表项的端口状态
知道了TC-BPUD后,就需要了解TC-BPDU报文带来的隐患,若是这个时候,有一台黑客PC机,对SW2不断的发出TC-BPDU报文,则SW2会将不断地重复删除MAC地址表项和引发转模块的重新打通,并改变ARP表项的端口状态的动作,这会使得SW2的CPU负荷迅速地增高
当我们配置上了TC-protection端口之后,交换机会每隔一个固定的时间段(通常是4s),再去进行MAC地址表的删除操作,同时监控该时间段内是否受到了TC-BPDU报文,如果有,则交换机会在改时间超时之后再进行一次删除的操作
如下,由于黑客PC不断发出了TC-BPDU报文,SW2上又配置了TC-protection端口,则SW2每隔4s才会对MAC地址表进行删除
TC-protection端口的配置命令
在全局下配置
spanning-tree tc-protection
STP的实验结果
查看生成树的结果
show spanning-tree summary