1. Wi-Fi 基础与协议栈:从 802.11 说起

做 Wi-Fi 开发这么多年,我始终觉得——不管你是调驱动的、搞应用的,还是做硬件集成的——协议栈的底子越扎实,后面踩坑就越少。这一章咱们先把地基打牢。

1.1 802.11 协议族演进:从 11Mbps 到 Gbps

802.11 协议从 1997 年诞生到现在,已经迭代了二十多年。我最早接触的是 802.11b,那时候觉得 11Mbps 已经很快了。现在回头看,真是恍如隔世。

协议版本 频段 理论速率 关键特性
802.11b (1999) 2.4 GHz 11 Mbps DSSS,早期普及
802.11a (1999) 5 GHz 54 Mbps OFDM,速率提升
802.11g (2003) 2.4 GHz 54 Mbps OFDM,兼容 b
802.11n (2009) 2.4/5 GHz 600 Mbps MIMO,HT40
802.11ac (2013) 5 GHz 6.9 Gbps MU-MIMO,VHT80/160
802.11ax (2019) 2.4/5/6 GHz 9.6 Gbps OFDMA,上行 MU-MIMO
我的经验: 做嵌入式 Wi-Fi 模块选型时,别只看理论速率。802.11n 的 40MHz 带宽在 2.4G 频段很容易被蓝牙和微波炉干扰,实际吞吐量可能还不如 20MHz 稳定。我踩过这个坑。

1.2 2.4G / 5G / 6G 频段特性对比

频段选择直接影响覆盖范围和抗干扰能力。说白了,这就是个物理层面的博弈。

  • 2.4 GHz:穿透力强,覆盖远。但干扰源太多——蓝牙、Zigbee、微波炉、无线鼠标……我在一个智能家居项目里遇到过,2.4G 信道几乎被占满,丢包率飙到 30%。
  • 5 GHz:信道多,干扰少,速率高。但穿墙能力弱。你想想看,隔两堵墙信号就掉一半。
  • 6 GHz:Wi-Fi 6E / Wi-Fi 7 的新战场。频谱干净,带宽巨大。但目前终端支持还不多,做产品要考虑兼容性。
避坑指南: 我曾经在一个工业网关项目里,客户要求 2.4G 覆盖 100 米。结果现场有大量金属货架,信号反射严重,实际覆盖只有 40 米。后来我们加了外置天线和频段切换策略才解决。记住:频段选择要结合现场环境,不能只看规格书。

1.3 CSMA/CA 机制:Wi-Fi 的“礼貌”规则

Wi-Fi 是共享信道,多个设备同时发数据就会碰撞。CSMA/CA(载波侦听多点接入/碰撞避免)就是用来解决这个问题的。

它的核心流程很简单:

  1. 侦听信道:发数据前先听一下,信道忙就等。
  2. 随机退避:信道空闲后,等一个随机时间再发,避免多个设备同时抢。
  3. ACK 确认:接收端收到数据后回复 ACK,发送端才知道发送成功。
  4. RTS/CTS 可选:大包或隐藏节点场景下,先发 RTS 请求,AP 回复 CTS 后再发数据。
注意: CSMA/CA 不是 CSMA/CD(碰撞检测)。Wi-Fi 是半双工的,发的时候没法同时收,所以只能“避免”碰撞,不能“检测”碰撞。这个区别很多初学者搞混。

我调试过一个摄像头卡顿的问题,抓包发现大量重传。原因就是多个摄像头同时抢信道,CSMA/CA 退避算法失效。后来我们调整了每个摄像头的发送优先级和退避参数,问题才解决。

1.4 Wi-Fi 帧结构解析:看懂空口报文

Wi-Fi 帧是协议栈的核心。你调 Wi-Fi 问题,不会看帧结构,就像修车不会看仪表盘。

一个标准的 802.11 数据帧包含:

  • Frame Control (2 字节):协议版本、类型(管理/控制/数据)、To DS / From DS 等。
  • Duration / ID (2 字节):NAV 设置或帧 ID。
  • Address 1-4 (6 字节 × 4):接收地址、发送地址、BSSID 等。
  • Sequence Control (2 字节):帧序号和分片号。
  • Frame Body (0-2312 字节):数据载荷。
  • FCS (4 字节):CRC 校验。
我的习惯: 抓包时先看 Frame Control 里的 Type 和 Subtype。Type=0 是管理帧(Beacon、Probe Response),Type=2 是数据帧。如果数据帧里 To DS=1、From DS=0,说明是 STA 发给 AP 的上行帧。这个判断在排查吞吐量问题时非常有用。
// 一个简化的 802.11 数据帧结构(C 语言风格)
struct wifi_frame {
    uint16_t frame_control;   // 位域:协议版本(2), 类型(2), 子类型(4), ToDS(1), FromDS(1), ...
    uint16_t duration_id;     // NAV 或 AID
    uint8_t  addr1[6];        // 接收地址
    uint8_t  addr2[6];        // 发送地址
    uint8_t  addr3[6];        // BSSID 或目标地址
    uint16_t sequence_ctrl;   // 序号(12) + 分片号(4)
    uint8_t  addr4[6];        // 仅 WDS 使用
    uint8_t  frame_body[0];   // 变长载荷
    uint32_t fcs;             // CRC32
} __attribute__((packed));

1.5 本章知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作 Wi-Fi 基础的地图,后面每一章都会回到这里。

Wi-Fi 基础与协议栈知识体系 Wi-Fi 基础与协议栈知识体系 802.11 协议栈 协议族演进 2.4G / 5G / 6G 频段 CSMA/CA 机制 Wi-Fi 帧结构 核心逻辑 协议演进决定能力上限 → 频段特性影响物理层选型 → CSMA/CA 控制信道访问 → 帧结构是协议栈的“语言” 四者环环相扣,缺一不可。后面每一章都会回到这个框架。

1.6 小结:这一章你该带走什么?

  • 802.11 协议从 b/g/n 到 ax,核心变化在 调制方式、MIMO、信道绑定。
  • 频段选择要权衡 覆盖 vs 干扰 vs 速率,没有万能方案。
  • CSMA/CA 是 Wi-Fi 的“交通规则”,理解它才能看懂重传和延迟。
  • 帧结构是调试的“显微镜”,学会看 Frame Control 和 Address 字段,能解决 80% 的抓包问题。
一句话总结: 基础不牢,地动山摇。这一章的内容,后面 29 章都会用到。建议你花时间把帧结构和 CSMA/CA 彻底搞透,后面调起问题来会顺手很多。