1. 广播风暴基础:什么是广播帧、广播域与冲突域、广播风暴的成因与危害
各位好,我是老张。干网络这行十几年了,今天咱们聊聊广播风暴——这个让无数网工半夜爬起来救火的经典故障。
说实话,广播风暴这玩意儿,你只要在运维一线待过,早晚会碰上。我印象最深的一次,凌晨两点被电话吵醒,整个办公区网络瘫痪,连交换机都登不上去。到现场一看,所有端口指示灯疯狂闪烁,跟迪厅似的。嗯,典型的广播风暴。
要搞懂它,得从最基础的概念说起。
1.1 什么是广播帧
广播帧,说白了就是一台设备发出来、想让所有人都收到的数据帧。它的目标MAC地址是 FF-FF-FF-FF-FF-FF,也就是全F。
你想想看,在办公室里喊一嗓子“谁看见我U盘了?”——这就是广播。所有人都能听见,但只有真正捡到U盘的人才会回应你。
广播帧在局域网里很常见:
- ARP请求:想知道某个IP对应的MAC地址,就发个广播问所有人
- DHCP发现:新设备接入网络,广播找DHCP服务器要IP
- NetBIOS名称解析:老Windows网络里,广播问“谁是这台机器?”
1.2 广播域与冲突域
这两个概念,我当年考CCNA时背得滚瓜烂熟。但真正理解它们,是在一次故障排查之后。
冲突域:同一时刻只能有一台设备发送数据的范围。如果两台设备同时发,就会“撞车”——这就是冲突。集线器(Hub)的所有端口都在一个冲突域里,所以效率极低。
广播域:广播帧能到达的范围。交换机的所有端口默认都在同一个广播域里。路由器能隔离广播域,但交换机不行。
| 对比项 | 冲突域 | 广播域 |
|---|---|---|
| 隔离设备 | 交换机、网桥 | 路由器、三层交换机 |
| 范围大小 | 通常较小(一个端口或一段线缆) | 通常较大(一个VLAN或一个子网) |
| 典型问题 | 冲突导致重传,效率下降 | 广播泛滥,CPU过载 |
| 我见过的坑 | 老式Hub级联,网络慢得像蜗牛 | VLAN没划分,广播风暴全网瘫痪 |
举个例子:你有一台24口交换机,连接了24台电脑。这24台电脑都在同一个广播域里——任何一台发广播,其他23台都得处理。但冲突域呢?交换机的每个端口都是一个独立的冲突域,所以不会出现两台电脑同时发数据撞车的情况。
关键点:交换机隔离冲突域,但不隔离广播域。路由器两者都隔离。
1.3 广播风暴的成因
广播风暴,就是广播帧在二层网络里无限循环转发,越滚越大,直到把网络带宽和交换机CPU全部耗尽。
为什么会这样?我总结了几种常见场景:
- 二层环路:这是最常见的原因。交换机之间形成了物理环路,又没有启用STP(生成树协议)。广播帧从一条路径出去,又从另一条路径回来,然后继续转发……无限循环。
- STP故障:STP本来是用来防环的,但如果STP配置错误、或者交换机CPU过载导致BPDU丢失,阻塞端口突然变成转发状态,环路瞬间形成。
- 网卡故障:我曾经遇到过一次,一台服务器的网卡坏了,疯狂往外发广播帧,每秒几万个。交换机来不及处理,整个广播域都跟着遭殃。
- ARP攻击:有人恶意发送大量伪造ARP广播包,目的就是让网络瘫痪。
下面这张图,是我自己画的广播风暴形成过程,你看一眼就明白了:
你看,三台交换机两两相连,形成了一个三角形环路。主机发一个广播帧,交换机A收到后转发给B和C,B又转发给C和A,C再转发给A和B……每个交换机收到广播帧后,都会复制转发,帧的数量呈指数级增长。几分钟内,带宽就被吃光了。
1.4 广播风暴的危害
广播风暴的危害,我亲身经历过,说几个典型的:
- 带宽耗尽:广播帧占满了所有链路,正常业务数据根本发不出去。你ping网关,延迟从1ms飙升到几千ms,最后超时。
- 交换机CPU过载:交换机收到大量广播帧,CPU忙着处理这些帧,没空管STP、SNMP这些管理协议。你远程登录交换机?想都别想。
- MAC地址表震荡:同一个MAC地址,一会儿从端口1学到,一会儿从端口2学到,交换机不断更新MAC表,性能进一步下降。
- 连锁反应:一台交换机瘫痪,可能影响整个广播域。如果广播域跨了多个VLAN或者通过Trunk互联,那影响范围更大。
真实案例:有一次某数据中心做网络变更,工程师不小心把两根网线插到了同一个交换机上,形成了环路。STP虽然开了,但收敛时间太长——30秒。就是这30秒,广播风暴把整个机柜的网络打瘫了,几十台虚拟机全部断连。后来我们改了配置,启用了PortFast和BPDU Guard,再也没出过类似问题。
1.5 如何判断是否发生了广播风暴
说实话,广播风暴的症状很明显,但新手容易误判。我教你几招:
| 症状 | 判断方法 | 我的经验 |
|---|---|---|
| 所有端口指示灯狂闪 | 看交换机面板,所有端口几乎同时闪烁 | 别慌,先拔掉一根网线试试 |
| ping延迟极高或超时 | ping网关,延迟从正常变成几千ms | 连续ping 10次,看丢包率 |
| 交换机CPU占用100% | 登不上就串口直连,show process cpu | 我习惯用 show interfaces | include broadcast 看广播包数量 |
| 抓包看到大量重复广播帧 | Wireshark抓包,过滤 eth.addr == ff:ff:ff:ff:ff:ff |
同一个广播帧出现多次,基本就是环路 |