如上图所示网络拓扑,如果没有生成树协议,在网络通信开始时,假设PC0向PC1发送一个数据包,交换机S2的MAC地址表中并没有对应的MAC地址,因此会产生ARP洪泛(详情参考交换机自学习算法那篇文章)发送广播帧,由S2的Fa0/1和Fa0/3端口向对端发出。
当S1、S3分别接收到广播帧后,根据同样原理进行广播帧转发。这时网络形成了一个环路,但交换机并不知道这将导致广播帧在环路中永远循环下去。
随着时间增加,广播帧将会越来越多,最终形成网络广播风暴导致网络瘫痪。(对于交换机的运算速度来讲,网络由正常变瘫痪过程中的时间是非常短的)
由上述描述就可以知道,我们需要一套方案去解决这种问题,所以就有了生成树协议。
生成树协议(英语:Spanning Tree Protocol,STP),是一种工作在OSI网络模型中数据链路层的通信协议,基本应用是防止交换机冗余链路产生的环路。用于确保以太网中无环路的逻辑拓扑结构。从而避免了网络广播风暴,大量占用交换机的资源。
与图论中所指的生成树概念一致,目的就是为了破环(将环形图变成树形)。
STP会阻塞备用链路,当正常线路损坏时会启用备用链路。
交换机上默认的STP版本还有多实例生成树(MSTP)、快速生成树(RSTP)等,本文只描述标准版本。
生成树协议核心是生成树算法(Spanning Tree Algorithm,STA),下面对STA算法过程进行描述。
交换机是由网桥演变而来的,在描述生成树算法的时候也指代交换机
STA大致分为三步:
选举条件:网桥ID(BID)最小者当选
BID由以下两部分构成:
优先级范围为0-61440,步长4096,默认值为32768
看到这里可能会有人问,为什么步长恰好是2的12次方即4096?这并不是巧合,因为这里的步长就是VLAN号(VLAN号使用12比特)
BID的比较方法:
根端口(Root Port, RP)的选举是在非根网桥(非根交换机)上的,并且在每个交换机上只能存在一个RP。
RP用于接收根网桥发来的BPDU,也用来转发普通流量。
RP的选举首先考虑BPDU接收端口到根网桥的路径成本最小,其路径成本与链路带宽对应如下(该值不绝对,交换机上可更改)
链路带宽 | 成本值 |
---|---|
4Mb/s | 250 |
10Mb/s | 100 |
16Mb/s | 62 |
100Mb/s | 19 |
1Gb/s | 4 |
10Gb/s | 2 |
如果存在多个端口到根网桥的成本相同时,则比较对端的BID,对端BID小的本机端口则选举为RP。
(注意BID是对端,也就是与参加选举的端口相连的其它交换机的端口,而参与选举的端口是在本交换机上)
如果对端BID也相同,则比较对端的端口ID(PID),同样对端PID小的本机端口选举为RP。
PID参数如下:
(其实还存在一种对端BID与PID都相同的情况,详细请看本文 STA举例部分->其他例子->使用集线器的情况)
在每一个网段上选出一个指定端口(Designated Port,DP)。DP用于转发根网桥发来的BPDU,也用来转发普通流量。
注意:每网段上存在且只能存在一个DP
DP的选举条件如下:
剩余端口成为备用端口(Alternate Port,AP),它们将被阻塞。
网络拓扑如下
按照上文中的步骤
首先选举根网桥
00-01-...
,比其它地址都小,所以S1是根网桥。然后选取根端口
交换机S2的到S1路径上的所有链路都是1Gb/s,所以开销都是4,G0/1到S1的总开销为4,G0/2到S1的总开销为8,G0/3到S1的总开销为12,所以S2的根端口为G0/1。
与此同理,S3根端口为G0/1,S4的根端口的为G0/2(G0/2的对端BID比G0/1对端BID小,二者成本相同)。
S5的根端口为Fa0/1(Fa0/1与Fa0/2的成本相同,对端BID相同,但Fa0/1对端为S4的Fa0/1,端口号小,所以PID小)。
选举指定端口并阻塞备用端口
已知条件如下:
那么下图中S4的RP如红圈所示
有一种特殊情况,使用了集线器,在S4上Fa0/1与Fa0/2链路成本相同,Fa0/3成本比前两者大,并且Fa0/1与Fa0/2对端BID与对端PID相同,此时比较的是本机端口的PID,如下图所示
上述仅对STA最基本的情况进行描述分析,实际网络中的情况更复杂,例如某个网桥(交换机)突然掉线、链路损坏、生成树还未生成时交换机发生故障需重新选举等等。