在企业局域网络中使用冗余链路会带来环路的风险,导致广播风暴,MAC地址表震荡等各种问题,影响网络的稳定性,但有时候为了网络的稳定性,又不得不使用冗余链路。不过STP协议可以解决冗余链路带来的环路问题,并且当交换机的某一条链路发生故障时,可以迅速切换到备用链路,保证网络的可靠稳定性。
STP协议定义了三种端口角色来保证当前网络中没有环路,STP协议的选举规则如下:
- 先选举根桥
- 然后选举根端口
- 再选举指定端口
什么是根桥?说通俗点根桥其实就是一个交换机。
STP协议是通过构造一颗生成树来解决网络中的环路问题的,在每个STP网络中都会存在一个根桥交换机用于维护整个生成树(根桥就是整颗生成树的树根),其他的则为非根桥交换机,并且每个交换机都有一个桥ID(BID),这个BID由网桥优先级和MAC地址组成,网桥优先级是可以配置的,其范围是0 - 65535,默认值为32768,数值越小说明优先级越高,网桥优先级最高的交换机会被选举为根桥交换机,如果优先级相同,则会比较MAC地址,MAC地址越小的优先级越高,总结成一句话就是:根桥交换机的选举主要是依据网桥优先级和MAC地址(越小越优先)。
在上图中SW1交换机的桥ID是1024,并且该桥ID在当前网络中是最小的,那么根据选举根桥的规则直接选举SW1交换机为根桥,SW3为备根,SW2为非根。
STP协议除了要选举根桥外,还要选举端口:
根端口(RP):离根桥交换机最近的非根交换机的端口,并且每个非根交换机最多只有一个根端口,用于接收BPUD分组。
指定端口(DP):每条链路上必须且只有一个指定端口,并且离根桥交换机最近,用于发送BPDU分组。
非指定端口(NDP):每个网络拓扑必须要有一个非指定端口,用于阻塞数据防止环路,也称为阻塞端口。
端口的选举主要依据以下几个参数(所有参数值都是越小越优先):
现在根据端口的选举规则分别选举出根端口,指定端口,非指定端口,如下图所示:
有同学可能会疑惑为什么要选举根桥和端口?由于STP协议通过构造一棵生成树来解决网络的环路问题,根桥设备是发送BPDU分组,其他设备则是接收BPDU分组,以此来维护整个生成树网络,这就需要通过选举端口来决定谁来收发BPDU分组了。
1. 首先是选举DP端口,由于根桥要发送BPDU分组,那么根据DP端口的定义和选举规则,SW1交换机的f0/0和f0/1都选举为DP端口,用于发送BPDU分组。
2. 其次是选举RP端口,一般来讲,发送BPDU分组的对面就是接收BPDU分组的,所以SW2交换机的f0/0和SW3交换机的f0/0就是RP端口,用于接收BPDU分组。
3. 最后还要从SW2的f0/1到SW3的f0/1这条链路中分别选举出DP端口和NDP口,还是根据DP端口的选举规则,因为这条链路上的端口Cost值一样,所以无法参考Cost值来选举端口。需要根据BID来选举DP,由于SW3交换机的f0/1口的BID优先级更高,那么SW3交换机的f0/1口选举为DP口,那么SW2的f0/1口就是NDP口了,用于阻塞数据分组防止环路。
总结一下STP选举的规则:
- 先选举根桥,并且根桥的所有接口都是DP(因为根桥的接口离本身最近)
- 一般DP的对面就是RP(因为DP用于发送BPDU分组,而RP是用于接收BPDU分组)
- 选举流程:
- 先选举根桥
- 再选举DP和RP
- 最后选NDP(阻塞端口)
STP协议也是基于Trunk链路的,在部署STP协议之前,所有交换机的链路必须设置为Trunk模式。
另外,思科的设备为防止环路默认情况下都开启了STP协议,但在工程环境下是非常不推荐使用默认的STP协议,因为默认的STP协议在选举端口时会随机选举一个端口为阻塞端口,特别是在一个大型企业网络中,如果默认的STP协议在汇聚层的设备上随机选举了一个阻塞端口,就有可能会造成大面积的网络故障。
所有链路设置为Trunk模式,略过......
配置交换机的BID,SW1为根桥,SW2为备根,SW3为非根:
SW1(config)#spanning-tree vlan 1 priority 0
SW2(config)#spanning-tree vlan 1 priority 1024
SW3(config)#spanning-tree vlan 1 priority 4096
show命令查看根桥SW1交换机的STP信息:
SW1#show spanning-tree vlan 1 brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 0
Address cc01.08c8.0000
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 0
Address cc01.08c8.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300
//主要关注Sts字段(端口的状态)
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/0 128.1 128 19 FWD 0 0 cc01.08c8.0000 128.1
FastEthernet0/1 128.2 128 19 FWD 0 0 cc01.08c8.0000 128.2
SW1#
STP协议的比较重要的几个字段:
This bridge is the root:这句话说明,SW1交换机自己就是根桥设备。
Sts:Sts字段表示端口的状态,一般有FWD和BLK两种状态,FWD表示转发状态(Sts字段很重要)。
Hello Time:表示hello分组的更新周期为2秒,生命周期为20秒,转发延迟为15秒
Address:MAC地址
Port ID:表示PID,越小越优先,端口的优先级默认是128,其范围是0 ~ 255。
从上面给出的STP协议信息可以看出,SW1交换机已经选举为根桥了,同时SW1所有的端口都处于FWD状态(转发状态)。
show命令查看根桥SW2交换机的STP信息:
SW2#show spanning-tree vlan 1 brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 0
Address cc01.08c8.0000 //根桥的MAC地址
Cost 19
Port 1 (FastEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 1024
Address cc02.1c80.0000 //自己的MAC地址
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/0 128.1 128 19 FWD 0 0 cc01.08c8.0000 128.1
FastEthernet0/1 128.2 128 19 FWD 19 1024 cc02.1c80.0000 128.2
Cost字段:备根到根桥的Cost值(所花费的开销)。
我们可以看到SW2交换机所有的接口处于转发状态(FWD状态)。
show命令查看根桥SW3交换机的STP信息:
SW3#show spanning-tree vlan 1 brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 0
Address cc01.08c8.0000
Cost 19
Port 1 (FastEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 4096
Address cc03.2f4c.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/0 128.1 128 19 FWD 0 0 cc01.08c8.0000 128.2
FastEthernet0/1 128.2 128 19 BLK 19 1024 cc02.1c80.0000 128.2
SW3#
重点关注Sts字段,SW3交换机的优先级是4096,并且SW3的f0/1口是处于BLK状态(阻塞),该端口用于防止环路。
接下来设置SW1交换机为主根,配置如下:
SW1(config)#spanning-tree vlan 1 root primary
//这句话的意思是SW1设备已经设置为主根了
% This switch is already the root of VLAN1 spanning tree
//优先级是0
VLAN 1 bridge priority unchanged at 0
VLAN 1 bridge max aging time unchanged at 20
VLAN 1 bridge hello time unchanged at 2
VLAN 1 bridge forward delay unchanged at 15
SW1(config)#
SW2交换机为备根,配置如下:
SW2(config)#spanning-tree vlan 1 root secondary
VLAN 1 bridge priority set to 16384
VLAN 1 bridge max aging time unchanged at 20
VLAN 1 bridge hello time unchanged at 2
VLAN 1 bridge forward delay unchanged at 15
SW2(config)#
原先自定义设置为SW2的优先级为1024的,但是设置SW2为备根后,优先级变成16384了。
下面的内容是作为补充的。
进入接口配置模式下,可以修改链路的Cost(开销)值和端口的优先级,配置如下:
//修改端口的Cost值
SW1(config-if)#spanning-tree cost ?
<1-65535> Change an interface's spanning tree path cost
//修改端口的优先级
SW1(config-if)#spanning-tree port-priority ?
<0-255> Change an interface's spanning tree priority
STP协议是通过BPDU数据分组来维护整个生成树的网络的,BPDU(Bridge Protocol Data Unit,网桥协议数据单元)用于实现生成树的选举和维持。一般包含选举的参数,例如BID、PID、Cost。
注意:初始化情况下,所有设备都能发送,当根选举出来之后,只有根才能发送,其他交换机仅仅是转发。
现在通过wireshark工具抓取SW1的f0/1口到SW3的f0/0口链路的BPDU数据分组,BPDU分组主要有两种:一种是配置BPDU分组,另一种是TCN/TC/TCA拓扑变更分组。
配置BPDU分组相当于一个hello包,包含了STP选举的信息,配置BPDU数据分组格式如下所示:
BPDU分组常用的字段:
Root Identifier字段:该字段包含了根桥的一些信息,例如根桥的BID等。
Bridge Identifier字段:该字段包含了根桥的BID
Message Age字段:BPDU分组在网络中传播的存在时间
Max Age字段:BPDU分组的最大生命周期时间
Hello Time字段:BPDU分组的更新周期时间
Forward Delay字段:端口状态变迁的延迟时间
我们可以看到STP协议的BPDU分组是基于802.3标准封装的,从BPDU分组中可以看出这其实是一个hello包,包含了STP的选举信息。
TCN/TC/TCA拓扑变更分组:主要是在运行了STP协议的局域网络环境下发生故障时,用于通知网络拓扑信息变更,更改MAC地址的更新时间为15秒,其目的是加速MAC地址表的快速收敛或更新。
TCN分组格式:
TC分组格式:
TCA分组格式: