很多人觉得WiFi这东西玄乎,明明路由器就摆在客厅,手机连上WiFi、显示一个满格信号,好像这件事就结束了。可你要真问他"手机是怎么连上路由器的""连接过程里到底交换了哪些数据",回答就变得模棱两可。这个系列的定位就是把这些看起来"基础"的东西刨开来讲清楚。今天这篇是第四篇,前几篇我们已经把802.11的物理层、频段、帧格式这些底子打完了,这一篇要解决的是两个核心问题:WiFi这套机制到底是怎么工作的,以及一台设备从空荡荡的无线环境里,到真正接入网络、拿到IP,中间完整经历了哪些阶段。
我会直接从介质访问机制讲起,一路拆到扫描、认证、关联、密钥协商和DHCP。这一套链路搞明白,以后排查无线问题会顺手很多,至少你不会再对着"信号满格但上不了网"这种故障一头雾水。
1. WiFi到底是怎样把话说出去的:CSMA/CA 与 DCF 的基本逻辑
1.1 为什么WiFi说话不能像有线那样"想说就说"
有线的以太网有一个天然优势:数据在网线里传输,一个冲突域里同一时间只有一个人能说话,但冲突检测做起来相对容易,因为发送方发数据的时候可以同时监听线路上的电平变化,一旦发现收发不一致就认为发生了冲突,然后所有节点退避重发。CSMA/CD就是干这个的。
WiFi不一样。无线电波在空气里传播,既有衰减又有反射,发送端发出的信号和接收端收到的信号差别巨大——发的时候自己就在听,但听到的是自己发出去的那份强信号,根本分辨不出远端有没有人和自己撞车。所以,无线根本没法做到"发的时候同时监听"这种全双工检测。理解这一点是理解802.11整个机制的钥匙。
既然冲突检测做不了,那就换个思路:不检测冲突,而是尽量避免冲突。这就是CSMA/CA——Carrier Sense Multiple Access with Collision Avoidance,载波侦听多址接入/冲突避免。这个"避免"和有线网络的"检测"一字之差,差的却是整套协议的骨架。
它的核心逻辑不复杂,说白了就是三条规则:
- 说话之前先听一听信道,如果有人正在用,你就别吱声;
- 信道一旦空出来,不要立刻抢着说,而是随机等一小段时间,降低两个人同时开口的概率;
- 说完一句话之后,对方必须回一个"我收到了"的确认,如果没收到确认,就默认这句话撞车了,然后退避重发。
这三条规则合起来,就是我们常说的DCF,分布式协调功能。它是802.11最基础、也最重要的介质访问方式。整个WiFi的接入和传输都没跳出这个框架。
1.2 帧间间隔和退避算法,WiFi的"礼貌"与"优先级"
CSMA/CA里有个细节很多人第一次学的时候会忽略,就是所谓的帧间间隔IFS。无线协议里每种操作之间必须留出特定的间隙,这个间隙的长短决定了谁的优先级更高。
大概分成这么几类:
- SIFS(短帧间间隔):最短,通常用于高优先级响应,比如收到数据帧后回复ACK、RTS/CTS交换、帧分段后的后续片段。SIFS越短,表示这种帧越"急",谁都不能插队。
- PIFS(PCF帧间间隔):比SIFS长一些,用在AP发起的无竞争轮询里,802.11里很少见到实际应用。
- DIFS(DCF帧间间隔):比PIFS还长,普通数据帧发送之前,节点必须先等一个DIFS。它的长度是SIFS加上两倍的时槽时间。
你仔细品一下就明白这个设计的意图:如果两个节点都想发数据,信道一空,谁先开口?答案是谁都不该立刻开口。大家都先等DIFS,然后再各自随机退避一个"时槽"的整数倍。比如802.11b的时槽是20微秒,802.11a/g/n/ac是9微秒,这个随机退避直接决定了最后的赢家。随机数的上限是CW(竞争窗口),初始值一般从15或31开始,如果撞了,竞争窗口翻倍,最多到1023。这就是二进制指数退避。
我用一个直观点的例子说明整个过程。假设办公室里有A、B、C三台电脑都要往AP发数据,信道此刻是空闲的:
- 三台设备都侦听到信道空了,同时开始等DIFS。
- DIFS结束,三台各自在0到CW之间抽一个随机数,A抽到3、B抽到7、C抽到3(假设时槽9微秒,会有人问我两个3怎么办?)。
- A和C都等到第3个时槽结束,同时开口,撞了。B还在数自己的第7个时槽。
- A和C没收到ACK,把CW翻倍重新抽,B继续等剩下的4个时槽然后成功发送。
- 下一轮里A和C因为CW更大,抽到小随机数的概率变小,再次撞车的概率就被压低了。
这套"随机退避"的巧妙之处,在于它把冲突从"必然"变成了"概率极小"。代价就是信道利用率变低了——大量时间浪费在等待上。这也是为什么后来有了802.11e(WMM)和802.11ax的OFDMA,本质就是在这个"靠自觉"的框架里加优先级和并行。
还有一个经典问题叫隐藏节点。A和C都能听到AP,但A听不到C,两个人都以为信道是空的,结果同时在AP那边撞了。解决这个问题的办法是RTS/CTS握手:A先发一个RTS(请求发送),AP回应一个CTS(允许发送),C也能听到AP的CTS,就知道信道被占用了。这个机制现在很多场景下是关闭的,因为开销太大,但理解它有助于搞懂后续的帧交互过程。
2. 认人之前先递名片:三类802.11帧在接入过程中扮演的角色
介质访问机制决定的是"什么时候能说话",而真正决定"说什么、怎么说"的,是802.11里定义的三类帧:管理帧(Management Frame)、控制帧(Control Frame)、数据帧(Data Frame)。接入过程的每一个阶段,本质都是这些帧在设备之间来回传递。很多刚开始接触无线抓包的人,看到协议分析软件里密密麻麻的帧会发懵,其实你只要按类别去认,很快就能找到规律。
2.1 管理帧:负责建立和维护连接
管理帧是WiFi世界里最"话多"的一类帧,主要工作是建立链路、维持链路和拆除链路。和接入过程直接相关的主要有四类:
- Beacon帧:AP周期性地广播自己的存在,默认大概每100毫秒发一次。Beacon里携带的信息很关键:SSID(如果不隐藏的话)、支持的速率、信道、加密能力、802.11能力集等。它相当于AP站在大街上喊"我在这里,我叫XX,我会这些功能",客户端听到之后就知道附近有个网络。
- Probe Request/Response:主动探测帧。客户端主动发一个"有没有人叫XX?"或者"附近都有谁?"的请求,AP收到后回一个Probe Response,内容基本类似Beacon。
- Authentication Request/Response:认证帧。注意这里说的是802.11链路层的认证,它不负责"密码对不对",只负责"身份能不能被接受"。绝大多数家庭场景用的是开放认证,意思是谁都可以来,真正的密码校验在后面的四次握手里做。
- Association Request/Response:关联帧。这是接入过程的"准入门槛"阶段。客户端把自身的能力信息发给AP,比如支持的速率、监听间隔、是否支持802.11n/ac/ax、带宽能力等,AP决定同意还是拒绝。关联成功之后,AP才会为这个客户端建立转发表项,数据帧才真正能跑起来。
除了这几个,还有Disassociation(解除关联)、Deauthentication(解除认证)这些用于拆链的帧。以后排查"为什么设备被踢下线"的时候,去抓一下管理帧就能看到是AP单方面发的解除认证,还是客户端自己发的,定位起来会比靠猜有效率得多。
2.2 控制帧和数据帧:保障传输可靠性的配角
控制帧主要用来辅助数据帧的传输,最常见的两个角色是ACK和RTS/CTS。前面提到的CSMA/CA里,一个数据帧发送成功之后,接收方必须回复ACK。这个ACK就是一个控制帧。发数据的人如果在一个短时间内没等到ACK,它会默认发送失败,触发重传机制。
这也是WiFi和有线网络一个很微妙的区别:有线以太网帧丢了就丢了,靠上层TCP或者应用层去兜底;而WiFi在链路层就自带确认和重传,实时性要求高的场景(比如语音)就依赖这层保障。
数据帧则是真正承载上层数据的帧。802.11的数据帧地址字段比较特殊,它和以太网帧不一样,有Address 1到Address 4四个地址字段,分别对应接收方、发送方、源地址、目标地址,最常用的三地址模式用在普通ST和AP之间通信:Address 1是AP的MAC、Address 2是客户端的MAC、Address 3是网关或服务端的MAC。抓包看得多了,你一眼就能从这三个地址判断出数据是上行还是下行。
搞清楚了帧的类型和用途,接下来正式拆解接入的完整过程。
3. 手机连路由器的完整过程:从扫描到拿到IP一步一步拆
3.1 扫描阶段:被动听广播还是主动问路
设备要连接一个WiFi网络,第一步是发现网络。这一步叫扫描(Scan),有两种方式。
被动扫描,是客户端在信道上待着,静静收听AP周期性发出来的Beacon帧。这种方式省电、不占用信道资源,但慢,因为Beacon是每隔100毫秒才发一份,如果这一轮没等到,要再等下一个周期。主动扫描,则是客户端主动发送Probe Request帧,然后等周围的AP回Probe Response。这种方式快,而且不仅能找到广播SSID的网络,还能找到隐藏SSID的网络,代价是多消耗一点电,以及会暴露你搜索的历史。
现实中手机是怎么做的?大多数终端是两种方式混着用。比如Android系统在开启WiFi时,会对每个信道发送Probe Request,希望快速得到回应;而iPhone在某些系统版本下也会主动发送Probe。这也是为什么你在路由器后台里经常看到一些从没连接过的设备的探测记录,它们就是主动扫描留下的痕迹。有时候机场、商场会基于这个原理做客流统计,虽然现在看来隐私上有争议,但技术逻辑确实是这么回事。
有一个细节值得注意:主动扫描发出的Probe Request里,一般会携带一个"我想要连的SSID列表",也就是设备历史上保存过的WiFi名称。这会导致一个问题,攻击者可以用一个假的SSID来诱导设备自动连接。所以新版本的手机系统在发送主动探测时,通常会发一个不含SSID的裸请求,或者做随机化处理,AP收到这种请求会直接回复自己所有的网络信息,终端再决定用哪个。
3.2 认证阶段:链路层的"打个照面"
扫描到目标网络之后,终端进入认证阶段。802.11最初设计了两类认证方式:开放系统认证和共享密钥认证。共享密钥认证现在几乎已经废弃了,因为它基于WEP,安全漏洞太大。现在绝大多数场景下用的都是开放系统认证。
开放系统认证的过程极其简单,只有两步:
- 客户端向AP发送Authentication Request,里面填一个认证算法编号,开放系统就是0。
- AP回复Authentication Response,状态码是成功,就算认证通过。
注意:这两个帧里完全没有密码这种东西。它就是链路层的"打个照面",让AP确认"你是802.11设备,准你进入下一步"。真正要验明正身,是在关联完成之后做加密认证,家庭场景里就是WPA2/WPA3的握手。很多教程把"认证"和"加密认证"混为一谈,这是排查问题时要特别注意的一个坑——你在路由器后台看到"认证失败",不一定说的是802.11认证失败,更多时候是WPA2四次握手没跑通。
3.3 关联阶段:向AP正式"报到"
认证通过后,客户端会发一个Association Request给AP。这个帧里带的信息很多,包括:
- 客户端支持的速率集合;
- 是否支持802.11n/ac/ax,支持的MCS速率;
- HT/VHT/HE能力字段,比如信道带宽、空间流数量、是否支持MU-MIMO;
- 监听间隔(Listen Interval),告诉AP自己多久听一次Beacon,AP据此决定是否缓存组播帧;
- SSID,告诉AP自己要加入哪个网络。
AP收到后会检查这些能力,决定是否接受关联请求。如果同意,就回复Association Response,里面包含一个Association ID(AID),相当于AP给客户端分配的一个"编号",后续AP的帧里会用到这个编号来做省电管理和缓存。关联成功后,无线链路这一层才算建立起来,数据帧有了落脚的通道。
注意一点:关联成功不等于能上网。它只是说"你被允许在这张无线网络里待着了",至于你有没有权限访问外网、拿不拿得到IP、认证没认证,那都是后面的事情。
3.4 加密与密钥协商:WPA2四次握手和WPA3的SAE
关联成功之后,接下来是真正的安全检查。这一步对家庭网络来说,几乎决定了你能不能最终用上这个WiFi。
如果是WPA2-Personal,那么客户端和AP会进入四次握手流程。四次握手的目标是验证双方是否持有相同的预共享密钥(PSK,也就是你输入的WiFi密码),并且基于这个PSK生成会话密钥PTK(成对临时密钥)。
具体过程拆开看:
- 第1次握手:AP发送一个随机数,叫ANonce(AP Nonce),发给客户端。
- 第2次握手:客户端收到后用自己生成的SNonce(STA Nonce)加上PSK,推导出PTK,然后发送一条消息给AP,里面包含SNonce和MIC(消息完整性校验码)。MIC的作用是证明"我知道密码"。
- 第3次握手:AP验证MIC之后,确认客户端密码正确,于是自己也生成同样的PTK,然后发送一条带有GTK(组临时密钥,用来加密AP发给所有人的广播/组播流量)的消息给客户端,这条消息用PTK加密,并带MIC。
- 第4次握手:客户端确认收到GTK,回复一条确认消息。四次握手完成。
如果你接入的WiFi是WPA2-Personal,而你在抓包里砍掉了中间某一帧(比如第3次握手没收到),客户端就会卡在"正在获取IP地址"之前的状态,表现就是连上WiFi但上不了网,或者干脆一直转圈。
WPA3-Personal就不同了。它把PSK换成了SAE(Simultaneous Authentication of Equals),俗称Dragonfly握手。这个握手在执行上更复杂,双方互相提供随机数、再通过密码推导出相同的密钥,而且支持前向保密,即使握手过程被截获,也很难被离线暴力破解。WPA3在抗暴力破解这条路上明显比WPA2往前走了一大步。
如果是企业级网络(WPA2/WPA3-Enterprise),那这个过程还要加上802.1X的EAP认证,客户端要跟RADIUS服务器交互,验证的是用户名密码或证书,细节更多,但这篇先不展开。
3.5 网际层接驳:DHCP获取IP
密钥协商完成之后,客户端和AP之间的链路已经处于一个可以传输数据的状态。此时,客户端还缺一个IP地址。它会在新链接上发出DHCP Discover广播,寻找网络里的DHCP服务器。这个请求会通过AP转成普通的以太网帧,发到有线侧,最终由路由器上运行的DHCP服务响应。
DHCP的完整过程是Discover、Offer、Request、Ack四步,这一步和有线网络的DHCP没有本质区别。我见过很多人把"WiFi连接成功"和"能上网"画等号,结果排查到一半发现,问题压根不在无线侧,而是DHCP池满了,或者AP的网口没有拿到有效的上行链路。所以排查无线故障时,我习惯先分清故障落在哪一层:链路层、网络层还是业务层。
4. 实战中常见的问题:连不上、掉线、漫游不切换
理论那套讲完了,接下来是这些年实际排查无线故障时攒下来的一些经验,全按问题表现来分类,方便你直接用。
4.1 连不上WiFi,卡在"正在连接"或者"已保存"
如果你排查这类问题,可以先按接入过程把阶段拆开,用协议分析软件抓包,或者到路由器后台看日志,判断卡在哪一步:
- 如果抓不到Probe Request,说明客户端根本没在主动扫描,大概率是终端侧的WiFi开关、飞行模式、或者省电策略的问题。
- 如果客户端一直在发Authentication Request但AP不回,先检查AP端是不是做了MAC地址过滤,或者开放系统认证被关掉了。
- 如果认证和关联都完成了,但WPA2四次握手总是失败,那就要查密码是不是一致,注意有一种情况是WiFi名称相同但加密方式不同(比如老路由器是WEP,新路由器是WPA2),手机会自动试老的配置,结果一直握手失败,这时需要忽略该网络重新输入密码。
- 如果握手成功但拿不到IP,大概率是DHCP问题,去路由器后台看DHCP服务开没开、地址池是否耗尽、是不是开了网段隔离。
这里有一个经常踩的坑:隐藏SSID。很多人觉得把SSID隐藏起来就安全了,其实不然。客户端要连接隐藏SSID,必须靠主动扫描发送指定名称的Probe Request,这个请求反而是把要连接的SSID广播出去了,等于掩耳盗铃。而且隐藏SSID会导致漫游变慢,因为AP的Beacon里不携带网络名称,新来的终端要找到这个网络只能靠主动探测,效率明显下降。我的建议是,除非有特殊原因,否则不要隐藏SSID。
4.2 信号满格但网速很慢,甚至频繁掉线
"信号满格"是一个最容易误导人的指标。手机显示的信号强度是接收到的AP信号强度(RSSI),但它不反映干扰和信道质量。很多情况下信号满格,信道利用率已经高得离谱。
我实测下来最典型的场景是上下楼层住在同一频段、同一信道的邻居AP互相干扰。2.4GHz频率下,可用的不重叠信道只有1、6、11三个,如果一群人全扎在信道1上,就算你家路由器离你只有三米,依然会因为信道忙导致延迟飙升、重传率居高不下。
排查手段不复杂。你可以用无线协议分析工具或者频谱分析仪看一下周围AP的信道占用,把自家的信道改到最空闲的那个上去。如果家里设备多,优先把支持5GHz的设备全部切到5GHz,2.4GHz留给老设备和远距离设备。信道带宽的设置也要考虑环境:在空旷环境下80MHz甚至160MHz带宽能跑出很高的速度,但高楼密集的居民区里,宽信道反而更容易被干扰吞掉,这时候退回40MHz往往更稳定。
掉线这块常见的根因有这么几类:
- 客户端省电模式导致丢包。手机为了省电,会周期性进入Doze模式,AP侧虽然会缓存发往沉睡设备的帧,但有些老旧AP实现不完善,导致缓存数据丢失。表现为设备待机一段时间后唤醒,应用刷新失败。
- 漫游不积极。大多数手机默认的漫游阈值是-70dBm左右,也就是说只有在信号降到很低时才会考虑切换。问题在于,手机可能连着信号弱但还能勉强用的旧AP,而不去切换到一个信号更好的AP。这种情况下,可以在AP端配置802.11k/v/r增强漫游,开启802.11v让AP主动建议客户端切换,配合802.11r做快速握手。
- 信道拥挤导致的重传风暴。这种情况下数据帧会大量重传,干扰源很多,比如USB 3.0设备、微波炉、蓝牙设备都可能踩在2.4GHz上。能换5GHz就换5GHz。
4.3 抓包定位的解密难题
做WiFi问题排查,抓包是少不了的。很多人第一次抓无线包时最大的困惑是:我抓到了一大堆802.11帧,但看不懂里面的内容。原因很简单,你的无线网卡如果以普通模式工作,只能收到发给自己的和广播的数据帧。要把所有数据抓下来用于分析,必须把网卡设置成监听模式(Monitor Mode),并且注意AP如果开了加密,默认情况下抓到的数据帧.payload是乱码,需要你在协议分析软件里配置对应的密码(SSID+PSK)才能解密。
我这边的经验是,排查接入问题主要看管理帧和控制帧,不需要解密也行;但如果要排查应用卡顿,就必须解密数据帧,否则只能看到一堆加密后的密文。而且要注意,现在的固定终端网卡不一定支持监听模式,很多USB无线网卡驱动也有这个限制,需要专门找支持这个模式的网卡和驱动。
下面是常见的几类故障对应的分析重点,整理成一张速查表:
问题表现 | 优先排查的管理帧/握手 | 常见根因 卡在连接中 | Authentication/Association Response状态码 | MAC过滤、AP达到连接数上限、终端兼容性 提示密码错误 | EAPOL四次握手的失败通知 | PSK不一致、路由器加密类型设置与终端老配置不一致 连接后无IP | DHCP Discover/Offer包 | DHCP池耗尽、VLAN隔离、AP上行口未通 连接后频繁掉线 | Deauthentication/Disassociation | AP空口拥塞、终端省电策略、802.11r配置不当 漫游不切换 | 无Beacon报头中的BSSID变化 | RSSI阈值设置、相邻AP信道干扰、802.11k邻居报告未开
4.4 一些经验性的建议
根据我在实际项目中的排障经验,给几个建议供参考:
- 所有故障排查的第一步,先画拓扑。确认终端是连到哪个AP的、上行链路是否正常、DHCP在哪个设备上。很多问题不查拓扑直接抓包会走弯路。
- 碰到加密不通的问题,先建一个临时开放网络做对照测试。如果开放网络能正常拿到IP,问题基本锁定在加密握手环节;如果开放也不通,那就往关联和DHCP这个方向挖。
- 别一上来就怀疑信号弱。大部分"信号满格但体验差"的问题,是干扰导致的,不是覆盖问题。先看信道占用,再考虑加AP或调整摆放位置。
- 记住一个原则:WiFi问题九成出现在接入层,而不是数据传输层。这句话帮我省了很多无用功。
5. WiFi 6、WiFi 7来了,这套老机制还能走多远
写到这里,有人一定会问:WiFi 6和WiFi 7都已经在用了,OFDMA、MU-MIMO、TWT这些新技术听起来和本文这套基于CSMA/CA的老机制完全是两码事,是不是以后这套基础就可以不学了?
我的看法恰恰相反。OFDMA确实让多个用户在同一个时间段内共享信道,不再需要每个人都等退避周期,MU-MIMO也允许同一时间多个终端并行传输,TWT更是让终端可以预约时间休眠。这些技术大幅提高了空口利用率和能效,但它们并没有推翻802.11的基本框架。前导码侦听还在、SIFS/DIFS还在、ACK确认机制还在,基础的管理帧、认证关联流程也依然存在。WiFi 7里的MLO(多链路操作)虽然允许终端同时连两个频段,但每一条链路上的介质访问依然是基于DCF的改进版本。
所以,搞懂这篇文章里讲的原理,在WiFi 6/7时代依然有直接的价值。比如你在看OFDMA的资源调度参数时,如果不知道竞争窗口和优先级机制是怎么工作的,就很难理解为什么某些流量会被调度到更短的时槽,也就难以真正调优。基础之所以是基础,就在于它虽然旧,但一直存在。
这个系列后面我打算再写几篇,把WPA2/WPA3的握手细节、WiFi 6关键特性、以及无线网络调优的实战方法展开讲讲。写这篇文章的过程中,我自己的一个体会是:很多看似高深的无线问题,追到底都是今天讲过的这些基础知识在起作用。有时我也感叹,早几年如果我能把无线接入过程背得滚瓜烂熟,后面查那几次疑难故障至少能快一半时间。
最后分享一个我常用的排障小技巧。如果你手头有支持监听模式的无线网卡,建议把抓包数据先按管理帧过滤出来,然后再按帧类型分类统计,你会发现很多问题的线索远比你想象的更直白。先把文里讲的帧类型搞清楚,在抓包时它们就是你的导航地图。