我见过不少朋友拿着手机和测速软件,对着路由器咬牙切齿:标称1200M的无线路由,手机显示满格信号,实测下行速率却连400M都不到。大家习惯把锅甩给穿墙、邻居、运营商,这话确实有道理,但更底层的一个原因很少有人注意到——Wi-Fi和有线以太网在“数据包怎么避免撞车”这件事上,从一开始就选择了完全不同的路线。有线以太网用的是碰撞检测,也就是CSMA/CD,边发边听,撞了立刻收手;Wi-Fi用的是碰撞避免,也就是CSMA/CA,从设计上就不打算靠“撞了再发现”来解决问题。这篇文章我想把这个问题彻底讲透:为什么无线环境没法照搬有线的碰撞检测?802.11的碰撞避免机制到底是怎么撑起来的?它又是怎么影响你家路由器实测速度的?不管你是网络专业学生、靠Wi-Fi吃饭的运维人员,还是单纯好奇速率差在哪里的普通用户,这套机制背后的答案都值得看看。
1. 从CSMA/CD说起:有线以太网当年靠“边发边听”活下来
1.1 共享介质时代:所有人挤在同一根铜缆上说话
很多人现在接触的以太网,早就不是当年的样子了。你家里网线插到交换机上,每个端口独享一条链路,发送和接收是分开的线对,谁也不用跟谁抢。但回到同轴电缆时代,情况完全不同。10Base5、10Base2那一代,一整层楼的电脑都挂在同一根同轴电缆上,谁要发数据,谁都往这根总线上灌信号。那场面就像一层楼只有一部对讲机,所有人都挤在同一个频率上,谁张嘴都能被别人听见。
既然介质是共享的,两个站点同时开口,帧就会在电缆上交叠,变成一堆乱码,这就是以太网口中的“碰撞”。为了提高信道利用率,以太网拿出了一套经典方案:CSMA/CD,中文全称是“带碰撞检测的载波侦听多路访问”。一句话概括它的工作方式:发送前先听,线是空的就发;发送过程中继续听,一旦发现自己发出的信号被搅乱了,立刻停止。
这套逻辑今天看起来理所当然,但它背后其实藏着一个关键假设:发送站点必须有能力感知碰撞结果。这个假设在有线铜缆上成立,所以CSMA/CD活得很好;也是这个假设,在无线环境里彻底失效,才有了Wi-Fi后来抛弃碰撞检测的故事。先把有线的完整机制讲清楚,后面无线的问题就顺理成章了。
1.2 碰撞检测不是玄学:边发边听、阻塞信号与最小帧长
CSMA/CD的核心动作是“边发边听”,这四个字就是它的命根子。以10Mbps以太网为例,发送站点通过网络接口中的收发逻辑,在向外发送电信号的同时,持续监视线路上的电压和电流特征。铜缆是封闭的传输介质,信号被牢牢束缚在导线里,衰减可控、噪声可预测。另一个站点如果同时发送,两个信号会在线上叠加,产生明显的电平异常,收发器很容易识别出“这不是我要发的信号,有人撞上来了”,随即判定碰撞发生。
一旦确认碰撞,发送站要做三件事。第一,立刻掐断发送,避免继续灌数据加重信道混乱;第二,向线路上发送一段阻塞信号,通常是32比特的干扰序列,相当于当众喊一嗓子“刚才撞车了,大家先别发”,让所有站点知道信道刚出了事故;第三,进入退避重传流程,等待随机时长后再尝试。阻塞信号这个细节很多人忽略,但它其实很重要。如果没有它,只有碰撞双方知道信道乱了,远处没参与碰撞的站点还蒙在鼓里,可能继续往混乱的信道上发数据,冲突域就会扩散。
还有一个配套参数值得单独拿出来讲:最小帧长。10Mbps以太网规定最小帧长64字节,为什么偏偏是64?因为在最大冲突域直径约2500米时,一个站点发出的信号跑到最远端再折返,往返时延大约接近512比特时间。如果帧太短,发送站可能已经发完整帧、退出监听了,最后一比特才和别人的信号撞在一起,那次碰撞就彻底漏检了。所以规定最短帧必须覆盖整个最大往返时延,保证发送站在收尾之前一定能撞见碰撞。这个参数是工程师用物理传播时延算出来的,换到千兆以太网半双工模式,冲突域半径变小,但最小帧长约束还在,实在压缩不了帧长就用载波扩展来凑,逻辑一脉相承。
1.3 截断二进制指数退避:碰撞之后的节奏控制
碰撞之后怎么重传,是直接决定信道效率的一道坎。如果不加控制,碰撞双方在同一时刻重发,大概率还是撞在一起,信道会陷入死循环。以太网的办法叫截断二进制指数退避,规则很简洁:假设这是第n次碰撞,就从一个范围里随机选一个数值,范围是0到2的n次方减1,选中的数值乘上固定槽位时间,就是该等待的重发时长。第一次碰撞,在0和1之间二选一;第二次碰撞,从0到3之间选;第三次,从0到7之间选。每个槽位在10Mbps下是51.2微秒,也就是512比特时间。
这个算法的精妙之处在于,碰撞次数越多,随机范围翻倍越大,站点之间再次同时发送的概率被快速摊薄。拿硬币举例子:两个站点撞了第一次,各自在0和1里选,还有50%的概率选到同一个数字;撞到第四次,可选范围是0到15,撞车概率降到了6%左右。等碰撞次数逼近上限,可选范围扩大到0到1023,基本不太可能再撞了。连续尝试16次仍然发不出去,就放弃,把错误交回上层协议处理。
到这里,有线以太网的整套方案已经很清楚:发送前侦听,发送中检测,碰撞后阻塞信号加指数退避,一切建立在“发送端能感知碰撞”的基础上。这套机制非常高效,也足够皮实,所以支撑了以太网三十年。但把它搬到无线环境下时,问题一个接一个地冒了出来。
2. 无线环境为什么做不了碰撞检测:三堵墙卡死了这条路
2.1 隐蔽站:听不见的邻居才是最大的变数
无线场景里首先蹦出来的是隐蔽站问题,也叫隐藏节点问题。假设笔记本A和台式机C都在路由器B的信号覆盖范围内,但A和C之间隔了一堵厚墙,彼此完全听不到对方的发射。现在A要向B发送数据,C对A的传输一无所知,C监听信道时发现信道是“空”的,于是也向B发送数据。结果两个帧在B那里撞个正着,A和C的这次通信双双失败。
更麻烦的是,A和C自己在发送过程中根本感知不到这起碰撞。碰撞发生在B的接收端,而不是A或C的发送端,A听不见C的信号,也不可能知道自己的帧把B的收信搞砸了。这正是碰撞检测在无线里行不通的第一堵墙:CSMA/CD的“听”是听发送端自己的介质,可无线信道是开放广播,节点之间没有物理连接,发送端对碰撞的发生完全没有感知能力。后来标准里专门给这个现象起了名字,叫隐蔽站问题,它是无线局域网设计时绕不过去的第一座山。
2.2 远近效应:弱信号在强信号面前等于不存在
第二堵墙叫远近效应,物理根源是无线电波在空间里的路径衰减。手机离基站近一格信号就强,离远一格信号就弱,Wi-Fi也一样。假设设备A贴着路由器B,设备C站在十米外的墙角,A和C同时向B发包,B收到的信号里A的强度可能比C高出好几个数量级。对B来说,C的帧很可能整个被淹没在A的强信号里,B只能成功解出A的帧,C的帧悄无声息地就丢了。
这个场景和有线形成鲜明对比:同轴电缆上各站点信号到任意点的衰减可以通过工程参数预先估算,强信号不会毫无道理地压掉弱信号;而无线空间里,接收端的信号强弱取决于距离、遮挡、多径反射,链路预算完全是动态的。碰撞检测要求发送端能分辨“自己的信号被别人的信号干扰了”,可在远近效应下,远处的碰撞信号对近处的发送端来说弱到可以忽略,发送端根本无从判断这一帧到底撞没撞。也就是说,即使在无线网卡里硬塞一个“边发边听”的功能,面对这种强弱差异悬殊的场景,它也没有任何可靠的判决依据。
2.3 半双工与自干扰:天线能“喊”就不能同时“听”
第三堵墙最物理,也是最没辙的:绝大多数Wi-Fi网卡是半双工设备,同一根天线要么发射要么接收,不能同时干。当你手头这台笔记本正以几百毫瓦的功率往空气里灌电磁波时,接收链路要么被关闭,要么被自己强大的发射信号彻底淹没。就算硬件强压着再开一路接收,你收到的也主要是自己发射信号的反射和噪声,远处站点那点微弱的碰撞信号早就被压到噪声底之下。
想实现碰撞检测,就必须“边发边听”,而半双工射频链路从根上断了这条路。有人可能会问,那能不能用全双工射频前端?技术上确实在逐步发展,但就算收发同时能做到,开放介质里碰撞发生的物理点和信号叠加状态也不像铜缆那么固定,物理层检测碰撞的可靠性依然存疑。所以从802.11标准的最初设计开始,制定者就果断放弃了“撞了再发现”的思路,把所有努力转向另一条路:大幅降低碰撞发生的概率,碰撞真发生后用确认机制兜底。
3. 802.11的碰撞避免是怎么运作的:DCF、帧间间隔与随机退避
3.1 DCF的基本流程:先听后说、等够了再抢
802.11采用的接入机制叫DCF,全称分布式协调功能。名字听着唬人,拆开看就是一套“所有站点都遵守同一套规矩,谁抢到信道谁说话”的协议。基本流程是:站点要发数据,先做载波侦听,物理层确认信道空闲;空闲之后还不能立刻发,必须再等一段固定长的DIFS帧间间隔,确保信道确实处于稳定空闲状态;如果这段时间内没有其他站点抢,站点才真正开始发送。
为什么必须多等一个DIFS,而不是信道一空就发?如果所有站点都卡在信道变空的那一瞬间同时开火,那跟碰撞检测时代撞成一锅粥没有任何区别。DIFS是一个统一的门槛,让每个站点都在同一个基准线上“起跑”,为下一步的随机退避争取出操作空间。顺便说一句,DIFS的取值不是随手定的,802.11a/g里通常是34微秒,传统802.11b模式则是50微秒,它是SIFS加两个时隙算出来的,整个系统的时序都围绕着这套微秒级节奏展开。
3.2 IFS与NAV:用时间间隔和虚拟载波侦听管理优先级
帧间间隔并不只有DIFS一种,802.11干脆把帧间间隔做成了一个优先级系统。最小的是SIFS,大约16微秒,留给ACK确认帧、CTS应答帧这类必须立刻回复的控制帧;比SIFS长一个时隙的是PIFS,用于中心节点轮询之类的场景;再长一截的是DIFS,普通数据帧发送前必须等;如果之前刚经历过接收错误,还要等更长的EIFS,给出错恢复留出缓冲。这套时间梯度的意义很直观:ACK用最短间隔抢信道,数据帧必须多等一会儿,所以接收方回复确认时几乎总能比下一轮数据帧先发出去,确认信息永远不会被数据风暴饿死。
除了物理侦听,802.11还有一套特别巧妙的虚拟载波侦听机制,叫NAV,网络分配向量。它的工作方式很像“占位符”:发送站在帧头的Duration字段里写明“我要占用信道大约多久”,其他站点听到这个字段后,不管物理层信道上到底有没有实际信号,都直接把自己的计时器顶到那个未来时刻,期间保持静默。物理载波侦听管的是当前信道状态,NAV管的是未来信道占用计划,两者叠加,802.11对信道忙闲的判断就比单纯靠能量检测精准很多。这也是为什么Wi-Fi抗干扰能力看起来还行——很多干扰其实在协议层面就被NAV过滤掉了。
3.3 随机退避与ACK:把“撞了才知道”改成“尽量不撞+事后确认”
有了DIFS和NAV做铺垫,碰撞避免的完整链条就出来了。站点发送数据后,接收站如果正确收到帧,会在SIFS之后回一个ACK确认帧。发送站收到ACK,就知道这趟成了;如果在规定等待时间内没等到ACK,或者收到的是解不出来的乱码,那就认为发生了碰撞或者丢帧,把竞争窗口CW翻倍,再进入随机退避。这里的CW从CWmin起步,802.11a/g里CWmin是15个时隙,撞一次翻一倍,一直翻到上限CWmax,通常是1023个时隙。站点在窗口里随机挑一个数值,数值是多少,就等多少个时隙再重发。
这套机制和有线以太网最大的区别在于:有线是“撞了立刻知道、马上重排”,Wi-Fi是“发送后无法感知碰撞,只能靠ACK的缺席来推断”。用快递打个比方,以太网是开车送货,路上蹭了立刻停车处理;Wi-Fi是叫了个快递,你只能在约定时间等接收方签收的回执单,没收到回执就再寄一次。ACK缺席其实是一个很不完美的信号——帧丢了、被噪声毁了、接收端缓冲区满了、AP调度不过来,都会表现为没回执,Wi-Fi统一按碰撞处理,再来一轮指数退避。“事后确认+随机退避”的组合虽然不像碰撞检测那么精准,却是无线环境下能做出的最务实的妥协。
下面这张表可以更直观地看出有线以太网和Wi-Fi两套机制的差异:
| 对比维度 | 有线以太网(CSMA/CD) | Wi-Fi(CSMA/CA) |
|---|---|---|
| 碰撞发现方式 | 发送端边发边听,实时检测信号异常 | 发送端无法检测,靠ACK超时推断 |
| 碰撞后动作 | 立即停止发送,发阻塞信号,指数退避 | 竞争窗口翻倍,随机退避重传 |
| 信道占用声明 | 无,全靠物理载波侦听 | 物理侦听加NAV虚拟侦听 |
| 事前防护手段 | 依赖检测,不做事前避让 | DIFS、随机退避、RTS/CTS多管齐下 |
| 适用前提 | 介质封闭,信号衰减可控,可同时收发 | 介质开放,信号衰减大,半双工 |
3.4 RTS/CTS:专门给隐蔽站问题开的药方
隐蔽站问题怎么破?802.11给出了一个可选的方案:RTS/CTS,请求发送和允许发送。发送站A在正式发数据之前,先发一个极短的RTS帧,里面写明目标地址和预计占用时长;接收站B收到RTS后,回一个CTS帧,同样在里面写明剩余占用时长。这个CTS帧不只B能听到,B周围所有节点都能听到——包括那个隔着一堵墙的、听不到A的节点C。C听到CTS里写着“信道要忙一阵子”,就把自己的NAV竖起来,老老实实闭嘴等计时结束。
于是A和C虽然互相听不见,却通过B这块“中转牌”达成了默契。A的RTS让B周围的站点知道谁要发,B的CTS让A周围的站点同步闭嘴,碰撞窗口从一整个大数据帧缩小到RTS和CTS两个短帧上。就算RTS和CTS偶尔撞了,损耗的也只是两个短帧的时间,远比一大包数据被撞掉划算得多。这也是为什么标准里有RTS阈值这个参数:数据帧很小的场景,RTS/CTS的固定开销可能比碰撞重传还贵,不如不开;帧越长,开RTS/CTS越划算,典型默认阈值是2347字节,超过这个长度的帧才走RTS/CTS流程。
4. 碰撞避免的成本账:为什么Wi-Fi永远追不上标称速率
4.1 每帧都要付的过路费:前导码、IFS、退避、ACK
原理讲到这里,回到每个用户最关心的问题:为什么Wi-Fi实测速率永远追不上标称值?答案就藏在碰撞避免这套机制本身的成本里。以802.11g时代最常见的1500字节数据帧为例,发这一帧要付的固定成本包括:物理层前导码和PLCP头,大约20微秒;MAC头加帧校验,约34字节;发送前的DIFS和平均半个退避窗口的等待时间;发送完之后的SIFS,16微秒;最后还要加一个完整的ACK帧以及它自己的物理层开销。
把这些固定成本全部折算到数据量里,结果非常惊人。物理速率54Mbps的802.11g,实际极限吞吐只有二十几Mbps,这还没算碰撞重传带来的额外损耗。原因很简单:发一帧数据,真正用于搬运数据的时间不到一半,剩下全在等待、确认、再等待。所以说老标准的“54M”、“150M”标称值并不是厂商撒谎,那是物理层调制速率的理论值;真正到达应用层的有效速率,被MAC层协议开销狠狠砍了一刀。有线以太网没有这么夸张的差距,是因为全双工交换时代早就把载波侦听和ACK手续都免了。
4.2 帧聚合的意义:把固定开销摊薄
802.11n开始引入帧聚合技术,本质就是想办法把上一节说的那些固定成本摊薄。A-MPDU可以把多个数据帧攒成一个大包,一次物理传输发出去,前导码、DIFS、SIFS、ACK都只付一次,成本被几百个帧共同分摊,有效吞吐立刻翻倍再翻倍,A-MSDU则在更高层把多个数据单元合并成一个大的上层载荷。可以说,802.11n比802.11g跑得快的最主要原因之一,就是帧聚合把协议开销的大头压下去了,这甚至比单纯把调制方式升到更高阶更重要。
所以看路由器参数时,别只盯着理论速率和天线数量,支持不支持帧聚合、聚合上限能到多大,对实测速率的影响非常明显。这也是为什么同样标称千兆的Wi-Fi 5路由和Wi-Fi 6路由,实际测速差距能拉得很大——Wi-Fi 6在帧聚合深度、调度机制上做了大幅强化,单位时间里能塞进信道的数据量远超老标准。顺便提一句,Wi-Fi 6里的OFDMA又是一个新维度的优化,它把整个信道切分成多个资源单元,让多个客户端可以在同一时刻用不同频率并行传输,排队等待和随机竞争的比重进一步下降,碰撞概率自然也被压低了。
4.3 现场实测差异:2.4GHz与5GHz的碰撞率差距
另一个肉眼可见的现象是2.4GHz和5GHz的实测差异。2.4GHz频段总共只有1、6、11三个互不重叠的20MHz信道,在公寓楼里,几乎每家路由器都在这三个信道里挤着,一个信道上可能同时有七八个邻居的AP。站点一多,碰撞避免机制开始频繁工作:每个站点都要等更长的退避计时,ACK帧也更容易在路上被干扰,信道有效利用率直线下滑。我在不少实际环境里测过,同样的802.11n设备,在2.4GHz可能只能跑出几十Mbps,而切换到同一个路由器、同一个位置的5GHz频段,速率能直接翻几倍。
原因不全是5GHz可用带宽更大,更关键的是5GHz频段信道数量多、同频干扰源少,碰撞概率低很多。不过5GHz也有短板:信号穿墙衰减比2.4GHz狠,距离一拉开,调制阶数就往下掉,速率降下来之后帧占用信道的时间变长,一次碰撞带来的时间损失也就更大。所以理想的家庭布局往往是:距离近、数据量大的设备走5GHz,距离远、对速率不敏感的物联网设备留在2.4GHz,把碰撞风险高的路径尽量压缩到最短。
5. 原理落到操作:信道规划、设备选型与我的排错习惯
5.1 信道规划:2.4GHz就3个干净信道,别全指望“自动”
这套原理落到实际操作上,第一件事就是信道规划。2.4GHz只有三个互不重叠的信道,也就是1、6、11,优先在这三个里挑一个相对干净的固定下来。别太过信赖路由器上的“自动”选项,自动信道通常只在路由器启动那一刻扫描一次,选的是当时干扰最小的信道,但一天里隔壁邻居的AP开关机、微波炉加热、蓝牙设备占用,都会让信道状况持续变化。我调试网络的习惯是:用手机装一个Wi-Fi扫描工具,看看周围AP都集中在哪些信道、信号强度大概多少,挑一个邻居数量最少、信号也最弱的信道,手动固定。
5GHz的选择余地大得多,36、40、44、48这些基本不重叠,有条件还能往上试DFS信道。但DFS信道涉及雷达共存机制,路由器检测到雷达信号后会自动跳信道,反而可能造成断流。家庭使用优先选36到48这一带、没有雷达探测压力的信道就够稳了。如果家里有两台以上AP,记住AP之间的信道要拉开距离,最好保证互不重叠,否则自己的两个AP先在空气里打起来,那比邻居干扰还冤。
5.2 老设备的拖累与保护机制
第二件事是清理拖后腿的老设备。802.11g保护机制是个非常典型的坑:只要网络里出现一个只支持802.11b的老网卡,整个AP为了兼容它,会在每次帧传输前额外插入RTS/CTS或者CTS-to-self保护信号,所有站点的吞吐集体掉一截。你家里一个十年前的智能插座在2.4GHz上苟延残喘,可能就把一屋子手机拖入慢性降速的状态。解决思路是把不支持5GHz的老设备全部隔离在2.4GHz的SSID里,能换就换,别让一个旧芯片拖累整个网络。
另一个值得琢磨的参数是RTS阈值。默认通常是2347字节,如果网络里的隐蔽站现象特别明显,比如两个终端被墙隔开又经常同时向AP发包,可以把RTS阈值调低到500到1000字节,让更多帧走RTS/CTS保护机制。代价是固定开销上升,所以这需要在碰撞率和开销之间掂量着调,不是越低越好。我一般会先在现场观察一段时间,如果重传率居高不下,再考虑动这个参数。
5.3 个人调试顺序与常见误解
最后分享一下我自己的调试顺序,很多朋友上来就折腾路由器固件,其实错过了一大堆更便宜的优化项。第一步,用扫描工具选信道,把干扰源避开;第二步,把路由器摆到房屋偏中心的位置,远离金属柜和弱电箱,天线尽量竖起来;第三步,把2.4GHz和5GHz分开SSID,逐一检查每个终端真正连接的是哪个频段;第四步,清理上述那些兼容性差的老设备;最后一步,才是考虑升级路由器和调整协议级参数。这五步做完,绝大多数晚上卡顿的问题都能缓解一大半。
还有一个常见误区值得专门提一嘴:满格信号不等于没有碰撞。手机上的信号格数只表示你收到了多少功率,跟信道占用率、碰撞概率没有直接关系。哪怕你在一个塞满邻居AP的2.4GHz信道里,信号显示满格,碰撞率和退避等待照样可能高得吓人。判断一个信道好不好,要看干扰源多不多、NAV被触发的频率高不高,而不是看手机那一格图标。这也是为什么很多用户换了所谓“信号增强”的路由器之后,速度还是上不去的深层原因——你把雷达做得再灵敏,也架不住一整条信道都在堵车。
顺着CSMA/CD和CSMA/CA这组对比,我经常跟朋友说的一句话是:网络协议里没有绝对更好的方案,只有和物理世界匹配的方案。有线铜缆把信号锁在介质里,所以能用廉价可靠的碰撞检测;无线电磁波在开放空间里衰减、遮挡、无法同时收发,所以只能靠随机退避和ACK确认这些“软办法”来维持秩序。写这篇文章的时候我又把自己家里的Wi-Fi重新扫了一遍信道,顺手把路由器从自动信道改成了干扰最小的固定信道,客厅电视会议的时延从35毫秒降到了12毫秒。这种触手可及的改善,恰恰是理解协议背后为什么这样设计带来的红利。下次再遇到Wi-Fi慢,别急着怪运营商,先看看你周围那十几个AP是不是正在某个信道里撞成一锅粥。