28-STP,选举过程、端口状态、计时器、拓扑变化
1.STP选举过程:
STP有三个选举过程:选根桥、选根端口、选指定端口;
选举完成后,剩下的端口会被阻塞;
1)选根桥
根桥只有唯一的一个;(树形结构的有唯一的根节点)
根桥的选举规则:
BID(桥id)最小的成为根桥
BID是STP数据包BPDU中的一个字段;格式为:优先级.mac
先比较优先级在比较MAC
如图:根桥选举过程
有三个交换机;
刚开始三个交换机都认为自己是根桥(也就是发送的BPDU中的根桥id=自己的bid),然后给其它交换机发BPDU;
如SWA和SWB比较:
SWA收到SWB的BPDU后,得到了SWB的PID,用SWB的pid和自己的pid比较
先比优先级SWA的优先级=4096,小于SWB的优先级32768,于是SWA认为自己比SWB优先,不改变根桥id;
如果SWC收到SWB的BPDU,则是先比优先级 ,都是32760,然后比mac地址,SWB的mac地址较小,因此SWC认为SWB是根桥,改变自己的根桥id;
交换机之间经过一次交互之后,最终选举出了唯一的根桥;
2)选根端口
根端口是非根桥上的端口;
根端口是交换机到达根桥交换机最近的端口,也就是Root Path Cost最小的端口;
根端口选举规则:
1】 先比较端口的根路径开销Root Path Cost(RPC = 端口收到的BPDU中的RPC + 端口所属链路的Path Cost)
2】如果交换机有多个端口的RPC相等,则比较对端BID;
对端BID是指交换机接口收到的BPDU中的BID;
例如下图中SWB的g0/0/2端口连交换机SWC,会收到SWC的BPDU,SWB的对端BID,就是交换机SWC的BID = 32768.00-01-02-04-cc
3】如果对端BID也相等,则比较对端PID(端口id);
对端bid相等的情况:交换机的两个端口都接在同一个对端交换机上;
例如,SWB的g0/0/2端口 收到SWC的g0/0/2端口发过来的BPDU,对端PID就是g0/0/2(SWC的2号端口)
4】如果对端PID也相等则比较本端PID大小;
对端pid相等的情况:从对端交换机拉一根线接集线器,然后交换机的两个接口连在集线器上;
(先看RPC在看对端BID,最后比较对端PID和本地PID)
验证根端口选举结果命令:
dis stp brief
可以看到:交换机的g0/0/2端口是根端口,g0/0/1端口是预备端口;
3)选举指定端口
指定端口决定了数据的转发方向;
对交换机而言:根端口接收来自根桥的数据,然后从指定端口转发出去;(也就是说根端口用来接收数据,指定端口用来发送数据)
正常情况下根桥交换机的所有端口都是指定端口(除了自环端口,也就是用一根线连交换机的两个端口);
因为根桥的端口的根路径开销为0,是最小的;
指定端口选举规则:(越小越优先)
1】首先比较根路径开销
2】如果RPC相同则比较BID
3】RPC和BID都一样,比较PID
如下图:
SWA-SWB链路的指定端口选举:
这条链路中有两个端口:SWA的g0/0/1端口、SWB的g0/0/1端口;要从这两个端口中选出指定端口;
首先比较根路径开销,因为SWA是根桥,SWA的g0/0/1端口根路径开销是0,SWB的g0/0/1端口小;
SWA的g0/0/1端口被选为这条链路的指定端口;
SWB-SWC链路的指定端口选举:
这条链路中有两个端口:SWB的g0/0/2端口、SWC的g0/0/2端口;
首先比根路径开销,RPC都是2000;
然后比较BID,BID包括优先级和mac地址,的优先级都是32768,于是比较mac地址,SWB的BID中的mac地址较小;
因此SWB的SWB的g0/0/2端口被选为了这条链路的指定端口;
SWC的g0/0/2端口既不是指定端口,也不是根端口,因此成为预备端口,将被阻塞;
导致的结果是,数据包在转发时将不会从SWB转发到SWC;
没有被选为根端口和指定端口的就是预备端口,将会被阻塞;
例如上图中SWC的g0/0/2口就是预备端口;
2.STP的端口状态
STP端口状态
|
接收BPDU
|
转发BPDU
|
学习MAC
|
转发数据
|
过渡状态
|
稳定状态
|
Disabled禁用
|
×
|
×
|
×
|
×
|
×
|
√
|
Blocking阻塞
|
√
|
×
|
×
|
×
|
×
|
√
|
Listening监听
|
√
|
√
|
×
|
×
|
√
|
×
|
Learning学习
|
√
|
√
|
√
|
×
|
√
|
×
|
Forwarding转发
|
√
|
√
|
√
|
√
|
√
|
√
|
华为设备STP和RSTP端口状态的显示有所不同:(RSTP将端口状态缩减成三个)
STP端口的状态解释:
1】禁用 disable 未开启STP协议
2】阻塞 blocking 接收BPDU(端口处于阻塞状态时,可以收数据,但不能转发)
3】侦听 listening 接收BPDU 转发BPDU
4】学习 learning 接收BPDU 转发BPDU 学习MAC地址
5】转发 forwarding 接收BPDU 转发BPDU 学习MAC地址 转发用户流量
查看端口状态的命令:
dis stp brief
3.STP的计时器:
STP数据包BPDU中的最后4个字段用做计时器;
计时器
|
备注
|
Hello
|
默认2S,根桥发送BPDU的间隔
|
Forwarding Delay
|
默认15S,stp端口listening和learning状态的持续实际(监听到学习需要15S,学习到转发需要15S)
|
MSG Age
|
当前的年龄,每经过一个设备就加1(从根桥开始为0往下算),最大为20,超过20则丢弃BPDU.(不建议接太多设备影响交换机性能)
|
Max Age
|
20S,保持阻塞的最大时间(每2秒收到一次BPDU,若20秒没收到就不再阻塞,开始侦听、学习、转发)
|
一个预备端口从阻塞状态到转发状态的时间:50S
STP的端口状态转换:
4.STP拓扑变化的恢复时间
STP稳定后,根桥会周期性发送BPDU(2s一次);
如果发生一些故障或更改了配置,STP需要时间重新恢复到稳定状态;
1)根桥故障
如图,SWA为根桥,当SWA挂掉后:
SWB和SWC的根端口将收不到根桥的BPDU;
等待20s(Max Age 默认20s)之后,BPDU老化,开始重新选举根桥;
选出新根桥后,交换机端口还要listening和learning状态各15s(Forwarding Delay默认15s)
也就是说至少要等 20s + 15s + 15s = 50s 之后才能恢复到stp稳定状态;
根桥故障需要等待50S,网络才会恢复正常(20S老化时间和30S变成转发状态)
2)直连故障
如图,SWB的根端口挂掉时:
SWB需要重新选根端口,也就是备用端口会选举成根端口;
备用端口的状态变化:阻塞-帧听-学习;
侦听和学习状态各保持15s,至少需要30s才恢复稳定状态;
直连链路故障可能需要等待30S(检测到自己的链路与根桥断了,立马将预备端口从阻塞状态变成转发状态需要经过2个forwarding delay)
3)非直连故障
如图,SWB的接口发生故障,对SWC而言:
SWC感觉不到SWB的故障;
SWB没收到根桥SWA的BPDU,于是认为自己是根桥,给SWC发送BPDU;
同时,SWA也给SWC发送BPDU;
SWC经过比较,SWA和SWB 的BID,还是得出根桥为SWA;
SWC的左接口由于收不到根桥SWA的BPDU,将在等20s之后不再阻塞;
从阻塞状态变成转发状态,中间会经过帧听、学习两个阶段,各保持15s;
最终耗时 = 20s + 15s + 15s = 50s;
(当非直连设备故障后,收到对端发来的BPDU并不是最优的,接收但不会改变该角色,等到老化时间在会改变角色状态)
5.拓扑变化对MAC地址表的影响
如图:
正常情况下,链路走的是:SWB-SWA-SWC;SWC的g0/0/2端口被阻塞;
此时SWB的mac地址表中记录:mac地址aa对应3口,bb对应1口;
如果SWC的1口挂掉,stp需要恢复到稳定状态,swc的2口作为备用口不再阻塞 ;
对于SWB而言,这是非直连故障,恢复耗时50s;
但mac地址表的老化时间为300s,导致了链路已经变化的情况下,SWB的mac地址表没能及时更新;
导致的结果是主机A发给主机B的数据依然从SWB的1口转发出去给SWA,但此链路不通数据发不过去;
解决办法只有:等待300s让mac表老化,或者清空主机A的arp缓存让SWB的mac地址表更新;
但300s对于业务来说太久了;
(MAC地址表老化太长,链路角色变换,但是MAC地址还是原来(要么等待300S或ARP老化))
解决方法:
为了让链路中交换机的mac地址表和链路变化保持同步:
1】SWC检测到1口的故障,发送一个TCN包给SWB,告诉上游交换机,这边出现拓扑变化;
BPDU包的第三个字段为BPDU Type,用来表示BPDU类型,这里指定为TCN;
2】上游交换机SWB收到后会给SWC发送一个TCA表示收到了SWC的TCN(SWC会周期性发送TCN,直到收到确认的TCA)
3】SWB同样给上游交换机SWA发送TCN,直到收到SWA的TCA;
4】SWA是根桥,收到下游的TAN后会向下游交换机发送TC;
TC的作用是,通知下游交换机,将其mac地址表的老化时间从300s改为15s;
6.总结
总之STP可以在保证可靠性的同时避免环路,但有个缺点就是慢;
因为链路变化,反应时间至少30s,对于业务来说太慢了;
为了提高STP的速度,产生了RSTP技术;
7.STP的配置
命令
|
备注
|
Stp mode stp
|
调整STP的模式,默认MSTP
|
Stp priority 4096
|
调整BID优先级值,0~61440,选值4096的倍数
|
Stp root primary / secondary
|
自动修改优先级,指定主/备根桥
|
Stp pathcost-standard
( dot1q-1998 | dot1q | legacy )
|
配置计算路径开销值得标准
|
开销标准
|
Legacy标准:cost=1~200000,华为私有
802.1d标准:cost=1~65535
802.1t标准:cost=1~200000000,默认选则
|
Stp cost 10
|
修改STP开销
|
Stp port priority 144
|
修改PID优先级,0~240,选值16的倍数
|
Display stp brief
|
显示STP配置信息和参数
|