80211 RTS/CTS控制帧
原文链接:https://blog.csdn.net/u014294166/article/details/129556001
作为可选功能,802.11 标准包括 RTS/CTS(请求发送/清除发送)功能以控制AP 对STA的访问。
RTS/CTS出现的原因:
假如有两个STA: STA_1,STA_3,以及一个站点STA2。双方并不直到对方的存在,当STA_1/STA_3同时向STA_2发送数据时,这会造成STA_2无法正确接收数据,但是STA_1与STA_3也无从得知错误发生,只有STA_2知道有冲突发生,STA_2不会反馈ACK,最终这一轮传输失败。这一轮失败之后,STA_1与STA_3采用BEB算法重新选择随机数进行回退,但是由于两者没有办法互相监听,所以很容易再次出现同时传输的现象。所以在隐藏终端的情况下,网络性能最差时是无法传递数据包的,换言之,节点1与节点3的吞吐量都趋近于0。
RTS/CTS如何去规避隐藏sta之间的冲突的呢?
如果设备开通了RTS/CTS,则当STA_1/STA_3想向STA_2发送数据时,会首先发送一个RTS的控制帧,加入STA_2收到了STA_1的RTS包,则会等待一个SIFS的duration,然后开始发送CTS。CTS作为广播信道发出的帧,如果未加密的话所有STA均可以解析该数据。
当STA_1发现CTS是发给自己的,则直到当前信道未daily状态,在等SIFS duration之后开始发送数据帧,等待 data_duration + SIFS事件后,STA_2向STA_1发送ACK,以表示接收成功。
而其他STA在接收到CTS后,发现并不是发给自己的,此时它们会将CTS数据帧的duration给提出,并设置在自己本地的NAV(Network Allocation Vector)上。若NAV没有倒数到0,那么其会主动暂停其随机回退计数值。
如何判断使用RTS/CTS的时机?
RTS/CTS本身的思想是采用小数据量碰撞避免大数量数据的重复,但是 RTS/CTS的存在必然还是会导致设备功率的损耗,所以需要对开启 RTS/CTS设定好条件。
- RTS Threadshold
如果802.11 网卡的驱动程序支持,用户可通过调整 RTS阈值 (RTS threshold) 来控制RTS/CTS 交换过程。只要大于此阈值,RTS/CTS 交换过程就会进行,小于此阈值则会直接传送帧。此阈值一般应该设定为2347 byte ,如果网络吞吐相当低或重传比例偏高,可以降低 RTS 阈值值以启动 RTS 清空机制。
- Fragmentation Threshold
相匹配的还有个分片阈值(fragmentation threshold),用来进行MAC 层级的帧分片,该阈值默认值是2346,或物理层所容许的 MAC最大长度,如果帧超过这个阈值则会进行分片。RF物理层所使用的MAC长度通常是4096个字节,因此这个参数通常默认为2346 byte。这个分片阈值通常与RTS/CTS经常一并运行。这个参数设得太低,有效吞吐量反而会下降,因为确认每个片段必须用掉额外的时间,同样地,设得太高也会降低有效吞吐量,因为较大帧一旦损毁,便会增加无线信道重传的负担。
- Retry Limit
1. 长帧重传限制 (long retry limit) :适合大于RTS阈值的帧,默认值为4。需要用到RTS/CTS 清空机制的有4 次重传机会,如果该遭丢弃,就会通知较上层的协议。
2. 短帧重传限制(short retry limit):适合小于RTS阈值的帧,默认值为7。