3. 扫描与连接机制:主动扫描与被动扫描、Beacon帧与Probe Response帧解析、认证与关联流程

这一章,我们来聊聊WiFi设备是怎么找到网络、怎么连上去的。说白了,就是扫描和连接这两个动作。我做了这么多年无线,发现很多工程师对扫描的理解停留在“发个请求等回复”的层面,但实际调优时,扫描策略选错了,连接成功率能差一大截。

3.1 两种扫描方式:主动 vs 被动

WiFi设备要发现周围有哪些AP(接入点),有两种手段:被动扫描和主动扫描。它们不是互斥的,实际产品里往往是混合使用。

对比项 被动扫描 主动扫描
触发方式 STA(站点)被动监听信道上的Beacon帧 STA主动发送Probe Request帧
AP响应 AP周期性广播Beacon(通常100ms一次) AP收到Probe Request后回复Probe Response
功耗 低(STA大部分时间可休眠) 高(需要发射信号)
发现速度 慢(必须等Beacon周期到来) 快(主动询问,立即响应)
典型场景 手机灭屏待机、IoT低功耗设备 手机亮屏扫描、快速漫游
我的经验: 在智能家居项目中,我遇到过设备连不上WiFi的问题。排查后发现,设备只用了被动扫描,而AP的Beacon间隔被设成了300ms。设备扫描完所有信道要花好几秒,用户体验极差。后来改成“先被动扫描一次,没找到就主动扫描”,问题就解决了。

3.2 Beacon帧:AP的“广播名片”

Beacon帧是AP定期发送的管理帧,相当于AP在喊:“我在这里!这是我的名字和配置!”

它的核心字段包括:

  • SSID:网络名称。如果AP隐藏了SSID,这个字段为空。
  • BSSID:AP的MAC地址,唯一标识。
  • Beacon Interval:发送间隔,单位是时间单位(TU),1 TU = 1.024ms。默认100 TU,约102.4ms。
  • Capability Information:能力信息,比如是否支持WPA2、是否开启802.11n等。
  • Supported Rates:支持的速率集,比如1、2、5.5、11 Mbps(802.11b)等。
  • Country Information:国家码,决定可用信道和发射功率。
  • HT/VHT/HE Capabilities:802.11n/ac/ax的能力字段,包含MCS、信道带宽、空间流数等。

避坑指南: 我曾经调试过一个WiFi吞吐量上不去的问题。抓包一看,AP的Beacon帧里HT Capabilities字段的“40 MHz Intolerant”位被置1了。这意味着AP告诉所有STA:“我不支持40MHz带宽。” 结果所有客户端都退回到20MHz,吞吐量直接砍半。后来在AP配置里关掉这个选项,问题解决。

3.3 Probe Response帧:AP的“应答名片”

当STA发送Probe Request(探测请求)时,AP会回复Probe Response(探测响应)。它的结构和Beacon帧几乎一样,但有一个关键区别:Probe Response是单播的,只发给请求的STA;而Beacon是广播的,发给所有设备。

Probe Request有两种:

  • 广播Probe Request:SSID字段为空,询问“附近有哪些AP?”
  • 定向Probe Request:SSID字段填了具体名字,问“某某AP在吗?”

AP收到定向Probe Request时,即使隐藏了SSID,也会回复Probe Response。这就是为什么隐藏SSID其实并不安全——抓包工具发个定向Probe Request就能拿到SSID。

注意: 有些AP对Probe Request的回复做了速率限制。如果STA在短时间内发送大量Probe Request(比如手机在WiFi列表里疯狂刷新),AP可能会忽略部分请求。我遇到过手机扫描不到AP的情况,最后发现是AP的“Probe Response Flood Protection”阈值设得太低。

3.4 认证与关联:连接的两步走

找到AP之后,STA要连上去,需要经过两个阶段:认证(Authentication)和关联(Association)。很多人把这两个混为一谈,其实它们是不同的。

3.4.1 认证阶段

认证的目的是让AP确认STA的身份。早期WiFi(802.11-1997)只有两种认证方式:

  • 开放系统认证(Open System Authentication):STA发个认证帧,AP直接回复成功。说白了就是“走过场”,没有任何安全校验。
  • 共享密钥认证(Shared Key Authentication):AP发一个挑战文本,STA用WEP密钥加密后返回。AP解密验证。这种方式已经被淘汰,因为WEP很容易被破解。

现在的WiFi(WPA2/WPA3)虽然也走这个认证流程,但真正的安全握手是在关联之后通过4次握手(4-Way Handshake)完成的。所以开放系统认证仍然是主流——它只是“形式认证”,真正的安全交给后面的加密协商。

3.4.2 关联阶段

认证通过后,STA发送Association Request(关联请求),AP回复Association Response(关联响应)。关联成功后,AP会为STA分配一个Association ID(AID),并记录STA的能力信息(比如支持的速率、是否支持省电模式等)。

关联请求里包含的关键信息:

  • Listen Interval:STA在省电模式下能休眠多久(以Beacon间隔为单位)。AP会根据这个值决定是否缓存发给STA的数据。
  • Supported Rates:STA支持的速率集。AP会从中选择双方都支持的速率进行通信。
  • HT/VHT/HE Capabilities:STA的802.11n/ac/ax能力。

我的习惯: 调试连接问题时,我第一件事就是抓包看Association Response里的Status Code。如果返回0,表示成功;如果返回非0值,比如17(拒绝关联),那就要查AP的关联限制——是不是MAC地址过滤、是不是关联数满了、是不是速率集不匹配。

3.5 完整连接流程:一张图说清楚

下面这张图展示了从扫描到关联的完整流程。我建议你把它存下来,调试时对照着看。

WiFi扫描与连接流程 WiFi扫描与连接完整流程 STA(站点) AP(接入点) 1. 发送Beacon帧 被动扫描 2. 发送Probe Request 主动扫描 3. 回复Probe Response 4. 发送认证请求 5. 回复认证结果 6. 发送关联请求 7. 回复关联结果 被动扫描:监听Beacon 主动扫描:发送Probe Request 认证:确认身份(形式) 关联:建立连接上下文

3.6 常见问题与调试思路

最后,我总结几个实际项目中容易踩的坑:

  • 扫描不到AP:先确认AP的Beacon间隔是不是太长(比如超过500ms)。再检查STA的扫描信道列表是否覆盖了AP的工作信道。我遇到过AP工作在信道165(5.8GHz),但STA只扫描了1-11(2.4GHz),当然扫不到。
  • 认证失败:抓包看Authentication帧的Status Code。如果是0但后续连不上,那问题不在认证阶段,而在后面的4次握手。
  • 关联被拒绝:检查AP的关联数上限(Max Association)。有些家用AP只允许32个设备同时连接。另外,速率集不匹配也会导致关联失败——比如AP只支持802.11n,但STA只声明了802.11b速率。
  • 连接慢:如果STA在多个信道间轮询扫描,每次切换信道都要花时间。优化方法是先缓存上次连接的AP信道,优先扫描那个信道。

我曾经踩过的坑: 有个项目,设备连上AP后每隔几分钟就掉线。抓包发现,设备在关联时声明的Listen Interval是10(约1秒),但AP的Beacon间隔是100ms。AP以为设备能休眠10个Beacon周期(约1秒),但设备实际休眠时间更长,导致AP缓存的帧被丢弃,设备收不到数据就认为掉线了。后来把Listen Interval改成2,问题解决。

嗯,扫描与连接这部分就讲到这里。记住一句话:扫描是找路,认证是敲门,关联是进门。每一步都有对应的帧和状态码,抓包看懂了,问题就解决了一半。