Table of Contents

802.11 无线网络参数解惑

by 盖子 (biergaizi)

在 802.11 无线网络的 AP 配置选项中,有许多令人费解的高级参数。本文档对这些参数进行了简明叙述,帮助系统管理员根据环境对无线网络进行调优。需要注意的是,但仅仅是面向用户和系统管理员的简介,虽然我会努力保证本文档的内容正确,并它不是一份 802.11 协议指南,若对协议有疑问请直接参阅 IEEE 资料。也欢迎提交修改建议。目前文档还未编写完成。

Beacon Interval

一个 AP 会不断发出 Beacon 向外界宣布自己的存在。除了 SSID、加密选项等元数据之外,在 802.11 帧传递给设备之前,会暂时存储在 AP 的缓冲区中。因此,Beacon 中还携带着 TIM(Traffic Indication Map),负责告知设备是否有待收消息。这样的设计允许设备暂时进入睡眠状态节约电能。TIM 的数据结构是 bitmap,故得名为 map。

图中是一个简单概念演示(但过度夸大了,因为 Beacon 速度 c 可忽略不计)

每隔一段时间,AP 就会发出一个 Beacon 帧。这段时间间隔就是 Beacon Interval,它的计量单位为「时间单位(Time Unit)」,一个 TU 等于 1.024 ms。Beacon Interval 的默认值通常为 100,也就是每隔 102.4 ms 发送一个 Beacon。

当信号弱、干扰大时,Beacon 将更加容易丢失,从而让设备更难发现 AP 的存在,同时设备查收消息也会更加困难,引起掉线、丢包等问题。如果需要进行优化,可以将 Beacon Interval 设置为 50,并在此基础之上进一步下调,过度下调会使开销大大增加,让 AP 花费更多的时间传输 Beacon 而不是实际数据,还会增加设备的唤醒次数,增加电能消耗。相反,如果通讯情况良好,则可以上调 Beacon 降低额外开销,降低电能消耗,但过度上调会引起掉线、丢包等问题。

DTIM Interval/Period

多播和广播信息也是使用类似 TIM 的方式进行传输的,但是它们并不包含 TIM 中,而是包含在 DTIM(Delivery Traffic Indication Message)中。Beacon 中通常携带的是 TIM,但有时携带的是DTIM。

DTIM 出现的频率由 DTIM Interval/Period 控制,如 DTIM = 2,那么 DTIM 将每两个 Beacon 出现一次,其他时间出现的是 TIM,DTIM = 1 时每一个 Beacon 中 DTIM 都会出现。按照 802.11 的电源管理协议,在 DTIM 出现之前,设备可以暂时进入休眠状态,直到下一个 DTIM 出现。因此,DTIM 的周期越长,设备可以睡眠的时间也就越长。因此,上调 DTIM 可以降低设备的电能消耗,但会影响网络传输的延迟与可靠性;下调 DTIM 可以提高网络传输的可靠性,减少延迟,但是会增加电能消耗。

DTIM = 3 时的情况如图所示。

在 OpenWrt 中,DTIM 的默认值为 2,兼顾节能与可靠性,故无需特别调整。如果需要降低网络的延迟,提高可靠性,可以将 DTIM 设置为 1。根据经验,许多 VoIP 和即时推送应用对延迟敏感,需要低 DTIM。否则,可以上调 DTIM,根据经验最多上调至 8,不过一般无此必要。

此外需要注意的是,DTIM 决定了多少个 Beacon 出现一个 DTIM,而 Beacon 资深的间隔则是由 Beacon Interval 来决定的,因此如果需要提高网络的可靠性,或者降低设备的电能消耗,建议同时调整这两个数值。

Fragmentation

一则 802.11 帧的尺寸为 2346 字节,其中 payload 最大为 2304 字节。如果无线网络存在信号弱、干扰大、碰撞多等不利工作条件,802.11 帧在传输时容易损坏,导致整个帧必须重新传输,损失整整 2304 字节的数据。分片机制可以限制帧的大小,降低丢包或损坏时受影响的数据量,但也会引入额外的分片开销。

若需要进行这项优化,可以试着将一个以太网 payload 拆分为两个 802.11 帧。一则以太网帧的尺寸为 1538 字节(不使用 802.11Q VLAN),其中 payload 尺寸为 1500 字节(即最常见的 MTU),开销为 38 字节。而 802.11 帧的开销为 42 字节。因此,Fragmentation 数值可以设置为 1/2 x 1500 + 38 + 42 = 830 字节,并在此基础之上进一步下调。

RTS/CTS Threshold

由于 AP 的发射功率与接收灵敏度通常远远高于其他设备,因此当多个设备同时连接到一个 AP 时,AP 往往能和这些设备互相通讯,但设备之间却无法接收到彼此的信号。这种现象被成为“隐藏节点问题(Hidden Node Problem)”,会影响碰撞检测机制的正常工作。更多的碰撞造成传输时损坏帧的数量上升,导致更多重传,降低通讯性能与可靠性。

如图,虽然设备 A 和 C 无法收到彼此的信号,虽然它们都能与作为 AP 的 B 相互通信。

为了解决这个问题,802.11 无线网络有一个可选的 RTS/CTS 协议。当 RTS/CTS 生效时,设备首先向 AP 发送 Request to Send(RST)消息,请求传输数据,并等待 AP 的回复,直到 AP 收到 RST 并在条件允许时,向设备回复 Clear to Send(CST)宣布冲突解除后,设备才会进行传输。此外,如果设备刚好收到了其他设备发送的 RST,也会主动停止传输以规避碰撞。为了防止 RST 或者 CST 报文丢失引发网络混乱,设备需要发送 ACK 进行确认。

可见,RTS/CTS 以更高的传输开销为代价,一定程度上解决了大空间中客户端分布稀疏引发的“隐藏节点问题”。由于该协议开销较高,按照设计只有当 802.11 帧的大小达到 RTS/CTS threshold 的阈值时,RTS/CTS 机制才会被触发,防止大帧碰撞损坏的同时避免在保护小帧上浪费时间。

在大多数 AP 上,RTS/CTS threshold 的数值为 2346/2347,即大于或等于 802.11 帧的尺寸上限,这意味着 RTS/CTS 在任何情况下都不会激活,等于禁用了该协议。在“隐藏节点问题”不存在的情况下,这是最佳设置。如果需要进行这项优化,可以试着将设置为一个以太网 payload 的三分之一,1/3 x 1500 + 38 + 42 = 580 字节,并在此基础之上进一步下调。

Short/Long Preamble

ISO/IEC 7498-1 将一个信息通讯网络划分为了 7 个抽象的层级,也就是著名的 ISO/OSI 模型。我们需要了解的是本模型的前三层,由于它们的功能与媒介有关,因此这三层又统称为媒介层(Media layers),分别为物理层、数据链路层与网络层。IP 数据包位于网络层,以太网帧与 802.11 帧位于数据链路层,更加底层的通讯则由物理层负责。

数据链路层又可以进一步分为逻辑链路控制层(LLC, Logical Link Control)与媒介访问控制层(MAC, Media Access Control),我们感兴趣的绝大多数以太网活动发生在 MAC 层,而物理层又可以进一步分为物理收敛过程层(PLCP, Physical Layer Convergence Procedure)与物理媒介相关层(PMD, Physical Medium Dependent)。PLCP 负责将来自 MAC 层的帧进一步封装为 PLCP 协议控制单元(PPDU, PLCP Protocol Data Unit),接下来 PMD 再将准备好的 PPDU 的二进制数据通过调制解调器发送出去。

数据在整个网络流动如图所示。

「Preamble」是有关物理层上半层(即 PLCP 层)的一个概念。PLCP 层中的通讯也是一帧一帧进行的,其中「帧」名为 PPDU。PPDU 一共分为三部分,第一部分是先导区,名为 PLCP Preamble;第二部分是头部信息,名为 PLCP Header;第三部分是要传递的 payload,名为 PSDU。当包含着以太网帧的 802.11 帧从 MAC 层来到 PLCP 层,PLCP 就会为这些帧加入 Preamble 和 Header,从而封装为 PPDU。

在 802.11 协议中,Preamble 存在五个版本。

第一个版本被称为 Long Preamble,是 802.11b 及其之前的 802.11 无线网络使用的 PLCP Preamble 格式。在 802.11b 推出后,IEEE 又重新设计了一种新版本的 Preamble 格式,与 Long Preamble 相比长度明显缩短,因此名为 Short Preamble,减少了 802.11b 网络数据传输的额外开销,从而可以让 802.11b 无线网络达到更快的实际传输速率。然而,Short Preamble 的支持是可选的,并不是所有的设备都支持它。因此,将 Preamble 设置为 Short 可以降低开销,提高 802.11b 的传输速度,但无法兼容第一代的 802.11b 设备;将 Preamble 设置为 Long 可以兼容第一代 802.11b 设备,但会降低网络的传输速度;网络稳定性与本选项无关。

第三个版本是 802.11g 中的 OFDM Preamble,这个 Preamble 使用了新的编码方式,进一步降低了开销;而在 802.11n 中,Preamble 再次经过了重新设计,出现了向下兼容的第四个版本 HT Mixed 与不向下兼容的 HT Greenfield。

在修订版的 802.11b 协议中,Short Preamble 已经改为了强制实现,而不是可选实现,因此新的设备都支持 Short Preamble;其次,802.11b 已经是 1997 年的老古董了,早早就被 802.11g 与 802.11n 取代,因此 Preamble 究竟是 Short 还是 Long 已经完全不重要了。总而言之:如果你拥有十分古老的 802.11b 设备需要兼容,你也许需要启用 Long Preamble,如果你的 802.11b 设备是新设备,请使用 Short Preamble,更好的选择是不必关心这个选项,并直接禁用 802.11b 与 802.11g。

Antenna Diversity

电磁波在空间中的传播会受到障碍物和噪音的干扰,导致信号强度出现随机衰减(fade)。对于 802.11 无线网络而言,由于设备与 AP 直接往往没有直射路径,因此电磁波会被不同的物体反射,产生多径传播现象,使设备与 AP 反复接收到之前已经接收过的相同信号;而通过不同路径抵达设备与 AP 的电磁波之间也会混合在一起,产生失真。这这种情况下,衰减现象会更加容易发生,干扰通讯的正常进行。在最严重的情况下,多径信号产生相消干涉现象而互相抵消,造成严重的「深衰」(deep fake),此时信号强度下降数千倍,可导致高达 30 dB 的损失。

天线分集(Antenna Diversity)是使用多根天线降低通讯干扰的技术。在最典型的方案中,无线设备使用两根或更多天线,由于天线的位置不同,因此每根天线的信号的传播路径也不同。如果一根天线的信号传播出现深衰,很可能另一根天线却是正常的。因此,无线设备可以选择一根信号最强的天线用来收发信号。这就叫做空间分集(Space Diversity),可以看到在 Space Diversity 中,虽然天线的数量可以很多,但是任何时刻只有一根天线负责信号的传输。

在 802.11g 与 1×1 无 MIMO 的 802.11n 中,Antenna Diversity 选项指的就是 Space Diversity。在 AP 上,可能存在一个是否开启 Antenna Diversity 的选项,也可能会有额外的选项让用户指定发射天线与接收天线。除非 AP 是用于特殊环境下组网的情况,Antenna Diversity 应该总是开启,而发射、接收天线应该设置为「自动」。

带 MIMO 的 802.11n 无线设备则实现了更加复杂的 Antenna Diversity 技术,一般这类设备上没有选项可以直接控制 Antenna Diversity,因为这是 802.11n MIMO 的一部分。

两种:

(待续)

Distance / Coverage Class

当设备收到 802.11 数据帧并通过校验确定有效后,会向 AP 发送 ACK 帧宣告接收无误。如果 AP 在一定时间内没有收到 802.11 数据帧,就会假定该帧在途中已丢失或损坏,并重新发送本数据帧。然而,来自 AP 的数据帧抵达设备并解码也是需要一定的时间的,如果过早超时,就会导致不必要的重传;另一方面如果超时等待时间过长,数据帧丢失后 AP 会将更多时间浪费在空等待而不是重传上。此外,如果 AP 发现某个设备在短时间内没有发送任何 ACK,则会认为此设备已掉线,并向设备发出 disassociate 帧其强制踢出网络,强制使其重连。

ACK 超时时间由硬件固件或设备驱动决定。这一时间可能会硬编码为一个较大数值,个别 AP 和驱动可能会提供手工调整 ACK 时间的选项,而一些先进的驱动则拥有 ACK 时间估算功能,会根据设备过去的表现自动调整超时时间(如 Linux 的 ath9k 驱动包括一个实验性的 ACK time estimation 功能,默认没有启用)。一般来说,ACK 超时时间对网络性能几乎没有明显的影响。然而在长途 Wi-Fi 通讯领域,由于设备之间的具体往往高达数千米甚至数百千米,远高于任何设备的默认 ACK 超时时间,此时就会出现设备可以看到 beacon 但无法连上的问题。此时需要手工调整 ACK 超时时间。

除了 ACK 超时时间,另一个在 802.11 网络中关键的时间参数是 slot time。在 CSMA 在算法检测到碰撞后,设备会等待一段时间重新尝试传输,而这一等待时间的最小值就称为 slot time。在 802.11g 的 OFDM 物理层中,存在短 slot time 和长 slot time 两种标准时间设置。但当通讯距离足够长时,这一时间将同样不足,引发混乱。为了解决此类时间问题,802.11 标准规定了一个名为覆盖级别(coverage class)的参数。coverage class 的数值每增加 1,对应 3 us 的传播时间;默认的数值是 0,意味着信号传播时间可以忽略不计,

在 Linux 中,为了解决长途 Wi-Fi 应用提供一个简单的配置方法,引入了一个 distance(距离)选项。用户无需计算电磁波的传播时间,只需要以米为单位指定最远设备的距离,Linux 内核就会正确设置适当的 coverage class 与正确的 ACK 超时时间。

TODO