###1. 802.11 支持多种传输速率

  • 802.11 : 1 Mbps
  • 802.11b : 2 Mbps
  • 802.11g : 6.0 Mbps 9.0 Mbps 12.0 Mbps 18.0 Mbps 24.0 Mbps 36.0 Mbps 48.0 Mbps 54.0 Mbps
  • 802.11n : MCS0 ~ MCS1
  • 802.11ac : MCS1 ~ MCS9

###2. 发送端不能准确地选择传输速率

根据香农定律, 越高的传输速率, 接收端需要越高的信噪比,但是对于wifi芯片来说, 噪声是无法测量的(只有频谱分析仪才能够测量), 只能预估噪声, 这样无法准确地通过信噪比来选择传输速率, 另外, 802.11协议也不支持接收端向发送端报告信道质量, 因此, 发送端必须得自行决定采用的传输速率

802.11 协议并未规定如何选择传输速率, 发送端可以从最高的传输速率来开始尝试, 失败后重传几次,若仍然失败, 则降速后再重试,使用这些方式, 在接收端距离远或者环境中噪声干扰较大的场景, 每一次发送必然会经历大量的retry, 导致throughput 降低

若是能够在发送时, 尽量选取合适的速率开始尝试发送, 可以减少发送时的retry 次数, 改善throughput, 针对这一目标, 不同的厂商采用了不同的速率自适应算法

###3 速率自适应算法

当前的802.11速率自适应算法可以分为两类:

  1. 基于信道测量的方法 : 需要修改 RTS/CTS 握手信号, 交换信道信息, 例如 RBAR 和 OAR 算法
  2. 基于统计的方法 : 基于吞吐量或者ACK帧的统计信息, 判断信道质量, 例如 ARMM, ONOE, Sample Rate算法

###3.1 Sample Rate 算法

Sample Rate 对于所支持的每一种算法都保留一张记录表, 并且周期性地使用各种速率来发送数据, 然后根据发送的状况来更新记录表, 然后根据最新的记录值, 来选择具有最小平均发送时间的速率来发送数据包

###3.2 ARF (Auto Rate Fallback)

发送端根据连续接收到的ACK帧(收到ACk说明接收成功)来判断信道质量, 从而自动调整发送速率的自适应算法

  • 原理: 如果连续发送成功, 接收到ACK帧的次数超过阈值(固定为10次), 说明信道质量较好,就尝试使用更高的速率, 如果发送失败, 就认为信道质量变差并切换到低速率
  • 优点: 能够快速响应信道质量的变化
  • 缺点:在多速率的情况下, 为所有的速度使用相同的成功阈值是不合适的, 对于缓慢变化的信道, 需要较大的成功阈值, 对于快速变化的信道, 需要较小的成功阈值

####3.3 AMARF (Adaptive MultiRate Auto Rate Fallback)

基于ARF的改进算法,

  • 原理 : 每一种速率被赋予单独的成功阈值, 并且在运行时可以动态调整阈值(根据帧长度, 频均接收功率, 信道的变化快慢等)

####3.4 ONOE

ONOE算法跟踪当前连接的当前比特速率的信用度,如果丢包率较小,那么增加该信用度;如果该信用度达到一定的阈值,那么信用度复位为0并尝试提高传输速率;如果发生了一些错误,那么该信用度复位为0,速率下降

  • 原理: 设置初始传输速率为24Mbps (802.11ag) 11Mbps (802.11b), ONOE算法周期性地执行 (1s)
    1. 如果没有数据发送成功,降低到下一个速率, 信用度复位为0
    2. 如果发送了10个以上的包,并且每个包的平均重传次数大于1,降低到下一个速率
    3. 如果超过10%的包需要重传,将信用值减小(保持大于0)
    4. 如果少于10%的包需要重传,增加信用值
    5. 如果信用值大于10,增加速率, 信用值复位为0

###4. MSMxx wifi driver速率选择算法

  1. 以50ms为周期, 执行如下操作
  2. 收集Tx的统计信息, 包含
    • Tx PPDU count
    • Tx MPDU count
    • Tx MPDU-in-AMPDU
    • PPDU ACK timeout
    • TX MPDU responded
  3. 若收集到足够的统计信息,则计算PER,更新到记录表中, 然后从记录表中选择一个最佳的传输速率,后续使用, 统计信息足够的条件是
    • Tx次数大于等于10
    • fail 次数大于等于7
    • 大于等于3次的连续 Tx fail
    • 最后的50次采样中至少要有一次数据包传输

可以看到, 使用的是Sample Rate算法来进行速率自适应