目录
在复杂的网络环境中,二层网络环路犹如一颗定时炸弹,随时可能引发广播风暴,导致网络拥塞甚至瘫痪。生成树协议(STP)应运而生,它能够自动构建一个无环路的树形拓扑结构,确保网络的稳定运行。本文将深入探讨 STP 的各个方面,包括选举机制、端口状态、定时器以及拓扑变化处理,并结合实际案例和代码进行讲解。
STP 基础概念
STP 的核心任务是防止二层网络出现环路。它通过在交换机之间交换网桥协议数据单元(BPDU)来实现这一目标。BPDU 包含了丰富的信息,如根桥 ID、路径开销、发送者 BID 和 PID 等,这些信息是 STP 进行选举和决策的重要依据。
选举机制
根桥选举
根桥是 STP 网络中的核心设备,所有其他交换机都以根桥为中心构建无环拓扑。选举根桥时,交换机依据桥 ID 进行比较,桥 ID 由桥优先级和 MAC 地址两部分组成。选举规则是数值越小越优先,先比较桥优先级,默认值为 32768,且必须是 4096 的倍数;若优先级相同,则比较 MAC 地址。例如,在一个包含三台交换机的网络中,交换机 A 的优先级为 32768,MAC 地址为 00:00:00:00:00:01;交换机 B 的优先级为 28672,MAC 地址为 00:00:00:00:00:02;交换机 C 的优先级为 36864,MAC 地址为 00:00:00:00:00:03。由于交换机 B 的优先级最小,因此它将被选举为根桥。在华为交换机上,可以使用以下命令修改桥优先级,将交换机配置为根桥:
stp priority 0 # 将桥优先级设置为0,使其更有可能成为根桥
根端口选举
在非根桥上,需要选择一个根端口,该端口是去往根桥路径最优的接口。选举根端口时,会比较以下参数:
- 根路径开销(RPC):指从该端口到根桥的累计路径开销,开销越小越优先。不同链路类型的默认开销不同,例如 10Mbps 链路的开销为 100,100Mbps 链路的开销为 19,1Gbps 链路的开销为 4。
- 发送者的桥 ID(BID):如果 RPC 相同,则比较发送者的 BID,数值越小越优先。
- 发送者的端口 ID(PID):PID 由端口优先级和端口号组成。若发送者的 BID 相同,则比较 PID,同样数值越小越优先,端口优先级默认值为 128,且必须是 16 的倍数。
假设有一个网络拓扑,交换机 S1 为根桥,交换机 S2 通过两个端口连接到 S1。端口 G0/0/1 的 RPC 为 19,接收到的 BID 为根桥的 BID,PID 为 128.1;端口 G0/0/2 的 RPC 也为 19,接收到的 BID 同样为根桥的 BID,但 PID 为 128.2。由于端口 G0/0/1 的 PID 数值更小,因此 G0/0/1 将被选举为根端口。在华为交换机上,可以通过以下命令修改端口的路径开销和优先级:
# 修改端口G0/0/1的路径开销为10
interface GigabitEthernet0/0/1
stp cost 10
# 修改端口G0/0/2的端口优先级为0
interface GigabitEthernet0/0/2
stp port priority 0
指定端口选举
在每条链路上,需要选择一个指定端口,该端口负责向链路另一端发送 BPDU。选举指定端口时,交换机将接口未来要发送的 BPDU 参数和接收到的 BPDU 参数进行对比:
- 如果交换机接收到的 BPDU 比自己发送的更优,则将该接口阻塞。
- 如果自己发送的 BPDU 更优,则保持该接口为指定端口。
以根桥为例,根桥的所有接口默认都是指定端口。在一个包含交换机 S1、S2 和 S3 的网络中,S1 为根桥,S2 和 S3 通过一条链路相连。S2 的端口 G0/0/1 和 S3 的端口 G0/0/2 处于这条链路上。S1 通过 G0/0/1 向 S2 发送 BPDU,S2 接收到后,会将自己从 G0/0/1 接口发送的 BPDU 参数与接收到的 BPDU 参数进行比较,由于 S1 是根桥,其发送的 BPDU 更优,所以 S2 的 G0/0/1 接口保持为指定端口。同样,S3 的 G0/0/2 接口也会进行类似的比较,最终该接口也保持为指定端口。
端口状态
STP 定义了五种端口状态,每种状态都有其特定的功能和作用:
- 禁用(Disable):端口未启用 STP 协议或被人为关闭,此时端口不参与 STP 运算,也不收发任何数据。
- 阻塞(Blocking):端口处于阻塞状态,不转发数据,仅接收 BPDU,用于防止环路。被阻塞的端口可以随时根据网络拓扑的变化重新参与选举。
- 侦听(Listening):端口可以发送和接收 BPDU,用于确定端口角色,但不学习 MAC 地址,也不转发数据。此状态持续时间为转发延迟时间(默认 15 秒),主要用于防止临时环路的产生。
- 学习(Learning):端口可以发送和接收 BPDU,开始学习 MAC 地址,但仍然不转发数据。该状态也持续转发延迟时间(默认 15 秒),目的是在转发数据之前,让交换机学习 MAC 地址,以减少未知单播帧的泛洪。
- 转发(Forwarding):端口正常转发数据,同时可以发送和接收 BPDU,并学习 MAC 地址。处于转发状态的端口是网络数据传输的重要通道。
端口状态的迁移是一个有序的过程,当端口初始化或开启时,会从 Disable 状态瞬间过渡到 Blocking 状态。如果端口被选举为根端口或指定端口,则会进入 Listening 状态;在 Listening 状态下,经过转发延迟时间后,会进入 Learning 状态;再经过转发延迟时间,最终进入 Forwarding 状态。如果端口不再是根端口或指定端口,则会进入 Blocking 状态。如果端口被禁用、STP 协议关闭或端口 down 掉,则会直接退回到 Disable 状态。
STP 定时器
STP 协议中包含四个重要的定时器,它们对 STP 的运行起着关键作用:
- Hello Time:BPDU 的发送时间间隔,默认值为 2 秒。根桥按照这个时间间隔周期性地发送 BPDU,非根桥接收到根桥的 BPDU 后,会转发该 BPDU。在华为交换机上,可以使用以下命令修改 Hello Time:
stp hello-time 4 # 将Hello Time设置为4秒
- Forward Delay:转发延迟时间,默认值为 15 秒。用于控制端口在 Listening 和 Learning 状态的停留时间,以确保网络拓扑稳定,防止临时环路和大量未知单播帧的泛洪。修改转发延迟时间的命令如下:
stp forward-delay 20 # 将转发延迟时间设置为20秒
- Max Age:BPDU 的老化时间,默认值为 20 秒。非根桥通过这个定时器来判断根桥是否故障。如果在 Max Age 时间内没有收到根桥的 BPDU,则认为根桥发生故障,开始重新进行根桥选举。可以使用以下命令修改 Max Age:
stp max-age 30 # 将Max Age设置为30秒
- Message Age:BPDU 的当前年龄,每经过一次交换机转发,Message Age 就会加 1。交换机接收到 BPDU 后,会将 Message Age 与 Max Age 进行比较,如果 Message Age 大于 Max Age,则交换机将忽略此 BPDU。Message Age 是一个参考值,不能手动修改。
拓扑变化处理
当网络拓扑发生变化时,STP 需要及时做出调整,以确保网络的无环和连通性。常见的拓扑变化场景包括根桥故障、根端口故障和链路故障等。
- 根桥故障:如果根桥发生物理层故障,与根桥相连的交换机可以通过物理层感知到故障,并立刻将 20 秒的 BPDU 老化时间清空。此时,交换机认为根桥故障,会重新进行根桥和根端口的选举。由于需要等待端口从阻塞状态转换到转发状态,这个过程通常需要 30 秒。如果根桥是协议层故障,交换机无法通过物理层感知,需要等待 20 秒的 BPDU 老化时间超时后,才会发现根桥故障,然后重新进行选举,整个过程大约需要 50 秒。
- 根端口故障:当根端口发生直连故障且存在替代端口(AP)时,交换机可以通过 AP 接收到根桥的 BPDU,AP 会在 30 秒后进入转发状态。如果根端口是非直连故障,交换机需要先等待 20 秒的 BPDU 老化时间,确认根端口无法到达根桥后,AP 再经过 30 秒进入转发状态,总共需要 50 秒。如果根端口故障且不存在 AP,交换机同样需要等待 BPDU 老化时间,然后重新进行选举,收敛时间也为 50 秒。
- 链路故障:链路故障的处理方式与根端口故障类似,根据是否存在 AP 以及故障是直连还是非直连,收敛时间为 30 秒或 50 秒。
在实际网络环境中,可以使用思科设备的 debug 命令来观察拓扑变化时 STP 的收敛过程。例如,在思科交换机上,可以使用以下命令开启 STP 调试功能,观察端口状态的变化:
debug spanning-tree events # 开启STP事件调试
interface GigabitEthernet0/0/1 # 进入要观察的端口
shutdown # 关闭端口,模拟故障
通过观察调试输出,可以看到端口状态的迁移过程以及收敛所需的时间,从而更好地理解 STP 在拓扑变化时的工作机制。
STP 作为二层网络中防止环路的重要协议,通过选举机制、端口状态控制和定时器的协同工作,确保了网络的稳定性和可靠性。深入理解 STP 的原理和工作机制,对于网络工程师进行网络规划、故障排查和优化具有重要意义。在实际工作中,需要根据网络的具体需求,合理配置 STP 参数,以充分发挥其作用,保障网络的高效运行。