您的位置:首页 > 编程语言 > PHP开发

STP生成树协议简单算法实现分析

2013-03-06 15:50 309 查看
以下借鉴了H3C的一篇文章,对其重新进行了整理,方便刚学STP生成树协议的朋友便于理解。

另外一个更加文章的说明文档大家可以下载:STP生成树协议原理与算法简析。以下文章是从该文档中摘取的,因为太长所以只摘取了一部分。

转载请注明:http://blog.csdn.net/shanzhizi

现在分析一下STP算法的实现,纯理论的讲算法过于枯燥,这儿以三台全互连的交换机为例描述一下实现过程。(注:关于状态机的标准实现可以参考IEEE.802.1D,这里只用容易理解的语言描述整个过程,可能有细节说法上不太规范,但更方便理解。)



为了描述方便,这里指比较BPDU的前四项:根桥ID(以以太网交换机的优先级表示),根路径开销,指定交换机ID(以以太网交换机的优先级表示),指定端口ID(以端口号表示)。

假设SWA,SWB,SWC的桥优先级分别为0,1,2。各链路开销为2,3,6。这里要特别说明一点:Root Path Cost不是一个可配置项,即它是由交换机根据Port Path Cost比较而累积得出的,Port Path Cost才是一个可配置的选项。图中的链路开销可理解为2端端口的Port Path Cost,只不过它们恰好相同而已。

(1)初始状态

各台交换机的各个端口在初始时会生成以自己为根的配置消息,根路径开销为0,指定交换机ID为自身交换机ID,指定端口为本端口。

Switch A:

端口AP1配置消息:{0,0,0,AP1}

端口AP2配置消息:{0,0,0,AP2}

Switch B:

端口BP1配置消息:{1,0,1,BP1}

端口BP2配置消息:{1,0,1,BP2}

Switch C:

端口CP2配置消息:{2,0,2,CP2}

端口CP1配置消息:{2,0,2,CP1}

(2)选出最优配置消息

各台交换机都向外发送自己的配置消息。当某个端口收到比自身的配置消息优先级低的配置消息时,交换机会将接收到的配置消息丢弃,对该端口的配置消息不作任 何处理。当端口收到比本端口配置消息优先级高的配置消息的时候,交换机就用接收到的配置消息中的内容替换该端口的配置消息中的内容。然后以太网交换机将该 端口的配置消息和交换机上的其它端口的配置消息进行比较,选出最优的配置消息。

配置消息的比较原则是:

树根ID较小的配置消息优先级高;若树根ID相同,则比较根路径开销,比较方法为:用配置消息中的根路径开销加上本端口对应的路径开销之和(设为S),则S较小的配置消息优先级较高;若根路径开销也相同,则依次比较指定交换机ID、指定端口ID、接收该配置消息的端口ID等。为便于表述,本例中假设只需比较树根ID就可以选出最优配置消息。

(3)确定根端口,并阻塞冗余链路,然后更新指定端口的配置消息。

交换机接收最优配置消息的那个端口定为根端口,端口配置消息不作改变;其它端口中,如果某端口的配置消息在过程“选出最优配置消息”中更新过,则交换机将 此端口阻塞,端口配置消息不变,此端口将不再转发数据,并且只接收但不发送配置消息;如果某端口的配置消息在过程“选出最优配置消息”中没有更新过,则交换 机就将其定为指定端口,配置消息要作如下改变:树根ID替换为根端口的配置消息的树根ID;根路径开销替换为根端口的配置消息的根路径开销加上根端口对应 的路径开销;指定交换机ID替换为自身交换机的ID;指定端口ID替换为自身端口ID。http://blog.csdn.net/shanzhizi

例子中各台交换机的比较过程如下:

Switch A:

端口AP1收到Switch B的配置消息,Switch A发现本端口的配置消息优先级优于接收到的配置消息的优先级,就把接收到的配置消息丢弃。端口AP2的配置消息处理过程与端口AP1类似。Switch A发现自己各个端口的配置消息中树根和指定交换机都是自己,则认为自己是树根,各个端口的配置消息都不作任何修改,以后周期性的向外发送配置消息。此时两个端口的配置消息如下:

端口AP1配置消息:{0,0,0,AP1}。

端口AP2配置消息:{0,0,0,AP2}。

Switch B:

端口BP1收到来自Switch A的配置消息,经过比较后Switch B发现接收到的配置消息的优先级比端口BP1的配置消息的优先级优,于是更新端口BP1的配置消息。

端口BP2收到来自Switch C的配置消息,Switch B发现该端口的配置消息优先级优于接收到的配置消息的优先级,就把接收到的配置消息丢弃。

则此时各个端口的配置消息如下:端口BP1配置消息:{0,0,0,AP1},端口BP2配置消息:{1,0,1,BP2}。

Switch B对各个端口的配置消息进行比较,选出端口BP1的配置消息为最优配置消息,然后将端口BP1定为根端口,这个过程中端口BP2的配置消息没有更新过,则将端口BP2定位指定端口。整台交换机各个端口的配置消息都进行如下更新:根端口BP1配置消息不作改变:{0,0,0,AP1}。端口BP2配置消息中,树根ID更新为最优配置消息中的树根ID,根路径开销更新为2,指定交换 机ID更新为本交换机ID,指定端口ID更新为本端口ID,配置消息变为:{0,2,1,BP2}。然后Switch B各个指定端口周期性向外发送自己的配置消息。

Switch C:

端口CP2先会收到来自Switch B端口BP2更新前的配置消息{1,0,1,BP2},Switch C触发更新过程,更新后的配置消息如下:{1,0,1,BP2}。

端口CP1收到来自Switch A的配置消息{0,0,0,AP2}后Switch C也触发更新过程,更新后的配置消息如下:{0,0,0,AP2}。

经过比较,端口CP1的配置消息被选为最优的配置消息,端口CP1就被定为根端口;而端口CP2就会被选为指定端口,并发送更新后的BPDU:{0,6,2,CP2}

接着端口CP2会收到Switch B更新后的配置消息{0,2,1,BP2},由于收到的配置消息比原配置消息优,则Switch C触发更新过程,更新后的配置消息为:{0,2,1,BP2}。

同时端口CP1收到来自Switch A配置消息,比较后Switch C不会触发更新过程,配置消息仍然为:{0,0,0,AP2}。

经过内部比较,( CP1{0,6,0,AP2},CP2{0,5,1,BP2} )端口CP2的配置消息被选为最优的

配置消息,端口CP2就被选为根端口,端口CP1的配置消息因为更新过,所以端口CP1就被阻塞,状态稳定后,不接收从Switch A转发的数据,直到新的情况触发生成树的计算,比如从Switch A到Switch C的链路down掉,或者端口收到更优的配置消息。

以上只供初学STP生成树协议的朋友参考,能力有限,如有错误敬请谅解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STP 生成树协议