1、STP的接口状态
(1)禁用(Disable)
该接口不能收发BPDU,也不能收发业务数据帧,例如接口为down。
(2)阻塞(Blocking)
该接口被STP阻塞。处于阻塞状态的接口不能发送BPDU,但是会持续侦听BPDU,而且不能收发业务数据帧,也不会进行MAC地址学习。
(3)侦听(Listening)
当接口处于该状态时,表明STP初步认定该接口为根接口或指定接口,但接口依然处于STP计算的过程中,此时接口可以收发BPDU,但是不能收发业务数据帧,也不会进行MAC地址学习。
(4)学习(Learning)
当接口处于该状态时,会侦听业务数据帧(但是不能转发业务数据帧),并且在收到业务数据帧后会进行MAC地址学习。
(5)转发(Forwarding)
处于该状态的接口可以正常地收发业务数据帧,也会进行BPDU处理。接口的角色需是跟接口或指定接口才能进入转发状态。
2、STP接口状态迁移

3、拓扑变化
(1)根桥故障
如图:

①、当S1发生故障后,S1会停止发送BPDU报文。
②、S2会等待Max Age计时器(20s)超时,从而导致已经收到的BPDU报文失效,又接收不到根桥发送的新的BPDU报文,因此得知从而得知上游出现故障。
③、非根桥会互相发送配置BPDU,重新选举新的根桥。
④、经过选举,将S2作为根桥,S3的端GE 0/0/1端口经过两个Forward Delay(15s)时间恢复转发状态。


⑤、收敛时间:
根桥故障会导致50s左右的恢复时间,等于Max Age加上2倍的Forward Delay收敛时间。
(2)直连链路故障
如图:

S2和S1的GE 0/0/1接口之间出现直连链路故障
其中S1 GE 0/0/1 <-> S2 GE 0/0/1是主用链路
S1 GE 0/0/3 <-> S2 GE 0/0/3是备用链路
①、当交换机S2检测到根端口的链路发生故障,就会备用端口进入流量转发状态


②、端口状态改变:

③、收敛时间:
直连链路故障,备用端口会经过30s后恢复转发状态。
(3)非直连链路故障
如图:

①、S1和S2之间发生了非物理故障,因此S2一直收不到来自根桥S1的BPDU报文,Max Age计时器(默认20s)就会超时,导致已经收到的BPDU报文失效。
②、S2会认为根桥失效,并认为自己是根桥,从而发送自己的配置BPDU给S3,通知S3自己是根桥。
③、S3的预备端口一直收不到包含根桥ID的BPDU,Max Age计时器超时后,端口进入到Listening状态,开始向S2转发从上游发来的包含根桥ID的BPDU。
④、Max Age定时器超市后,S2和S3几乎同时收到对方发来的BPDU,再进行STP重新计算,S2发现S3发送的BPDU更优,就会放弃宣称自己是根桥,并重新确定端口角色。
⑤、端口状态:

S2的GE 0/0/2,从Forwarding变为Blocking -> Listening -> Learning -> Forwarding,端口角色从DP变为RP
S3的GE 0/0/1,从Blocking -> Listening -> Learning -> Forwarding,端口角色从AP变为DP。
⑥、收敛时间:
非直连故障会导致50s左右的恢复时间,等于Max Age加上2倍的Forward Delay收敛时间。
(4)拓扑变化导致MAC地址错误

①、原因:当S1和S3之间的直连链路发生了故障,由于STP的重新计算时间(50s)大于MAC地址的老化时间,
所以在端口状态改变和端口角色重新选举完成后,此时PC1的数据帧还是无法发送到PC3,因为MAC地址表没有改变,从PC1发送的数据帧,S2还是会从GE 0/0/1接口发送。
②、TCN BPDU
所以STP会在网络拓扑发生变化的时候产生TCN BPDU
TCP BPDU的报文格式:
协议标识、版本号和类型
③、拓扑变化
会使用配置BDPU中Flags的TCA和TC位
④、在拓扑变化过程中,根桥通过TCN BPDU报文知道了生成树拓扑发生了故障。根桥生成TC用来通知其他交换机加速老化现有的MAC地址配置。
⑤、S3感知到拓扑变化后,会不间断的向S2发送TCN BPDU报文。

⑥、S2接收到S3发送的TCN BPDU报文后,会把BPDU报文中的Flags的TCA位设置为1,然后发送给S3,告知S3停止发送TCN BPDU报文。

⑦、S2向根桥转发TCN BPDU报文

⑧、S1把配置BPDU报文中的Flags的TC位设置为1后发送,通知下游设备把MAC地址表项的老化时间从300s修改为Forward Delay的时间(默认为15s)。

⑨、最多等待15s之后,S2中的错误MAC地址表就会被清除。S2就能重新开始MAC地址表项的学习和转发。

同理S3也会清空MAC-address
