
很多人觉得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越短表示这种帧越急谁都不能插队。PIFSPCF帧间间隔比SIFS长一些用在AP发起的无竞争轮询里802.11里很少见到实际应用。DIFSDCF帧间间隔比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.11eWMM和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自己多久听一次BeaconAP据此决定是否缓存组播帧SSID告诉AP自己要加入哪个网络。AP收到后会检查这些能力决定是否接受关联请求。如果同意就回复Association Response里面包含一个Association IDAID相当于AP给客户端分配的一个编号后续AP的帧里会用到这个编号来做省电管理和缓存。关联成功后无线链路这一层才算建立起来数据帧有了落脚的通道。注意一点关联成功不等于能上网。它只是说你被允许在这张无线网络里待着了至于你有没有权限访问外网、拿不拿得到IP、认证没认证那都是后面的事情。3.4 加密与密钥协商WPA2四次握手和WPA3的SAE关联成功之后接下来是真正的安全检查。这一步对家庭网络来说几乎决定了你能不能最终用上这个WiFi。如果是WPA2-Personal那么客户端和AP会进入四次握手流程。四次握手的目标是验证双方是否持有相同的预共享密钥PSK也就是你输入的WiFi密码并且基于这个PSK生成会话密钥PTK成对临时密钥。具体过程拆开看第1次握手AP发送一个随机数叫ANonceAP Nonce发给客户端。第2次握手客户端收到后用自己生成的SNonceSTA 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换成了SAESimultaneous 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的设备全部切到5GHz2.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是乱码需要你在协议分析软件里配置对应的密码SSIDPSK才能解密。我这边的经验是排查接入问题主要看管理帧和控制帧不需要解密也行但如果要排查应用卡顿就必须解密数据帧否则只能看到一堆加密后的密文。而且要注意现在的固定终端网卡不一定支持监听模式很多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关键特性、以及无线网络调优的实战方法展开讲讲。写这篇文章的过程中我自己的一个体会是很多看似高深的无线问题追到底都是今天讲过的这些基础知识在起作用。有时我也感叹早几年如果我能把无线接入过程背得滚瓜烂熟后面查那几次疑难故障至少能快一半时间。最后分享一个我常用的排障小技巧。如果你手头有支持监听模式的无线网卡建议把抓包数据先按管理帧过滤出来然后再按帧类型分类统计你会发现很多问题的线索远比你想象的更直白。先把文里讲的帧类型搞清楚在抓包时它们就是你的导航地图。