如果有三台交换机,如下图所示。为了不使其中一条链路宕的情况下,其他的交换机无法传输,所以就两两相连,提高容错率,但是这样就会有一个问题产生,因为会产生广播风暴。而在这种情况下为了不使广播风暴产生,就产生了生成树协议。
STP-Spanning Tree Protocol(生成树协议)
逻辑上断开环路,防止广播风暴的产生。
当线路出现故障,断开的接口被激活,回复通信,起备份线路的作用。
而最终会阻塞哪个端口,是通过最后的生成树算法,算出来的。
生成树的算法:
STP将一个环形网络生成无环拓扑的步骤:
-选择根网桥(root bridge)
【网桥ID:】
-每隔网络只能有一个根桥,根桥具有最低的桥ID,根桥上的所有端口都是指派端口。
-一个网桥ID是由8个字节组成的。(其中头2个字节是标识网络优先级,后6个字节标识网桥的MAC地址)
优先级在出厂的时候默认的都是32768,而优先级的取值范围则是0~65535
网桥的MAC地址简称为“基本MAC地址”也就是“基M”
1.所以选择根网桥,首先先比较优先级,谁的优先级最小就选谁作为根桥。
但是交换机出厂的时候,它们的默认优先级都是32768
2.所以在优先级相同的情况下,就只能看网桥的MAC地址,谁的MAC地址最小小谁就可以作为根桥。
-选择根端口(root ports)
在非根网桥上选择一个到根网桥最近的端口作为根端口
选择根端口的依据是:
1.-根路径成本最低(比的是cost值)
什么是cost值呢,cost值也叫根路径成本。而根路径成本是指非根网桥到根网桥的路径上 所有链路的成本之和。那么交换机C的E0/1的端口的cost值就=路径成本19+路径成本100=cost119
【人为规定:100M的以太网所花费的cost值是19,而10M的以太网所花费的cost值是100】
带宽越大,所花费的cost值就越小。2.-直连网桥的网桥ID最小(比的是Bridge ID)
如上图所示,根网桥是交换机A,根端口就是三个红圈标注的地方,那么交换机D为什么是上面的端口是根端口呢,因为在它的两边直连网桥的优先级相同都是32768的情况下,就比较这两个网桥的bridgeID地址大小,那么明显交换机B的MAC地址小(000d.2810.d100>000d.2805.c100),所以在D上会选择这上边作为根端口。
3.-直连网桥的端口ID最小(比的是Ports ID)
端口ID 的组成:一个字节的端口优先级和一个字节的端口编号组成的。
端口优先级默认是128,范围是0~255. 端口编号实际与端口号有很大的关系。
比如端口f0/2,那么这个f0/2的端口编号就是128.2,而f0/1就是128.1
由于对端的端口ID小,所以F0/3就是根端口。-选择指定端口(designated ports)
在每个网段(与IP无关)上,选择1个指定端口
这个网段指的是交换机之间的链路有几条,也就说每一条链路选定一个指定端口。
-根桥上的端口全是指定端口
-非根桥上的指定端口:
·根路径成本最低cost
·端口所在的网桥的ID值较小bridgeID
·直连网桥的端口ID值较小
从这张图可以看出:1.根桥上的端口全是指定端口,那么交换机A的上和右的两条链路网段上的指定端口就是交换机A的上方向和右方向端口。
-非根桥上的指定端口:1.首先看路径成本cost值,交换机B上方向端口和交换机C右方向上端口的cost值,都是19+19=38,所以没有可比性,跳过,看下一条。
2.看端口所在网桥的bridgeID,结果交换机B的bridgeID小。所以这第三条网段上的指定端口就是交换机B上方向的端口。那么最终交换机C的右方向端口会被阻塞。
最后,根据STP的计算,最终的逻辑结构为无环拓扑。
在生成树已经生成的情况下,第三条链路只能作为备份线路来使用,在正常情况下,是不会转发数据的,除非第一条或者第二条链路宕掉了,那么第三条链路才会启用。
其实它们是通过“桥协议数据单元BPDU”来交换STP信息的。
BPDU:
-Bridge protocol data unit- 桥协议数据单元
使用组播发送BPDU,组播地址为:
01-80-c2-00-00-00
BPDU分为2种类型:
-配置BPDU-用于生成树的计算
开机的时候谁都会发送BPDU来计算阻塞端口,但是当计算配置完成以后,就只有根桥才会每隔2秒发送BPDU,其他的非根桥不会再发送BPDU。
-拓扑变更通告(TCN)BPDU- 用于通告网络拓扑的变化。
只有在拓扑发生改变的时候才会发送TCN的BPDU。
当三台交换机A\B\C互相连接的时候,刚开机,它们都会认为自己根桥,所以都会发送BPDU,而这个BPDU里面的bridgeID就是自己的bridgeID,路径成本处为0,发送网桥ID也是自己的bridgeID,从哪个端口发出去,就记录为哪个端口ID。
如果B发出了BPDU,到了A这里,A发现自己的bridgeID比B的还小,就会将自己的bridgeID填写进去。而当B和C收到A发的BPDU以后,发现自己没有A小,那么也就只能做非根桥了。
而当B和C往外转发BPDU的时候,是会加上自己到根桥的cost值的,而不再是A发出的BPDU里面的cost值为0.
所以如果是三台交换机的话,在刚开始开机的时候,是会有一个30秒的计算生成树的生成时间。
生成树的端口状态:
生成树的端口状态一共有五种:
1.转发forwarding 发送和接收用户数据
2.学习 learning 构建网桥表 构建好网桥表以后,再过15秒就会进入转发状态。
3.侦听 listening 构建“活动”拓扑选举根桥、根端口、指定端口 算生成树,算好以后,经过15秒进入学习状态。
4.阻塞 blocking 只接收BPDU 应该是每隔2秒会收到来自根桥的BPDU,如果20秒还没收到,就会进入侦听状态。
5.禁用 disable 强制关闭
在上面的五个状态里面,只有转发状态,可以接收和发送用户数据,其他的四个状态都是不可以发送和接收用户数据的。
生成树计时器:
·交换机开机需要等待30秒的时间开始转发数据
·当某个正在使用的链路断掉,阻塞的端口需要50秒的时间开始转发数据。
阶段总结:
一、选择根桥【网络唯一】(如果交换机超过7台,会有多个根桥产生。)
-bridgeID小
二、选根端口【非根桥唯一】
-cost值小
-直连网桥的bridgeID小
-直连网桥的PID小
三、选择指定端口【网段唯一】
-根桥上面所有端口都是指定端口
-非根桥端口
-cost值小
-端口所在网桥的bridgeID小
-直连网桥的PID 小
一般情况下都是值越小,优先级越大。
根端口对面一定是指定端口,但是指定端口对面不一定是根端口,有可能是指定端口也有可能是阻塞端口。
PVST(按VLan生成树):
PVST是cisco私有的,为每个vlan构造一棵生成树。称为“每vlan生成树”
配置网络中比较稳定的交换机为根网桥
利用pvst实现网络的负载分担
启用生成树的命令:
Switch(config)#spanning-tree vlan vlan-list
设置根网桥:
Switch(config)#spanning-tree vlan vlan-list rootprimary|secondary 设置为primary后,就相当与设置了主要根桥,优先级从默认的32768变成24576,设置为secondary后,就相当于设置成为备份根桥,优先级就从默认的32768变成为28672.
修改网桥的优先级:
Switch(config)#spanning-tree vlan vlan-list priority bridge-priority
如果要手工来指定优先级,那么bridge-priority的数字就必须是4096的倍数才可以。
修改端口成本:
Switch(config-if)#spanning-tree vlan vlan-list cost cost
修改端口优先级:
Switch(config-if)#spanning-tree vlan vlan-listport-priority priority 必须是16的倍数
配置上行速链路:
Switch(config-if)#spanning-tree uplinkfast
配置端口速链路:
Switch(config-if)#spanning-tree portfast
查看生成树的配置:
Switch#show spanning-tree
查看某个vlan的生成树的详细信息:
Switch#show spanning-tree vlan vlan-id detail
配置速端口是为了节余启动生成树的30秒的等待时间。