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(载波侦听多点接入/碰撞避免)就是用来解决这个问题的。
它的核心流程很简单:
- 侦听信道:发数据前先听一下,信道忙就等。
- 随机退避:信道空闲后,等一个随机时间再发,避免多个设备同时抢。
- ACK 确认:接收端收到数据后回复 ACK,发送端才知道发送成功。
- 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 基础的地图,后面每一章都会回到这里。
1.6 小结:这一章你该带走什么?
- 802.11 协议从 b/g/n 到 ax,核心变化在 调制方式、MIMO、信道绑定。
- 频段选择要权衡 覆盖 vs 干扰 vs 速率,没有万能方案。
- CSMA/CA 是 Wi-Fi 的“交通规则”,理解它才能看懂重传和延迟。
- 帧结构是调试的“显微镜”,学会看 Frame Control 和 Address 字段,能解决 80% 的抓包问题。
一句话总结: 基础不牢,地动山摇。这一章的内容,后面 29 章都会用到。建议你花时间把帧结构和 CSMA/CA 彻底搞透,后面调起问题来会顺手很多。