0%

广播风暴的根源是一个永远不会“死”的帧

广播风暴的根源是一个永远不会“死”的帧

一、加了冗余链路,为什么全网瘫痪了?

某网络原本有 5 台接入交换机,各自单上联到汇聚交换机 A,汇聚再上联核心,运行多年没有问题。

后来为了提高可靠性,新增了汇聚交换机 B。每台接入都改成双上联:一条连 A,一条连 B;两台汇聚再分别上联核心。

接入交换机双上联后的网络拓扑

割接完成,几分钟后,全网瘫痪:ping 时通时不通,业务中断,交换机管理界面也很难登录。好不容易登上一台,CPU 已经到了 100%。

初步判断是环路。但两台汇聚之间没有连线,接入交换机之间也没有互联,环究竟在哪?

从任意一台接入出发,就能找到一条闭合路径:

接入 → 汇聚 A → 核心 → 汇聚 B → 接入。

环路可以跨越接入、汇聚和核心,按网络层次逐层横着找,很容易漏掉。

这个拓扑还不止一种绕法:帧也可以从接入 1 经汇聚 A、接入 2、汇聚 B,再回到接入 1。

不过,物理连线闭合,不代表一定会发生二层风暴。

下面的分析有一个前提:这些链路承载同一 VLAN,该 VLAN 的相关端口都在转发,且没有有效的环路阻断措施。 如果路径中经过三层路由,或者已有端口被 STP 阻塞,帧就不能沿这条路径完成二层循环。案例中 STP 为什么没有阻止成环,还需要结合现场配置和日志判断。

在这个前提下,一个普通的广播帧为什么能拖垮网络?先看交换机如何处理它。

二、交换机如何学习和转发一个帧

交换机处理帧时,学习和转发依据的是两个不同的地址。

学习看源 MAC。 在允许动态学习的端口上,交换机记录“这个 VLAN 中的源 MAC,从哪个端口可以到达”。后续从同一端口收到该源 MAC 的帧,会刷新动态表项;如果从另一端口收到,则可能更新表项指向。

转发看目的 MAC。 已知单播按 MAC 表指向的端口转发;如果目的端口就是入端口,则不再转发。广播和查不到目的表项的未知单播,通常会被泛洪到同一 VLAN 内除入端口外、允许转发的其他端口。组播是否泛洪,则取决于组播表项和相关配置。

这就是“源学习,目的转发”。

学习不以帧最终被转发为前提,但仍受端口状态约束:STP 阻塞端口不学习业务帧的源 MAC。

对广播帧来说,交换机不会因为“之前见过这个帧”就停止泛洪。只要它再次进入允许转发的端口,就可能再次被复制出去。

三、帧为什么停不下来,又怎样变成风暴

二层转发路径一旦成环,广播帧就可能反复循环。 帧绕回交换机后,交换机仍按广播规则继续泛洪;而以太网帧没有 TTL,不会因为绕了太多圈就自动到期。

如果泛洪产生的多份拷贝都能沿不同路径返回,它们就会再次被复制,导致流量迅速放大。因此,循环不一定意味着帧数翻倍,多份拷贝反复返回并参与复制,才是放大的关键。

当循环流量占满链路,正常业务就难以通过,形成广播风暴。此时,拥塞丢帧虽然会限制流量继续增长,却没有消除环路,网络仍可能持续瘫痪。

四、为什么 MAC 表和单播也会受影响

环路会让交换机把主机的位置学错。 主机 H 原本接在 1 号口,但它发出的帧绕环后从 2 号口返回,源 MAC 仍然是 H。交换机便把 H 的位置改记为 2 号口。当主机的新帧和绕回的拷贝交替到达时,表项就在不同端口间反复切换,形成 MAC 漂移。

单播依赖 MAC 表转发,因此也会受影响:表项指错,帧就被送错方向,可能造成循环或丢包;若拓扑变化导致部分表项被清除,后续单播查不到目的表项,就会按未知单播泛洪。如果环路仍在,这些帧还可能被反复复制,进一步加重风暴。

风暴还可能增加需要上送 CPU 的流量和协议处理负担。链路拥塞、CPU 过载后,业务和远程管理都可能受阻;如果 STP 的协议报文也无法正常收发,环路控制还可能受到影响。

这也解释了开头的故障:环路中的广播流量不仅挤占带宽,还会扰乱 MAC 表,并可能拖累交换机的控制面。