2、广播帧结构:以太网广播帧格式、广播MAC地址、广播帧与单播帧的区别

聊广播丢包,你得先搞清楚广播帧长什么样。说白了,广播帧就是以太网帧的一个特殊变种。我刚开始做网络运维那会儿,抓包看到一堆目的MAC是 ff:ff:ff:ff:ff:ff 的帧,还以为是设备坏了。后来才明白,这就是广播帧的身份证。

2.1 以太网广播帧格式

以太网帧的结构其实很固定。IEEE 802.3 标准定义了一个基础模板,广播帧和普通数据帧共用这个壳子。区别就在目的MAC地址那一栏。

标准的以太网帧长这样:

字段 长度(字节) 说明
前导码(Preamble) 7 同步时钟用,接收端靠它锁定比特流
帧起始定界符(SFD) 1 标记帧正式开始,固定值 0xD5
目的MAC地址 6 广播帧这里填 ff:ff:ff:ff:ff:ff
源MAC地址 6 发送设备的真实MAC
类型/长度(EtherType) 2 标识上层协议,比如 0x0800 是IPv4
载荷(Payload) 46~1500 实际数据,不够46字节要填充
帧校验序列(FCS) 4 CRC32校验,检测传输错误

广播帧和普通帧的唯一区别,就是目的MAC地址这个字段。其他字段完全一样。嗯,这里要注意:前导码和SFD在物理层就被剥离了,抓包软件里通常看不到它们。

关键点:广播帧的载荷部分可以携带ARP请求、DHCP发现、NetBIOS名称查询等协议数据。我排查过一起广播风暴,就是某个网卡故障,疯狂发送目的MAC为 ff:ff:ff:ff:ff:ff 的ARP请求,把整个接入交换机的CPU打满了。

2.2 广播MAC地址

广播MAC地址是一个保留地址。它的二进制形式是全1,十六进制就是 ff:ff:ff:ff:ff:ff。你想想看,48位全是1,任何网卡收到这个地址,都必须无条件接收。

为什么网卡会认这个地址?因为网卡硬件里有个过滤机制。正常情况,网卡只接收三种帧:

  • 单播帧:目的MAC等于自己的MAC
  • 组播帧:目的MAC属于自己订阅的组播组
  • 广播帧:目的MAC是 ff:ff:ff:ff:ff:ff

这个过滤是在硬件层面完成的,不经过CPU。所以广播帧对接收端来说,处理开销其实很小——硬件直接放行,丢给协议栈去处理。

个人经验:我曾经在数据中心里见过一个奇葩问题。某台服务器的网卡驱动把广播MAC地址过滤掉了,导致这台机器收不到任何ARP响应。排查了三天,最后发现是驱动参数 rx-flags 里把 BROADCAST 位给清了。所以啊,广播地址虽然简单,但驱动层和虚拟化层经常出幺蛾子。

2.3 广播帧与单播帧的区别

这两者的区别,说白了就是接收范围和处理方式完全不同。我列个表,你一看就明白:

对比维度 广播帧 单播帧
目的MAC地址 ff:ff:ff:ff:ff:ff 具体设备的MAC
接收范围 广播域内所有设备 仅目标设备
交换机处理 泛洪到所有端口(除入端口) 查MAC表,只转发到对应端口
CPU开销 所有设备都要处理 仅目标设备处理
典型协议 ARP、DHCP、RIP TCP、UDP数据流
丢包影响 可能导致整个子网通信异常 仅影响单个会话

这里有个容易踩的坑:广播帧在交换机上会被泛洪。什么意思?就是交换机收到广播帧后,除了接收端口,其他所有端口都会复制一份发出去。如果广播帧太多,交换机的背板带宽就被占满了。这就是广播风暴的根源。

避坑指南:我曾经在维护一个园区网时,发现核心交换机CPU飙升到90%。抓包一看,每秒有超过10万个广播帧。原因是某台Windows服务器中了蠕虫病毒,疯狂发送ARP广播。解决办法是在接入交换机上配置风暴控制(storm-control),限制广播帧的速率。这个配置我现在每台交换机必做。

2.4 广播帧的生存范围

广播帧有一个重要特性:它不会跨越三层设备。路由器默认会丢弃广播帧,所以广播域被限制在一个子网内。这也是为什么我们说“广播域 = 二层网络”。

但这里有个例外——DHCP中继。DHCP请求是广播帧,但路由器可以通过配置中继代理,把广播转换成单播转发给远端的DHCP服务器。这个机制在大型网络里很常见。

我画了一张图,帮你理清广播帧的转发路径:

广播帧转发路径示意图 发送端 MAC: AA:AA:AA:AA:AA:AA 广播帧 目的MAC: FF:FF:FF:FF:FF:FF 交换机 接收端1 MAC: BB:BB:BB:BB:BB:BB 接收端2 MAC: CC:CC:CC:CC:CC:CC 接收端3 MAC: DD:DD:DD:DD:DD:DD 路由器 不转发广播帧 说明: 1. 发送端发出广播帧,目的MAC为全F 2. 交换机收到后,向所有端口泛洪(除入端口) 3. 广播域内所有设备都会收到并处理该帧 4. 路由器默认丢弃广播帧,广播域被限制在子网内

2.5 广播帧与丢包的关系

回到我们的课程主题——广播丢包。广播帧的丢包原因和单播帧不太一样。我总结了几种常见场景:

  1. 交换机端口广播限速:如果配置了风暴控制,超过阈值的广播帧会被直接丢弃。这是正常行为,但有时候阈值设得太低,会导致正常的ARP请求也被丢掉。
  2. CPU过载丢包:广播帧太多,设备CPU来不及处理,协议栈的接收队列满了,新来的广播帧就被丢弃。我见过一个极端案例,某台低端交换机每秒收到5万个广播帧,CPU直接100%,连STP BPDU都丢了。
  3. 缓冲区溢出:交换机的共享缓冲区被广播帧占满,导致其他正常数据帧也被迫丢弃。这个在入门级交换机上特别常见。
  4. VLAN隔离:广播帧只在同一个VLAN内传播。如果设备不在同一个VLAN,广播帧根本过不去。这不是丢包,是设计如此,但很多人误以为是丢包。

排查小技巧:当你怀疑广播丢包时,先做两件事。第一,在交换机上执行 show interface counters 看广播帧计数。第二,用Wireshark抓包,过滤条件写 eth.dst == ff:ff:ff:ff:ff:ff,看看广播帧的速率和来源。这两步能帮你快速定位问题范围。

广播帧虽然简单,但它是二层网络通信的基石。没有广播,ARP学不到MAC,DHCP拿不到IP。但广播太多,网络又会被拖垮。这个平衡点,就是我们做网络运维要把握的关键。