STP 的机制

什么是 STP 协议?

STP 在最初被设计出来的时候,主要是用于防止二层环路导致的广播风暴,是一个破环协议。最初是在IEEE 802.1d中被定义。

STP 的 三种计时器

hello: hello 时间是在端口上发送的每个 BPDU 之间的时间。默认情况下,此时间为 2 秒。

Forward delay:Forward delay 是在 Listening 和 Learning 状态下花费的时间。默认情况下,此时间为 15 秒。

max age: max age 控制网桥端口保存其 BPDU 信息之前经过的最长时间。默认情况下,此时间为 20 秒。

每个配置 BPDU 都包含这三个参数。此外,每个 BPDU 配置都包含另一个与时间相关的参数,该参数称为 message age (消息期限)。message age 不是固定值。message age 包含自根网桥最初发起 BPDU 以来经过的时间长度。根网桥发送其 BPDU 的 message age 的值为 0,所有后续交换机都会将这个值加 1。实际上,这个值包含了有关网桥接收 BPDU 时离根网桥有多远的信息。

STP 的 其它参数

DIA (Diameter of the STP domain, STP域直径) : 此值是网络中根桥与末端网桥之间最大网桥数。IEEE 的建议是,在默认 STP 计时器的 STP 网络中最大直径为 7。

transit delay(传输延迟): 此值是网桥接收和传输帧之间经过的时间。从逻辑上讲,这是通过网桥的延迟。IEEE 的建议是,将 1 秒视为 STP 最大传输延迟。

bpdu_delay(BPDU 传输延迟):此值是在端口上接收 BPDU 与传输 BPDU 到另一个端口之间的延迟。IEEE 建议将 1 秒作为最大 BPDU 传输延迟。

msg_overestimate(消息期限过度估计):此值代表在转发 BPDU 之前,每个网桥为 message age(消息期限)添加的增量。大部分交换机在转发 BPDU 之前会为 message age 添加 1 秒的增量。这种增加的时间被认为是一种过度估计,即在实际转发前为 message age 增加了额外的时间。这种做法有助于防止潜在的网络环路问题。

lost_msg(丢失消息):此值是当 BPDU 从桥接网络的一端移动到另一端时可能丢失的 BPDU 数。IEEE 的建议是,使用 3 作为可能丢失的 BPDU 数量。

Tx_halt_delay(传输停止延迟):此值是在确定端口需要被阻塞后,网桥有效将端口移动到阻塞状态所需的最长时间。IEEE 建议是,此参数设置为 1 秒。

med_access_delay(介质访问延迟):这个值表示设备获取媒介进行初始传输所需的时间。它是指从 CPU 决定发送帧到帧实际开始离开桥接站之间的时间。IEEE 建议将最大时间设置为 0.5 秒。

需要增大网络最大直径时,同时需要调整这些参数,但是目前流行的设备可以直接配置直径,无需去复杂地计算这些参数,所以了解就好。

STP 选举过程

1.在网络中选出一个根桥(Root Bridge):对于 STP 网络来说,根桥在全网中只有一个,一般来说会将最核心的设备配置为根桥。根桥会根据网络拓扑的变化而变化。

2.在每个非根桥上选取一个根端口(Root Port),根端口是去往根桥路径开销最小的端口,根端口负责向根桥转发数据,在非根桥上,必须有且只有一个根端口,用来与根桥交换信息。

3.选举指定端口(Designated port):指定转发 BPDU 的端口。在 STP 网络中,每条链路上必须有且只有一个指定端口。指定端口是根路径开销(cost)最小的端口。指定端口/根端口的选举:根路径开销值最小的优先,如果有相同的根路径开销值,先比对 BID(桥 ID),再比对 PID(端口 ID)

4.阻塞非指定端口(Non-Designated port):所有端口选举完毕后,剩下的端口成为非指定端口(阻塞端口),非指定端口将被阻塞,从而打破二层环路。被阻塞的非指定端口不会发送 BPDU 报文,更不会发送业务数据,但会持续侦听 BPDU 报文。

根桥的所有端口都是指定端口。

配置 BPDU(configuration BPDU)与 TCN BPDU

1.配置 BPDU(configuration BPDU)

网桥在初始状态下,都默认为自己是根桥,并向自己所有的活动端口定期发送(默认 2 秒)配置 BDPU。但在网络拓扑稳定以后,只有根桥主动发送配置 BPDU,其他桥在收到上游传来的配置 BPDU 后,才会发送自己的配置 BPDU。网桥会将从根端口收到的具有更高优先级的 BDPU,从它的指定端口转发出去。

2.TCN BPDU

TCN BPDU 的格式非常简单,只有协议 ID,协议版本 ID 以及 BPDU 类型三个字段。TCN BPDU 用于在网络拓扑发生变化时向根桥通知变化的发生。当网络拓扑发生变化时,远离变化点的交换机无法直接感知变化的发生,其 MAC 地址表项也就无法快速刷新。故 STP 需要一种机制,用于在网络拓扑发生变化时,促使全网交换机尽快老化自己的 MAC 地址表项(FDB 表)。

当不是根的⽹桥发生拓扑更改时,它会向其根端⼝发送 TCN BPDU。重复此传输,直到⽹桥收到来⾃该 LAN 的指定⽹桥的确认(TCA BPDU)。如果根网桥收到这样的通知,或者自己改变了拓扑结构,它会在⼀段时间内在 BDPU 中设置⼀个 TC 标志,发送给下游网桥。设置此标志后,收到的⽹桥会使⽤Forwarding Delay来快速老化 FDB(Forwarding DataBase)。当标志再次重置时,网桥恢复 FDB 的⽼化时间。

当网桥的一个自认为是指定端口的端口,收到优先级更低的 BDPU(指定端口通常不会收到 BPDU),会将带有自己信息的 BDPU 发送出去进行回应,告知其根桥的信息。举个例子,当一个优先级低的桥接入 STP 域中的时候,默认自己是根桥,泛洪发送 BPDU。接下来它会收到回复的 BPDU,BPDU 包含真正的根桥ID,经过对比后它会明白自己是非根桥,会重新调整计算自己的端口状态。随后它向其根端⼝发送 TCN BPDU,通知上游网络拓扑发生改变,重复此传输,直到⽹桥收到来⾃该 LAN 的指定⽹桥的确认(TCA)。如果根网桥收到这样的通知,它会在⼀段时间内在 BDPU 的 flags 中设置⼀个 TC=1 的标志,发送给下游网桥。设置此标志后,所有收到的⽹桥会使⽤Forwarding Delay来⽼化动态条⽬。当标志再次重置时,网桥恢复 FDB 的⽼化时间。

只有在以下情况会发送 TCN BPDU:

  • 主动发送:当网络中的拓扑发生变化时(比如某个端口的状态发生改变或者某个链路出现故障),设备向其根端⼝发送 TCN BPDU(Bridge Protocol Data Unit)。

  • 被动发送:在检测到或收到⾮根桥的 TCN BPDU 之后,该网桥向根端口发送 TCN BPDU;

STP 的五种状态

在 Blocking 状态中,处于这个状态的端口不能够参与转发数据,但是可以接收 BPDU,并交给 CPU 进行处理。不过不能发送 BPDU,也不进行 MAC 地址学习。

在 Blocking 状态中,处于这个状态的端口如果在最大老化时间内没有收到 BPDU,会认为链路发生故障,从 Blocking 状态转变为 Listening 状态。端口需要接收 BPDU 才能保持 Blocking 状态

在 Listening 状态中,设备将接收到的 BPDU 数据包保存并处理,但是不会转发这些数据包,也不会将收到的帧的 MAC 地址保存到 FDB 中。此时设备会注意到配置变更,但尚未开始重新计算树的结构。

在 Learning 状态中,设备将接收到的 BPDU 数据包保存并且处理,同时也会学习哪些端口可以转发数据帧。学习过程会使设备了解到网络拓扑结构的变化,会将收到的帧的MAC地址保存到 FDB 中,但仍不会转发数据帧。

在 Forwarding 状态中,设备正常转发数据,同时也会进行 MAC 地址学习和 BPDU 的接收、处理和发送。

BPDU 格式

type STP_BDPU struct {
	Root_Identifier # 根桥 ID
	Root_Path_Cost # 根路径开销
	Bridge_Identifier # 桥 ID
	Port_Identifier # 端口 ID
}

BPDU 被封装在以太网数据帧中,目的 MAC 是组播 MAC:01-80-C2-00-00-00

桥 ID 由桥优先级和 MAC 地址组成,桥优先级的默认值为 32768,值可以修改为 0 - 65535,但必须是 4096 的整数倍。

总结

STP 协议收敛的时间较长,响应速度慢,处于 Blocking 状态的端口进入 Forwarding 状态至少要需要经历 2 倍的 Forward Delay 时间,默认是 30 秒。于是在 2001 年,IEEE 推出了快速生成树协议(RSTP)作为 802.1w。RSTP 在网络更改时提供了更快的收敛速度,并引入了新的收敛行为和新的端口角色。所以从今天来看,大部分的厂商的交换机默认使用的都是 RSTP 协议。

posted @   Désiré  阅读(186)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示