只要是学过STP协议的都知道,选举根桥的方法,
1.根据switch的优先级来判断,数值越小越有优势。2.根据switch的MAC地址来判断,也是数值越小越有优势。大家也知道这二者是通过BPDU来告知其他switch的。
根据以上两点,我们可以人工计算出根桥。但是有一个问题困扰了我:BPDU是以哪种方式进行发送的呢?广播?那么这样岂不是我们还没有完成stp的全部选举过程,还没有形成无环路的网络topo就已经形成了广播风暴?
下面是自己结合书本的思考,不敢保证正确性:
别个设计协议的人是比我smart,首先,BPDU的发送方式是以组播的方式发送的(我现在还不知道这种方式是如何工作的,但是我知道这种方式的带宽利用率比广播高)。其次,在完成STP的所有选举前,端口并不是处于转发状态(Forwarding)端口的初始状态是被设置成阻塞的(Blocking),这是非常巧妙的,该状态下,端口只接受BPDU和发送初始BPDU(就是以自己的switch ID为发送者ID和根桥ID的BPDU)。不会转发收到的任何帧。这样,就不会形成桥接环路了,但这样,每个switch 也就只知道自己的ID和邻居的ID,那么又是如何实现选举的呢?
但每个switch发送了初始BPDU和接收到邻居的初始BPDU后,进行第一次比较。自己和自己的邻居会得出一个相同的结论:xxx具有最低的网桥ID.这是第一步。以上图为例,B和A,C会得出同样的结论:B有最低的网桥ID,认为B是根桥。
第二步,每个switch 可能有自己的邻居,同时它也可能是别个的邻居。所以在第一步中可能会有几个不同的结论。这时他会比较这几个结论,并得新的结论。以上图为例,F和C,E它们得出的共同结论是:E有最低的网桥ID,认为E是根桥。这时C就有两个结论,所以它比较B和E,得出的结论是B。
第三步,当每个switch完成第二步后,都会向自己的邻居发送最新的结论,这时BPDU中的网桥ID 字段的值就不再是自己了,而是结论的那个ID.
第四步,当邻居收到后会与现有的自己保存的结论进行比较,留下较低ID作为结论,如果之前的ID被替换了就再向邻居通告,如果没有,就不做反应,因为邻居和它有相同的结论。
最后,当所有的switch都完成了比较,都不再发出更新根桥ID的BPDU时,根桥的ID就确定了,而且每个switch中保存的都是一样的。
在整个根桥的选举过程中所有的switch端口都是处于blocking状态的。在开始选举根端口和指定端口的时候,端口的状态才开始转变。而开始转变成listening状态的条件是:交换机将可能将被选举为根端口或指定端口的那些端口的状态转化为listening。开始发送(转发)和接收BPDU.从而加快信息的传输,加快选举过程。
所以第一步:根桥的所有连通的端口一定是指定端口,所以就转变为listening状态,而且,每台switch都会有一个根端口,所以每个switch都会根据自己的情况选出可能的根端口,加入到listening状态。通过一系列的交流和计算,会最终确定各个端口的角色和状态。STP也就完成了收敛。
转载于:https://blog.51cto.com/mintank/971593