2、WiFi协议栈初探:OSI模型与WiFi的关系、802.11标准家族、WiFi帧结构概览
说实话,很多做嵌入式WiFi开发的朋友,上来就撸代码,配网连上了就完事。但一旦遇到丢包、重连慢、广播发不出去,就抓瞎了。为什么?因为你不懂协议栈在底下干了什么。
这一章,我们先把地基打牢。我会带你从OSI模型看WiFi的位置,捋一遍802.11标准家族那些事儿,最后拆一个WiFi帧给你看。嗯,看完这章,你再看抓包软件里的那些十六进制,就不会觉得是乱码了。
2.1 OSI模型与WiFi的关系
OSI七层模型,搞通信的应该都背过。但WiFi到底落在哪几层?我直接说结论:WiFi主要工作在物理层和数据链路层。
你想想看,手机连路由器,本质上是把数据变成无线电波发出去,这是物理层的活。但怎么组帧、怎么寻址、怎么避免碰撞,这些是数据链路层的活。再往上,IP层、TCP层,WiFi就不管了——那是操作系统和协议栈的事。
核心理解:WiFi只负责“把数据从A设备搬到B设备”,不关心搬的是什么。你传的是HTTP网页还是MQTT传感器数据,对WiFi来说都一样,都是二进制比特流。
我个人习惯把OSI模型简化成三层来看WiFi问题:
- 物理层:调制方式、频段、速率。比如2.4GHz vs 5GHz,OFDM vs DSSS。
- MAC层(数据链路层子层):帧结构、寻址、CSMA/CA避让、重传机制。这是WiFi的灵魂。
- LLC层(数据链路层子层):封装上层协议,比如IP包怎么塞进WiFi帧里。
我在项目中遇到过一个问题:某个设备在嘈杂环境下频繁断连。查了半天,发现是物理层速率降得太低,导致MAC层重传超时。如果你不懂这两层的关系,这种问题根本无从下手。
2.2 802.11标准家族
802.11是IEEE制定的无线局域网标准。从1997年诞生到现在,经历了十几代演进。我整理了一张表,把最常见的几个版本列出来:
| 标准 | 频段 | 最大速率 | 调制方式 | 发布年份 |
|---|---|---|---|---|
| 802.11 | 2.4 GHz | 2 Mbps | FHSS / DSSS | 1997 |
| 802.11b | 2.4 GHz | 11 Mbps | HR-DSSS | 1999 |
| 802.11a | 5 GHz | 54 Mbps | OFDM | 1999 |
| 802.11g | 2.4 GHz | 54 Mbps | OFDM | 2003 |
| 802.11n | 2.4 / 5 GHz | 600 Mbps | MIMO-OFDM | 2009 |
| 802.11ac | 5 GHz | 6.9 Gbps | MU-MIMO | 2013 |
| 802.11ax (WiFi 6) | 2.4 / 5 / 6 GHz | 9.6 Gbps | OFDMA | 2019 |
我的建议:做嵌入式配网开发,重点关注802.11b/g/n。这三个标准覆盖了绝大多数IoT芯片(ESP32、RTL8710、MT7681等)的能力范围。WiFi 6虽然好,但目前在低功耗配网场景下还不普及。
802.11n引入了一个关键概念——HT(High Throughput)。它支持20MHz和40MHz带宽,还引入了帧聚合(A-MSDU、A-MPDU)。说白了,就是把多个小包拼成一个大包发出去,减少开销。我在做广播配网时,就利用了这个特性来提升配网包的发送效率。
802.11ac和ax主要面向高速率场景,对配网广播来说,它们的物理层速率太高,反而容易导致兼容性问题。我曾经在调试一款支持ac的模组时,发现它在2.4GHz下回退到n模式时,广播帧的发送间隔会突变——嗯,这就是标准兼容性带来的坑。
2.3 WiFi帧结构概览
WiFi帧是MAC层的核心。不管你是发数据、做扫描、还是配网广播,最终都要封装成WiFi帧发出去。一个标准的WiFi帧长这样:
| 帧控制 (2B) | 时长/ID (2B) | 地址1 (6B) | 地址2 (6B) | 地址3 (6B) | 序列控制 (2B) | 地址4 (6B) | 帧体 (0-2312B) | FCS (4B) |
看着字段多,其实核心就几个:
- 帧控制(Frame Control):2个字节,决定了帧的类型(管理帧、控制帧、数据帧)和子类型。配网广播通常用数据帧或管理帧。
- 地址字段:最多4个地址,分别是接收端、发送端、BSSID、以及中继场景下的源/目的地址。配网广播时,接收端地址填广播MAC(FF:FF:FF:FF:FF:FF)。
- 帧体(Frame Body):真正装数据的地方。配网信息就塞在这里。最大2312字节,但实际受限于物理层速率和信道环境。
- FCS:4字节校验和。如果接收端算出来不对,直接丢帧——这就是WiFi的“沉默式纠错”。
避坑指南:我曾经在配网广播时,把配网数据塞满了2312字节的帧体。结果发现很多老旧路由器会直接丢弃这种大帧。后来我限制在512字节以内,兼容性就好了很多。记住:广播帧没有ACK,丢了就是丢了,所以帧体越小,成功率越高。
WiFi帧分为三大类:
- 管理帧:Beacon(信标)、Probe Request/Response(探测请求/响应)、Association(关联)。配网扫描阶段主要用这类。
- 控制帧:RTS/CTS(请求发送/允许发送)、ACK(确认)。这些帧不装数据,只负责协调信道。
- 数据帧:真正传用户数据的帧。配网广播通常用QoS Data帧,因为它支持更高的优先级。
下面这张图,是我画的一个WiFi帧结构全景图,帮你把刚才讲的这些串起来:
这张图把WiFi帧的各个字段、帧控制展开、帧体展开、以及三大帧类型都串在了一起。你可以把它当成一个速查手册——以后抓包看到一串十六进制,对着这个图就能拆出每一段是什么意思。
嗯,这一章的内容就到这里。OSI模型帮你定位WiFi的层级,802.11标准让你知道你的芯片在用什么协议在跑,帧结构则是你操作WiFi芯片时直接打交道的对象。这三样东西,是后面所有配网广播技术的基础。