本文档介绍了生成树协议 (STP) 计时器和调整计时器时应当遵循的规则。
注意:本文档仅讨论如何调整常规802.1D生成树的STP计时器。而对快速 STP (RSTP) (IEEE 802.1w) 或多生成树 (MST) 协议 (IEEE 802.1s) 不做论述。 有关 RSTP 和 MST 的详细信息,请参阅以下文档:
本文档读者应对 STP 十分了解。有关 STP 操作的详细信息,请参阅了解和配置 Catalyst 交换机上的生成树协议 (STP)。
注意:您可以使用此文档来帮助您解决网络问题,但前提是您熟悉该流程或熟悉该流程的人员指导您。如果您不熟悉 STP,那么您所做的更改可能会导致下列任何一种情况出现:
不稳定性
应用程序速度减慢
CPU 使用率达到峰值
LAN 崩溃
有关本文档所述的所有参数的更多详细信息和参考资料,请参阅 802.1D - 适用于局域网和城域网的 IEEE 标准:媒体访问控制 (MAC) 网桥 (第 8 条)。
本文档不限于特定的软件和硬件版本。
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
STP 计时器包含如下所示的几种类型:
Hello — Hello 时间是从端口发送网桥协议数据单元 (BPDU) 的间隔时间。该时间默认为 2 秒,但是您可以在 1 至 10 秒内对其进行调整。
转发延迟 — 转发延迟是处于侦听和学习状态的时间。该时间默认为 15 秒,但是您可以在 4 至 30 秒内对其进行调整。
最大老化时间 — 最大老化时间计时器用于控制网桥端口保存配置 BPDU 信息之前所经历的最大时间长度。该时间默认为 20 秒,但是您可以在 6 至 40 秒内对其进行调整。
每个配置 BPDU 均包含这三个参数。另外,每个 BPDU 配置还包含另一个与时间有关的参数,该参数称作消息年龄。消息年龄不是固定值。消息年龄包含根网桥最初生成 BPDU 后经历的时间长度。根网桥发送的所有 BPDU 的消息年龄值为 0,并且随后的所有交换机都会在该值基础上增加 1 个数。实际上,该值包含了有关您在接收 BPDU 时与根网桥之间距离的信息。下图解释了这一概念:
当接收到的一个新配置 BPDU 等于或者优于端口上记录的信息时,将会存储所有 BPDU 信息。老化时间计时器开始运行。老化时间计时器的起点为该配置 BPDU 中接收到的消息年龄。如果该老化时间计时器在接收到刷新该计时器的另一 BPDU 之前达到了最大老化时间,则该端口的信息便会老化。
下面的示例适用于本部分中的图:
交换机B和C从交换机A接收配置BPDU,消息年龄为0。在进入A的端口上,信息将以(最大年龄 — 0)秒的时间过期。该时间默认为 20 秒。
交换机D和E从交换机B接收BPDU,消息时效为1。在通往A的端口上,信息会以(最大时效 — 1)秒的时间老化。该时间默认为 19 秒。
交换机F从交换机E接收BPDU,消息年龄为2。在到达E的端口上,信息将在(最大年龄 — 2)秒内过期。该时间默认为 18 秒。
IEEE 802.1D 定义了 STP。除生成树协议计时器部分描述的计时器之外,IEEE 还定义了这些与 STP 相关的参数:
STP 域的直径 (dia) — 该值表示任意两个终端站连接点之间的最大网桥数。IEEE 建议考虑将默认 STP 计时器的最大直径设为七个网桥。
网桥中转延迟 (transit delay) — 该值表示网桥上相同帧的接收和传输的间隔时间。该值逻辑上是通过网桥的时延。IEEE 建议考虑将网桥中转延迟最大值设为 1 秒。
BPDU 传输延迟 (bpdu_delay) — 该值表示一个端口上接收到 BPDU 的时间与配置 BPDU 有效传输到另一个端口的时间之间的延迟。IEEE 建议考虑将 BPDU 传输延迟最大值设为 1 秒。
消息年龄增量估计过高 (msg_overestimate) — 该值表示每个网桥在转发 BPDU 之前向消息年龄所添加的增量。如生成树协议计时器部分所述,Cisco 交换机(也许所有的交换机)在转发 BPDU 之前会向消息年龄添加 1 秒的增量。
丢失的消息 (lost_msg) — 该值表示 BPDU 从桥接网络的一端移动到另一端的过程中可丢失的 BPDU 数量。IEEE 建议将可丢失的 BPDU 数量设为 3。
传输终止延迟 (Tx_halt_delay) — 该值表示网桥在确定需要阻塞某端口后,有效地使该端口进入阻塞状态所需的最大时间。IEEE 建议将此参数设为 1 秒。
介质访问延迟 (med_access_delay) — 该值表示设备获得初始传输介质访问权限所需的时间。该时间为 CPU 确定发送帧与帧开始有效地从网桥传输出去之间的时间。IEEE 建议将该值的最大时间设为 0.5 秒。
通过这些参数,您可以计算其他值。该列表提供了其他参数和计算。这些计算假定所有参数均使用了 IEEE 推荐的默认值。
端到端 BPDU 传播延迟 — 该值表示 BPDU 从网络的一端传送到另一端所需的时间。假定直径相当于 7 次跳跃,可丢失的 BPDU 数量为 3 个,Hello 时间为 2 秒。在这种情况下,其公式为:
End-to-end_BPDU_propa_delay = ((lost_msg + 1) x hello) + ((BPDU_Delay x (dia – 1)) = ((3 + 1) x hello) + ((1 x (dia – 1)) = 4 x hello + dia – 1 = 4 x 2 + 6 = 14 sec
消息年龄估计过高 — 该参数的用途是说明 BPDU 始发时的年龄。假定每个网桥向 BPDU 消息年龄添加的增量为 1 秒。其公式为:
Message_age_overestimate = (dia – 1) x overestimate_per_bridge = dia – 1 = 6
最大帧有效期 — 该值表示之前发送到桥接网络的帧在到达目标之前在网络中停留的最大时间。其公式为:
Maximum_frame_lifetime = dia x transit_delay + med_access_delay = dia + 0.5 = 7.5 = 8 (rounded)
最大传输终止延迟 — 该值表示确定阻塞某端口后,有效地阻塞该端口所需的时间。在这种情况下,IEEE 将该时间的最大值算作 1 秒。其公式为:
Maximum_transmission_halt_delay = 1
该部分详细说明了如何在每个参数均使用推荐值的情况下,达到最大老化时间和转发延迟的默认值。推荐值是直径为 7,Hello 时间为 2 秒。
计算最大老化时间时应考虑到,网络外围的交换机在稳定状态下不会使根信息超时(即根仍处于活动状态)。 最大老化时间值需要将 BPDU 总传播延迟和消息年龄估计过高考虑在内。因此,最大老化时间的公式为:
max_age = End-to-end_BPDU_propa_delay + Message_age_overestimate = 14 + 6 = 20 sec
此计算显示了 IEEE 如何达到最大老化时间的默认推荐值。
端口进入侦听状态表明在活动 STP 拓扑发生了改变,且端口将从阻塞状态变为转发状态。因此,转发延迟运行的侦听和学习周期必须包含以下连续周期:
从第一个网桥端口进入侦听状态(并且在随后的重新配置中保持该状态)到桥接 LAN 中最后一个网桥检测到活动拓扑发生变更的时间
另外,您需要计算出用来计算最大老化时间的延迟(消息年龄评估过高和 BPDU 传播延迟)。
从最后一个网桥停止转发前一个拓扑上接收到的帧(最大传输终止延迟)到前一个拓扑上转发的最后一帧消失(最大帧有效期)的时间
为了确定您没有接收到重复的帧,这一段时间是十分必要的。
因此,转发延迟时间(侦听时间 + 学习时间)的两倍包含所有这些参数。其公式为:
2 x forward delay = end-to-end_BPDU_propagation_delay + Message_age_overestimate + Maximum_frame_lifetime + Maximum_transmission_halt_delay = 14 + 6 + 7.5 + 1 = 28.5 forward_delay = 28.5 /2 = 15 (rounded)
在所有这些参数中,您可以调整的只有:
注意:调整这些参数的能力取决于网络。
Hello — 从 1 至 6
最大老化时间
转发延迟
直径 — 取决于网络。
请勿修改以下列表中的任何值。将这些值保留为 IEEE 的推荐值:
lost_msg = 3
transit_delay = 1
bpdu_delay = 1
msg_overestimate = 1
Tx_halt_delay = 1
med_access_delay = 0.5
maximum_transmission_halt_delay = 1
这些值似乎相当保守,因为在现代的网络条件下您不太可能丢失三个 BPDU 或者帧通过交换机的时延会达到 1 秒。但是,请记住设定这些值是为了防止在诸如以下的压力条件下发生 STP 环路:
CPU 使用率非常高
端口过载
因此,您必须将这些参数视为固定值。如果您使用的是生成树协议计时器默认值部分所示的公式,您得到的结果将是:
max_age = End-to-end_BPDU_propa_delay + Message_age_overestimate = ((lost_msg + 1) x hello) + ((BPDU_Delay x (dia – 1)) + (dia – 1) x overestimate_per_ bridge = (4 x hello) + dia – 1 + dia – 1 = (4 x hello) + (2 x dia) – 2 forward_delay = (End-to-end_BPDU_propa_delay + Message_age_overestimate + Maximum_frame_lifetime + Maximum_transmission_halt_delay ) / 2 = ((lost_msg + 1) x hello) + ((BPDU_Delay x (dia – 1)) + ((dia – 1) x overestimate_per_bridge) + (dia x transit_delay) + med_access_delay + Maximum_transmission_halt_delay) / 2 = ((4 x hello) + dia – 1 + dia – 1 + dia + 0.5 + 1) / 2 = ((4 x hello) + (3 x dia) – 0.5) / 2
通过这些计算您将得出以下两个最终公式(如果将 0.5 忽略不计):
max_age = (4 x hello) + (2 x dia) – 2 forward_delay = ((4 x hello) + (3 x dia)) / 2
如果要调整 STP 计时器以达到更佳的收敛时间,您需要严格遵循这两个公式。
下面是一个示例。如果您有一个直径为 4 的桥接网络,那么您需要使用这些参数:
hello = 2 (default) then max_age = 14 sec forward_delay = 10 sec If hello = 1 then max_age = 10 sec forward_delay = 8 sec
注意:hello = 1是最低值。如果网络直径为 4,就无法将最大老化时间的参数调整到 10 秒以下,也无法将转发延迟的参数调整到 8 秒以下。
将 Hello 时间缩短为 1 秒是减小 STP 参数最容易且最可靠的方法。但是,请记住,如果将 Hello 时间从 2 秒缩短为 1 秒,每个网桥发送或接收的 BPDU 数量就会加倍。这会导致 CPU 上的负载增多,使其需要处理两倍的 BPDU。如果您有多个 VLAN 和中继,该负载可能会成为问题。
直径完全取决于网络设计。若假定最坏的情况,直径表示连接桥接网络(包含源和目标)中任意两台交换机需要交叉的交换机的最大数量。确定直径时,不要将同一台交换机交叉两次。在本文档生成树协议计时器部分的图中,您可以看到直径为 5 的网络(路径为 F-E-B-A-C)。
现在来看下该部分的图。该图中包含一些接入交换机(交换机 C、D 和 E),这些交换机与两台分布式交换机(交换机 A 和 B)相连。 在分布式交换机和核心之间存在第 3 层 (L3) 边界。桥接域在分布式交换机处终止。STP 直径为 5:
C-A-D-B-E
D-A-C-B-E
您可以从图中看到任意交换机对的直径均不超过 5。
如生成树协议计时器部分所提到的那样,每个 BPDU 包括 Hello、转发延迟和最大老化时间 STP 计时器。IEEE 网桥不注重计时器值的本地配置。IEEE 网桥注重的是网桥接收到的 BPDU 中的计时器值。实际上,只有在 STP 根网桥上配置的计时器才是重要的。如果丢失了根,那么新的根将开始在整个网络中强制采用本地计时器值。因此,尽管不需要在整个网络中配置相同的计时器值,但必须至少在根网桥和备份根网桥上配置所有的计时器更改。
如果使用运行 Catalyst OS (CatOS) 软件的 Cisco 交换机,您可以通过某些宏来根据公式设置根以及调整参数。发出 set spantree root vlan dia diameter hello hello_time 命令可设置直径和 Hello 时间。示例如下:
Taras> (enable) set spantree root 8 dia 4 hello 2 VLAN 8 bridge priority set to 8192. VLAN 8 bridge max aging time set to 14. VLAN 8 bridge hello time set to 2. VLAN 8 bridge forward delay set to 10. Switch is now the root switch for active VLAN 8.
如果您已经配置了 STP 网络直径,则所配置的直径值将不会显示在配置中以及任何 show 命令的输出中。