资讯动态

802.11 MAC基线:CSMA/CA、帧间隔与24字节帧头解析

发布时间:2026/10/25 12:47:08 来源:尧图企业网站定制
简介这份802.11n标准协议PDF文档面向无线局域网研发、协议分析、测试认证与网络工程学习者系统呈现IEEE 802.11-2007对介质访问控制层和物理层规范的修订、澄清与功能增强。正文围绕多输入多输出多天线技术、2.4GHz与5GHz双频段操作、载波侦听多路访问/冲突避免、动态频率选择、AES与CCMP加密、服务质量、传输功率控制以及国际漫游和设备共存等机制展开适合理解高吞吐无线局域网的协议框架、查阅标准条文并对照设备实现。压缩包共1个PDF文件大小约12.79MB保留原版标准文档的章节、图表与术语体系便于按关键词检索、精读引用和二次整理。已有417人学习可作为802.11n技术入门、工程排错、协议教学和标准演进的参考资料也能为后续802.11ac与802.11ax学习打下基础对撰写技术文档、定位速率与覆盖问题亦有帮助。1. 802.11n 的 600Mbps有一半功劳在 2007 年就定下了很多人把 WiFi 802.11 的速度跃迁归功于 802.11n 标准协议仿佛那是一夜之间换了套架构。翻完这份 2007 年发布的 802.11 合并修订版会发现另一件事n 真正新增的东西并不多——MIMO、40MHz 信道绑定、帧聚合。而它赖以运转的 MAC 骨架包括 CSMA/CA 的竞争规则、24 字节帧头里的每一个比特、块确认的重传窗口在这份文档里已经被写死了。理解了这个基线才会明白为什么后来的 ac、ax 能在物理层上快速迭代却始终绕不开那几个二十微秒的帧间隔。这份资源的价值不在教你怎么连 WiFi它把“为什么必须这么设计”的原始定义清清楚楚地写出来字段、时序、参数表一个不缺。2. CSMA/CA为什么 WiFi 宁可「等」也不「听」共享介质的第一步永远是“谁先说”。有线以太网用的是 CSMA/CD——边发边听听到冲突就立刻停再随机等一会儿重发。无线把 CD 换成了 CA冲突检测换成了冲突避免。这个替换不只是换个词它几乎决定了后面二十年的所有设计。2.1 冲突检测在射频前端为什么做不了以太网能边发边听前提是收发走不同的线对发送的强信号不会反向进入接收端。无线电做不到这一点原因有三层。第一层是半双工与自干扰。发射时功率放大器输出可能是 20dBm而对方信号到达时可能只有 -85dBm两者相差一百多 dB。自己的发射信号会直接灌满接收链路把低噪声放大器推到饱和区此时根本无法听见别人在说什么这是模拟电路层面的问题。第二层是捕获效应。即便强行同时接收两个信号强度不同时就只能解出强的那一个——接收机没有能力对微弱信号做检测和解码连“感觉有东西撞上了”都判断不出来。以太网里的冲突检测本质上是比较电平幅度而无线里的信号幅度随距离衰减得极其剧烈。第三层是时序上根本来不及。有线冲突检测能在几十个比特内发现冲突并中止因为信道上只有这一份能量无线帧一旦发出前导码已经开始被对端解调此时就算发现了冲突也没法“回滚”。所以标准选择了另一条路在发送之前就把冲突概率降下来这就是冲突避免。这个取舍的代价是永久的CD 把冲突变成确定性事件CA 只能把冲突变成概率事件。后面所有的帧间隔、退避、聚合都是在为这个“概率”买单。2.2 SIFS、DIFS 与退避把优先级编码进时间DCF 的核心机制只有一句话先听一段时间再随机等一段时间。神奇的地方在于这两段时间的长度本身就是优先级。PHY 类型时隙 slotTimeSIFSDIFSCWminDSSS / HR-DSSS2.4GHz20 µs10 µs50 µs31ERP-OFDM2.4GHz20 µs10 µs50 µs15OFDM5GHz9 µs16 µs34 µs15帧间隔从短到长依次是 SIFS、PIFS、DIFS、EIFS。SIFS 最短只给 ACK、CTS、分片后续帧这类“必须接在上一帧尾巴上”的响应使用。谁有资格用 SIFS谁就拥有绝对的优先权——因为别人至少要等 SIFS 加上一两个时隙才能发现信道空闲等他们开始退避时使用 SIFS 的帧早已发送完毕。DIFS 等于 SIFS 加两个时隙是普通数据帧的门槛。EIFS 最长专门给“上一帧解错了”的场景用避免连续错误帧把信道占满。退避的规则比想象中精细。第一次竞争时站点从 0 到 CWmin 之间均匀取一个整数乘以时隙长度得到一个倒计时器每经过一个空闲时隙就往下减一格。如果中途听到信道忙计时器冻结而不是清零等信道再次空闲 DIFS 后从冻结的位置继续往下减。这一点很关键如果每次都要清零重来那么高优先级帧只要持续出现低优先级帧就永远等不到机会。import random SLOT 9e-6 # 5GHz OFDM 的一个时隙单位秒 SIFS 16e-6 DIFS SIFS 2 * SLOT # 34 微秒 def backoff_window(cw_min15, cw_max1023, failures0): 第 failures 次重传时的竞争窗口与退避时长 # 每失败一次窗口翻倍15 - 31 - 63 - ... - 1023 cw min((cw_min 1) * 2 ** failures - 1, cw_max) slots random.randint(0, cw) # 闭区间内均匀取整 return cw, slots * SLOT for i in range(5): cw, t backoff_window(failuresi) print(f第 {i} 次尝试: CW{cw:4d}, 最长退避{t*1e6:7.1f} µs)这段代码里唯一需要多想一秒的是那个(cw_min 1) * 2 ** failures - 1。窗口翻倍的本质不是 CW 乘二而是可选槽位数乘二——取值为 0..CW 共 CW1 个整数所以窗口翻倍的数学表达是 CW_new 1 2 × (CW_old 1)移项之后就得到 2×CW_old 1。理解了这一点就不会在实现驱动或仿真时把窗口算成 2×CW。为什么第一次不用 CW0设想两个站点同时结束静默、同时数完 DIFS如果窗口为零它们会在同一个微秒内一起发送冲突必然发生。CWmin 存在的意义就是给“同时听见信道空闲”的多个发射方留出随机错开的余地。2.3 slotTime 的长度不是随便定的时隙必须大于三项时间之和最远站点的信号传播时延、收发机从接收切换到发射的转向时间、以及能量检测电路的判决时间。它是整个竞争机制的“时间量化单位”所有站点都只在这个单位上改变状态。这也解释了为什么 2.4GHz 用 20µs5GHz 只用 9µs。2.4GHz 的覆盖范围通常更大最远客户端的往返传播时延更长同时 2.4GHz 的接收机要在更低的选择性下做能量判决需要更长的观察窗口。5GHz 的蜂窝更小传播时延短硬件性能也更好所以能把时隙压到 9µs。时隙越短退避的平均等待越少空口效率越高——这是一条很隐蔽但很实在的收益。有个常见误解需要澄清不是“5GHz 的帧间隔都比 2.4GHz 短”。5GHz 的 SIFS 反而是 16µs比 2.4GHz 的 10µs 更长因为 OFDM 的收发机转向和信道估计需要更多时间。真正短的是时隙和由它推导出的 DIFS。看到 SIFS 数值反直觉的时候别急着怀疑资料去查对应 PHY 的参数表。2.4 NAV 与 RTS/CTS让看不见的终端闭嘴物理载波侦听只能听见“信号能量”。可有些站点在物理上根本听不见彼此——这就是隐藏终端A 和 C 都能与 B 通信但 A 和 C 相距太远互相听不到。两个人都以为信道空闲同时向 B 发送冲突发生在 B 身上而 A 和 C 完全不知道。解决办法是把“占用时间”写进帧头。每个数据帧的 Duration/ID 字段记录着这次交易从当前时刻算起还要占用信道多久听到这个帧的第三方即使解不出数据内容也能读到这个时长然后把内部的 NAV 计数器设成这个值在此期间不再尝试发送。这叫虚拟载波侦听它把一次物理上的监听扩展成了一次时间上的预约。RTS/CTS 机制把这个能力用得最彻底。A 想发数据先发一个短 RTS里面声明“我打算占用到 T 时刻”B 回 CTS时长覆盖剩余的全部交易C 虽然听不见 A但一定能听见 B 的 CTS于是设置 NAV 保持沉默。两次短帧换来了数据帧不被撞代价是固定的额外空口开销。实际部署里几乎没人常开 RTS因为开销太大。标准里留了一个 RTS 门限参数帧长低于门限就不发 RTS。很多驱动默认把这个门限设成最大帧长等于关闭。真正需要打开它的场景很具体室外桥接、仓库里的大功率 AP 与低功率传感器混布、相邻 BSS 互相干扰但又听不见彼此的客户端。这些场景的共同特点是隐藏终端真实存在这时候打开 RTS/CTS 带来的收益会远大于开销。3. MAC 帧头24 字节里藏着的优先级、聚合与加密物理层负责把比特推出去MAC 层负责决定“这一堆比特算什么”。所有决定权都压缩在帧头那二十几个字节里。看懂帧头抓包时的绝大多数困惑会自己消失。3.1 Frame Control 与 Duration/ID一个字段两种语义Frame Control 是两字节的位域依次是协议版本 2 位、类型 2 位、子类型 4 位、To DS、From DS、More Fragments、Retry、Power Management、More Data、Protected Frame、Order。类型把帧分成管理、控制、数据三大类子类型再细分到 Beacon、ACK、Block Ack、QoS Data 等。那两个 DS 位值得单独说。它们的组合决定了地址字段的含义也给帧头长度带来了两个版本To DSFrom DSAddress 1Address 2Address 3Address 400目的地址源地址BSSID不存在01目的地址BSSID源地址不存在10BSSID源地址目的地址不存在11接收端发送端目的地址源地址只有当帧在两个 AP 之间通过无线分布式系统转发时才会出现第四个地址帧头从 24 字节变成 30 字节。这也是为什么同一个抓包里数据帧长度会不一致——很多人第一反应是“帧格式坏了”其实只是走了不同的转发路径。Sequence Control 是两字节高 12 位是序列号低 4 位是分片号。12 位意味着序列号在 4096 处回绕这个数字直接决定了块确认重排窗口的上限。字段宽度不是随手定的它和后面重传机制的窗口大小是绑死的。Duration/ID 字段的复用是省比特的经典手法。在普通帧里它是 NAV 时长单位微秒最大 32767在节能轮询帧里它变成了关联标识。同一个位置两种含义靠“帧类型”这个上下文来区分。这种设计在标准里反复出现读的时候一定要注意上下文。3.2 QoS Control 与 Block Ack把 N 次竞争压成 1 次一次成功的数据交换固定开销包括 DIFS、平均退避、物理前导码、信号字段、SIFS、ACK、再一个前导码。在 54Mbps 下这些加起来大约 150 微秒而一个 1500 字节的载荷只需要 220 微秒传输。也就是说光是为了“说一句话”有将近四成的时间花在打招呼上。802.11e 引入的 QoS 能力加了两件事。第一件是把优先级真正做成了可配置的四个接入类别各有自己的 CWmin 和仲裁帧间隔语音类的窗口远小于背景类于是高优先级流量的平均退避天然更短。第二件是 QoS Control 字段两字节里塞进了流量标识、应答策略、聚合标志。def parse_qos_control(lo, hi): QoS Control 两字节按位拆解 tid lo 0x0F # 0-15映射到四个接入类别 eosp (lo 4) 0x01 # 服务期结束标志 ack_pol (lo 5) 0x03 # 00 普通 01 不应答 10 不显式应答 11 块应答 amsdu (hi 7) 0x01 # 本帧是否携带聚合 MSDU txop hi 0x7F # 队列长度或 TXOP 时长取决于方向 return dict(tidtid, eospeosp, ack_policyack_pol, amsduamsdu, txoptxop) # TID 到接入类别的默认映射 AC_MAP {1: BK, 2: BK, 0: BE, 3: BE, 4: VI, 5: VI, 6: VO, 7: VO} print(AC_MAP[parse_qos_control(0x06, 0x00)[tid]]) # 输出 VO这段解析里ack_policy是最容易被忽略的一位。它允许发送方说“这一帧你不用单独回 ACK”接收方就靠后续的块确认帧一次性回应一批。标准给出的 TID 到接入类别只是默认映射实际部署里经常按上层标记重新映射这也是为什么同一个抓包在不同设备上看到的优先级可能不一致。块确认把“每帧本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑