STP(生成树协议)研究(2):STP拓扑计算、STP拓扑变化

STP的拓扑计算

网络中所有的设备使能STP协议后,每一台设备都认为自己是根桥(即使能后每台设备都周期性发出配置BPDU,里面的RID是自己的BID)。此时,每台设备仅仅收发配置BPDU,而不转发用户流量,所有的端口都处于Listening状态。所有设备通过交换配置BPDU后,进行选举工作,选出根桥、根端口和指定端口。

1、STP算法实现的基本过程

首先说明一点,STP算法的实现是通过交互配置BPDU实现的,确切地说是通过配置BPDU中的4个字段实现的,它们分别是RID、RPC、发送者BID和发送端口PID。这4个字段构成了消息优先级向量{RID、RPC、发送者BID、发送端口PID},用来标识配置BPDU的优先级

下面看STP算法实现的基本过程(即计算机是怎么选出根桥、根端口和指定端口的)。

(1)初始状态

由于每个桥都认为自己是根桥,所以在每个端口所发出的BPDU中,RID字段都是用各自的BID,RPC字段是0,发送者BID是自己的BID,发送者PID是发送该BPDU端口的PID。

(2)选择根桥(务必细读HedEx/S5700/特性描述)

网络初始化时,网络中所有的STP设备都认为自己是“根桥”,RID字段为自身的BID。通过交换配置BPDU报文,设备之间比较RID字段,值最小者被选为根桥。

总之,从直观角度看(人为判断),根桥的选举规则是:BID最小的交换机成为根桥

(3)选择根端口和指定端口(务必细读HedEx/S5700/特性描述)

根端口和指定端口的选择过程如下:

步骤1:非根设备将接收最优配置BPDU报文的那个端口定为根端口。(最优配置BPDU报文的选择过程附后)

步骤2:设备根据根端口的配置BPDU和根端口的开销,为每个端口计算一个指定端口配置消息,具体信息如下:

  1. RID,替换为根端口配置BPDU的RID;
  2. RPC,替换为根端口配置BPDU的RPC与根端口开销相加之和
  3. 发送者BID,替换为自身设备的BID;
  4. 发送端口PID,替换为自身端口PID。

步骤3:设备将计算出的指定端口配置消息与角色待定端口自己的配置消息进行比较:

  1. 如果计算出的指定端口配置消息更优,则该端口被确定为指定端口,其配置消息也被计算出的配置消息替换,并周期性向外发送;
  2. 如果该端口自己的配置消息更优,则将该端口阻塞,并且不更新该端口的配置消息。该端口将不再转发数据,且只接收不发送配置消息。

最优配置消息的选择过程:

步骤1:每个端口将收到的配置消息与自己的配置消息进行比较:

  1. 如果收到的配置消息优先级较低,则将其直接丢弃,对自己的配置消息不进行任何处理;
  2. 如果收到的配置消息优先级较高,则用该配置消息的内容将自己配置消息的内容替换掉。

步骤2:设备将所有端口的配置消息进行比较,选出最优的配置消息。(需要特别注意的是,在比较RPC时一定要在原配置BPDU的RPC基础上加上本端口的开销。这在后面的STP算法实现案例中有涉及)

总之,从直观角度看(人为判断),根端口的选举规则是:依次比较各端口的RPC、发送者BID、发送端口PID和接收端口PID,较小者对应的端口成为根端口;指定端口的选举规则是:依次比较所在交换机的RPC、所在交换机的BID和本端口的PID,较小者对应的端口成为指定端口。

 

2、STP算法实现案例

一旦根桥、根端口和指定端口选举成功,整个树形拓扑就建立完毕了。下面结合案例说明STP算法实现的具体过程。

 

如上图所示,交换机A、B、C的优先级分别为0、1和2, A与B之间、A与C之间以及B与C之间链路的路径开销分别为5、10和4(即它们相连接口的开销依次为5、10、4)。依据比较规则,我们能够直接判断出根桥和端口角色,即…。但是对于计算机/电子设备来说,它不能直接判断出来,它必须按照一定的算法计算出根桥和端口角色。

(1)各设备的初始状态

设备

端口名称

端口的配置消息

DeviceA

Port A1

{0,0,0,Port A1}

Port A2

{0,0,0,Port A2}

DeviceB

Port B1

{1,0,1,Port B1}

Port B2

{1,0,1,Port B2}

DeviceC

Port C1

{2,0,2,Port C1}

Port C2

{2,0,2,Port C2}

注意:为了方便,这里用优先级代替了BID,但实际上BID是由优先级和MAC构成的。

(2)各设备的比较过程及结果

 

 

设备

比较过程

比较后端口的配置BPDU

A

  1. Port A1收到Port B1的配置消息{1,0,1,Port B1},发现自己的配置消息{0,0,0,Port A1}更优,于是将其丢弃。
  2. Port A2收到Port C1的配置消息{2,0,2,Port C1},发现自己的配置消息{0,0,0,Port A2}更优,于是将其丢弃。
  3. DeviceA发现自己各端口的配置消息中的根桥和指定桥都是自己,于是认为自己就是根桥,各端口的配置消息都不作任何修改,此后便周期性地向外发送配置消息。

Port A1:{0,0,0,Port A1}

Port A2:{0,0,0,Port A2}

B

  1. Port B1收到Port A1的配置消息{0,0,0,Port A1},发现其比自己的配置消息{1,0,1,Port B1}更优,于是更新自己的配置消息。
  2. Port B2收到Port C2的配置消息{2,0,2,Port C2},发现自己的配置消息{1,0,1,Port B2}更优,于是将其丢弃。

Port B1:{0,0,0,Port A1}

Port B2:{1,0,1,Port B2}

  1. DeviceB比较自己各端口的配置消息,发现Port B1的配置消息最优,于是该端口被确定为根端口,其配置消息不变
  2. DeviceB根据根端口的配置消息和路径开销,为Port B2计算出指定端口的配置消息{0,5,1,Port B2},然后与Port B2本身的配置消息{1,0,1,Port B2}进行比较,发现计算出的配置消息更优,于是Port B2被确定为指定端口,其配置消息也被替换为计算出的配置消息,并周期性地向外发送

根端口Port B1:{0,0,0,Port A1}

指定端口Port B2:{0,5,1,Port B2}

C

  1. Port C1收到Port A2的配置消息{0,0,0,Port A2},发现其比自己的配置消息{2,0,2,Port C1}更优,于是更新自己的配置消息。
  2. Port C2收到Port B2更新前的配置消息{1,0,1,Port B2},发现其比自己的配置消息{2,0,2,Port C2}更优,于是更新自己的配置消息。

Port C1:{0,0,0,Port A2}

Port C2:{1,0,1,Port B2}

  1. DeviceC比较自己各端口的配置消息,发现Port C1的配置消息最优,于是该端口被确定为根端口,其配置消息不变
  2. DeviceC根据根端口的配置消息和路径开销,为Port C2计算出指定端口的配置消息{0,10,2,Port C2},然后与Port C2本身的配置消息{1,0,1,Port B2}进行比较,发现计算出的配置消息更优,于是Port C2被确定为指定端口,其配置消息也被替换为计算出的配置消息

根端口Port C1:{0,0,0,Port A2}

指定端口Port C2:{0,10,2,Port C2}

  1. Port C2收到Port B2更新后的配置消息{0,5,1,Port B2},发现其比自己的配置消息{0,10,2,Port C2}更优,于是更新自己的配置消息。
  2. Port C1收到Port A2周期性发来的配置消息{0,0,0,Port A2},发现其与自己的配置消息一样,于是将其丢弃。

Port C1:{0,0,0,Port A2}

Port C2:{0,5,1,Port B2}

  1. DeviceC比较Port C1的根路径开销10(收到的配置消息中的根路径开销0+本端口所在链路的路径开销10)与Port C2的根路径开销9(收到的配置消息中的根路径开销5+本端口所在链路的路径开销4),发现后者更小,因此Port C2的配置消息更优,于是Port C2被确定为根端口,其配置消息不变
  2. DeviceC根据根端口的配置消息和路径开销,为Port C1计算出指定端口的配置消息{0,9,2,Port C1},然后与Port C1本身的配置消息{0,0,0,Port A2}进行比较,发现本身的配置消息更优,于是Port C1被阻塞,其配置消息不变。从此,Port C1不再转发数据,直至有触发生成树计算的新情况出现,譬如DeviceB与DeviceC之间的链路down掉。

阻塞端口Port C1:{0,0,0,Port A2}

根端口Port C2:{0,5,1,Port B2}

 

从这个STP算法实现案例中,我们能够看出以下几点:

  1. 虽然我们在表述时经常说先选出根交换机再确定端口角色,但是根交换机的选举与端口角色的选举都是在STP算法中实现的,都是通过在交互配置BPDU的过程中实现的。从宏观上看,它们是在同一过程中完成的。但为了便于人为判定根交换机和端口角色,我们通常分开来看
  2. 在执行STP算法过程中,根交换机和端口角色并不是一下就确定下来的,而可能出现反复和变化。但最终根交换机和端口角色会按照比较规则确定下来

 

3、拓扑稳定之后

拓扑稳定后,根桥仍然按照Hello Timer规定的时间间隔发送配置BPDU报文,非根桥设备从根端口收到配置BPDU报文,通过指定端口转发。如果接收到优先级比自己高的配置BPDU,则非根桥设备会根据收到的配置BPDU中携带的信息更新自己相应端口存储的配置BPDU信息。

 

4、拓扑发生变化

(1)拓扑变化重新收敛(过程及时长)

说明:拓扑发生变化,标准STP如何处理以及时长,务必详读IA课件STP;RSTP是如何缩短这一时长的,务必详读IP课件RSTP。(熟记每一个案例拓扑)---非常重要

1)根桥故障案例

在稳定的STP拓扑里,非根交换机会定期收到来自根桥的配置BPDU报文。如果根桥发生了故障,停止发送配置BPDU报文,下游交换机就无法收到来自根桥的配置BPDU报文。交换机的每个接口都缓存一个配置BPDU,如果下游交换机一直收不到配置BPDU报文,当Max Age定时器超时后(默认20秒),就会导致接口存储的配置BPDU失效。这时,非根交换机会认为根桥失效了,进而主动发送配置BPDU报文,重新选举新的根桥,重新进行生成树的计算。这个场景中,从根桥发生故障到网络重新收敛大概需要50秒

注意:接口会在缓存的配置BPDU老化后重新进行生成树的计算

2)非直连链路故障案例

如上图所示,SWA和SWB之间的链路发生了某种故障(非物理层故障,交换机不能直接感知到),因此,SWB一直收不到来自SWA的配置BPDU报文。当SWB接口缓存中的配置BPDU的Max Age定时器超时后,SWB会认为根桥SWA失效,并认为自己是根桥,于是开始发送自己的BPDU报文给SWC。在此期间,由于SWC的AP接口也不能收到配置BPDU报文,其MaxAge定时器超时后,SWC会切换AP接口为DP接口并转发来自其根端口的BPDU报文。所以,MaxAge定时器超时后,SWB、SWC几乎同时会收到对方发来的配置BPDU。经过STP重新计算后,SWB放弃宣称自己是根桥并重新确定端口角色。这个场景中,从非直连链路故障到网络重新收敛大概需要50秒

3)直连链路故障案例1

如上图所示,SWA和SWB使用了两条链路互连,其中一条是主用链路,另外一条是备份链路。网络正常收敛之后,如果SWB检测到RP端口的链路发生物理故障(直连链路故障),则其AP端口会迁移到Listening、Learning、Forwarding状态,默认经过30秒变为转发状态。这个场景中,从直连链路发生故障到网络重新收敛大概需要30秒

4)直连链路故障案例2

如上图所示,如果SWB检测到RP端口的直连链路发生故障,则RP端口消失,SWB的所有端口角色重新计算,并把自己当成根桥,端口初始为DP/阻塞,开始通告自己的BPDU。SWC的AP端口收到次优BPDU后不做处理,等到端口缓存的更优BPDU老化超时(20秒)后,重新进行收敛,默认经过30秒后进入转发状态。从直连链路发生故障到网络重新收敛大概需要50秒。

特别说明:在STP中,交换机除指定端口外的其它端口收到次优BPDU都不会做处理

 

总结1:根据以上几个典型案例,拓扑发生改变,网络重新收敛(收敛,即端口状态完成迁移)的时长最大可达到30秒或50秒。

总结2:直连链路故障,重新收敛需要30秒还是50秒,是由SPT算法决定的,并不是说直连链路故障就一定是30秒,也有可能是50秒

 

(2)拓扑变化可能导致MAC地址表错误及解决办法

(回顾之前的“拓扑发生改变可能产生临时环路问题(未引入端口状态机)”)

我们知道,交换机是通过MAC地址表转发数据帧的。如果拓扑发生变化,通过STP算法网络重新进行收敛,端口状态发生迁移,数据在交换机上的转发路径也应该随着发生变化。但缺省情况下,网络重新收敛一般需要30秒或50秒,而MAC地址表项老化需要300秒,因此在网络重新收敛后,这个MAC地址表就是错误的,这个旧的错误的MAC地址表项会影响数据的正常通信。所以,在拓扑发生变化后需要及时更新MAC地址表项。为此,引入了拓扑变化通知机制,通过该机制使网络中的交换机尽快知道拓扑发生了变化,加快MAC地址表更新

下面通过一个案例,详细了解下拓扑变化带来的MAC地址表项错误的问题及解决办法。

  1. 存在的问题(MAC地址表错误导致最长300S的数据转发错误

如上图所示,网络稳定后,SWB与SWC之间的链路被阻塞(假如BID关系是SWA<SWB<SWC),从SWB的MAC地址表中可以看出,SWB通过端口G0/0/3可以到达主机A,通过端口G0/0/1可以到达主机B。如果SWC的根端口产生故障,生成树拓扑重新收敛,在生成树拓扑完成收敛之后,从主机A到主机B的帧就不能到达目的地。这是因为MAC地址表项老化时间是300秒,主机A发往主机B的帧到达SWB后,SWB会继续通过端口GigabitEthernet 0/0/1转发该数据帧,进而在SWA处中断。MAC地址表错误这种情况最长可导致300S的数据转发故障。

  1. 解决办法(笼统地介绍)

当交换机感知到拓扑变化后,通过拓扑变化通知机制,使拓扑改变的信息在整个网络内泛洪,接收到拓扑改变消息的交换机会修改MAC地址表项的生存期为一个较短的数值(STP规定这个较短值为Forward Delay时长),等待一定时间后,再恢复MAC地址表的生存期。

注意:在华为STP实现中,是直接清空MAC地址表,所以不需要改变MAC地址生存期。

(3)拓扑变化通知机制

如上图所 示,当拓扑发生变化后,STP工作过程如下:

1)在网络拓扑发生变化后,下游设备会不间断地向上游设备发送TCN BPDU报文(TCN从RP端口发出,间隔2秒,不受根交换机Hello timer的影响)。

2)上游设备收到下游设备发来的TCN BPDU报文后,只有指定端口处理TCN BPDU报文,其它端口也可能收到TCN BPDU,但不会处理。

3)上游设备会把配置BPDU的Flags的TCA位置1,然后发送给下游设备,当作对TCN的确认,否则下游设备会一直发送TCN报文。

4)同时,上游设备复制一份TCN BPDU报文,向根桥方向发送。

5)重复上述4个步骤,直到根桥收到TCN BPDU报文。

6)根桥收到TCN BPDU报文后,首先发送一个TCA置位、TC置位的配置BPDU报文(TCA置位是用于确认,告诉下游交换机停止发送TCN),泛洪到全网,其它交换机接收到后会将MAC地址表的生存时间修改为Forward Delay时长。(通过实验观察发现,华为STP实现时,将MAC地址表直接清空)

7)之后,根桥持续发送TC置位的BPDU,时间为Forward Delay+Max Age,默认35秒。

 

上述过程中,涉及到了3种重要报文,这里强调一下:

  1. TCN BPDU报文主要用来向上游设备乃至根桥通知拓扑变化。
  2. 置位的TCA标记的配置BPDU报文主要是上游设备用来告知下游设备已经知道拓扑变化,通知下游设备停止发送TCN BPDU报文。
  3. 置位的TC标记的配置BPDU报文主要是上游设备用来告知下游设备拓扑发生变化,请下游设备修改MAC地址表项生存期(华为STP直接清除MAC地址表),从而达到快速收敛的目的。
  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
生成树协议(Spanning Tree Protocol,STP)是用于在网络拓扑中防止环路的协议。而以STP为基础的协议则称为生成树协议。 以下是在Cisco交换机配置STP的示例: 1. 先进入交换机的全局配置模式: ``` switch# configure terminal ``` 2. 启用STP协议: ``` switch(config)# spanning-tree mode <mode> ``` 其中,mode可以是以下之一: - 802.1d:传统STP协议 - 802.1w:快速STP协议 - 802.1s:多实例STP协议 3. 配置优先级: ``` switch(config)# spanning-tree priority <priority> ``` 其中,priority是优先级,取值范围是0到65535,默认值是32768。优先级越低,该交换机STP中的地位越高。 4. 配置端口类型: ``` switch(config-if)# spanning-tree portfast ``` spanning-tree portfast命令用于配置端口的类型。如果一个端口被配置为端口类型,则该端口会在连接时立即转换为转发状态,而不必等待STP协议计算。 5. 配置边缘端口: ``` switch(config-if)# spanning-tree portfast edge ``` spanning-tree portfast edge命令用于配置端口为边缘端口。边缘端口是指连接到终端设备的端口。与普通端口不同,边缘端口不会参与STP计算。 6. 配置BPDU保护: ``` switch(config-if)# spanning-tree bpduguard enable ``` spanning-tree bpduguard enable命令用于启用BPDU保护。如果一个端口接收到BPDU,则该端口会被禁用,以防止环路的产生。 7. 保存配置: ``` switch(config)# end switch# copy running-config startup-config ``` 以上是在Cisco交换机配置STP的示例,其他厂商的交换机配置方式可能会略有不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我就是卧底

若有帮助,欢迎支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值