规则:
- 每个网络只有一个根桥
- 每个非根桥只能有一个根端口
- 根桥的每一个端口都是指定端口
- 根端口和指定端口都是forwarding,其他端口为blocking
stp的选举过程:
- 选举根桥
- 选择根端口
- 选择指定端口
- 选择非指定端口(备选端口),设为阻塞状态
根桥的选举:
在网络中交换机之间会发送BPDU,通过BPDU来选择根桥。在BPDU报文中会包含这样的信息:
| 字节 | 内容 | 含义 | |--------|--------| |2|Protocol ID(协议ID)|该值总为0| |1|Version(版本号)|STP的版本(为IEEE 802.1d时值为0)| |1|Message type(报文类型)|BPDU类型(配置BPDU=0,TCN BPDU=80)| |1|Flags(标记域:LSB(最低有效位)=TCN标志|MSB(最高有效位)=TCA标志| |8|Root ID(根网桥ID)|
Root ID由2字节优先级和6字节MAC组成。其中两字节的优先级默认是32768,取值范围:0-65535,当然可以手动修改,收到各方ip的时候首先比较优先级,值小便是根桥,相同就比较mac地址。这个mac地址不是端口mac,而是交换机背板的mac地址,用于表示这台交换机的,值小者便是根桥。
选择根端口Rootport:
最快能到达根桥的端口。比较每个端口到达根桥的Cost值,具有最小Cost的端口成为RP端口,而Cost表示的是本端口收到一个对端网桥的BPDU以后,累加本端口的Cost之后的总路径开销,主要以链路上的带宽来获得与累加该值
若是cost值相等,则比较BID,若是不同设备其BID是不相同的(mac地址的存在)
但是若是环路发生在两台设备的情况下就会发生BID相等的情况,就会比较端口的ID了。
然后选择指定端口:
根桥的每一个端口都是指定端口,指定端口用来发数据用的。
那么其他设备的除了根端口的其余端口呢,怎么选定指定端口?
选择方式和RootPort相同:
- 到跟网桥的路径开销Cost值
- BID的值
- PortID
选择非指定端口,也就是备选端口,设为阻塞状态。除了RP、DP,其余的都将为阻塞状态,无法接收和转发数据帧。
这就是解决环路的整个过程,而为了应变网络拓扑的变化,网络情况的变化,每个角色并不是一尘不变,这样才能够适应所有的网络环境,提高可靠性,健壮性。
- 而STP感应网络变化,通过计时器和bpdu来实现,计时器有三个: Hello Time:这是根桥发送 BPDU 数据
的时间间隔,也是网络初始化的时候每个网桥发送各自的 BPDU 的时间间隔。这个时间默认为 2 秒 - Forwarding Time:指一个端口 Listening 时间,默认为 15s,为了保证 BPDU
在全网中的转发,所以做如此设定,这个值是可以配置的,由于 Forwarding Time 的限制,一般建议网络的直径应小于 7 - Max Age:存储 BPDU 最长的时间,超过这个时间端口没有接收到新的
BPDU,会丢弃以前的报文,同时会采取相应的措施。这个时间默认为 20s.
STP的5中状态:
- 阻塞(Blocking):端口不能参与其他帧的转发与接收,只接受 BPDU,但不发送,同时不学习 MAC 地址。
- 侦听(Listening):端口自阻塞状态后的第一个过渡状态。不能参与其他帧的转发与接收,只接受与发送 BPDU,同时不学习 MAC
地址。 - 学习(Learning):处于准备参与帧转发状态,不能参与其他帧的转发与接收,只接受与发送 BPDU,同时学习 MAC 地址。
- 转发(Forwarding):端口可以正式转发帧了。
- 禁止(Disabled):端口不参与STP,不收发任何的帧
当然这是最早期的STP,后来的RSTP以及MSTP都有一定的变化。
相关命令:
查看信息:
show spanning-tree
手动切换优先级:
spanning-tree vlan 1 root primary
将非根交换机配置为次要:
spanning-tree vlan 1 root secondary
切换版本:
spanning-tree mode mst/pvst/rapid-pvst
当确定某个端口作为连接终端主机的时候,我们可以将该端口配置为edgeport:
spanning-tree portfast
spanning-tree bpduguard enable #一旦该端口收到BPDU包的就会自动关闭shutdown端口,防止人恶意攻击或者形成新的环路。
MSTP的配置:
在 RSTP 中解决了收敛速度的问题,而 PVST 只是针对每一个 vlan 去生成一颗数,BPDU 会每隔两秒钟发一次,这样一旦 vlan 的数量上去了,链路上的 BPDU 的数量将无法想象,而且这么多的生成树维护起来也十分的困难,所以诞生出了 MSTP,MSTP 可以对网络中众多的 VLAN 进行分组,把 VLAN 分到组中来管理,一个组就是一个 Instance,每个组只会生成公用一颗数,这样便解决了 PVST 所带来的问题。
#首先得在全局模式中将 STP 模式改成 mstp
(config)#spanning-tree mode mst
#然后就是进入 MSTP 的配置模式
(config)#spanning-tree mst configuration
#配置创建实例并关联某个或多个 vlan
(config-mst)#instance 1 vlan 2
#配置当前的 mstp 修改的版本
(config-mst)#reversion 0
#查看当前的 instance 配置
(config-mst)#show pending
#配置该设备在实例中的优先级
(config)#spanning-tree mst 1 priority 8192
#配置该实例所在的区域名字
(config-mst)#name region1