在L2网络(数据链路层)中,为避免某台网络设备故障导致网络中断,常常会使链路冗余,如下图所示:
当某一链路故障或单台交换机故障时,网络通信不会因此中断。但由此引入另一个问题–桥接环,即当所有设备、链路都是正常的时候,由主机1发给主机2的报文将在两台设备(5,6)之间形成广播风暴。原理是L2交换机在收到报文时,若找不到目的Mac将在除了接受端口外的其他端口广播,而3、4只是中继器,当主机2的应答报文因为各种原因没有到达交换机5、6时,原报文将在网络内无限的广播下去。
为解决桥接环的问题,出现了生成树协议:Spanning Tree Protocol。其核心思想是,先在网络中的所有交换机中选择一个根节点。其他交换机中,将到根节点花费最短的端口成为根端口,只有根端口允许学习报文mac地址并转发,非根端口禁止转发,这样网络中的所有交换机构成一个树形结构,网络内的报文交换都是沿着树形转发,可避免环路的产生。原理我都懂,但是今天看书时,突然对网络拓扑中所有交换机节点选取根节点的实现感兴趣了。协议只定义了主要思想和接口,具体实现是由各大网络设备商自己倒腾的。百度一下,网上也是一堆的1、2、3,都是只拿协议说事。忍不住好奇,想着如果自己实现,该怎么弄,声明以下想法未经实践验证。
前提:
- 每个设备都不知道整个网络拓扑,最初设备只知道自己。
- 根据S