目录
目录
一. Frame Format
1.1 RTS Duration
1.2 CTS Duration
二. 隐藏节点问题与RTS/CTS
2.1 RTS/CTS流程
三. 暴露节点问题
- RTS:Request To Send,即请求发送,是一个单播帧,没有加密。
- CTS:Clear To Send,即信道清除,也是一个单播帧。节点在收到CTS后,确认信道是空闲的,可以发送,没有加密。
RTS和CTS这两个控制帧的格式很简单,主要就是Duration字段,后面会介绍,然后就是RTS比CTS多了一个TA字段。
用来应答 RTS 时,CTS 帧的发送端会以 RTS 帧的 duration 值作为持续时间的计算基准。CTS帧发送端会将 RTS 帧的 duration 值减去发送CTS帧及其后短帧间隔所需的时间,然后将计算结果置于 CTS 的 Duration 位。
节点2可以跟节点1和节点3通信,不过某些因素(例如距离远)导致节点1与节点3无法直接通信,节点1和3就互为隐藏节点。如果使用简单的transmit-and-pray协议,节点1与节点3有可能在同一时间传送数据,这会造成节点2无法正确接收数据,但是节点1与节点3也无从得知错误发生,只有节点2知道有冲突发生,节点2不会反馈ACK,最终这一轮传输失败。这一轮失败之后,节点1与节点3采用BEB算法重新选择随机数进行回退,但是由于两者没有办法互相监听,所以很容易再次出现同时传输的现象。所以在隐藏终端的情况下,网络性能最差时是无法传递数据包的,换言之,节点1与节点3的吞吐量都趋近于0。
在DCF中,引入了RTS/CTS机制来解决“隐藏节点”的问题。
1. 节点1已经breakoff至0,其首先发送RTS数据帧给节点2;
2. 若在节点2处没有冲突,即节点2成功解调出节点1的RTS,节点2会在等待SIFS之后发送CTS帧给节点1。由于无线信道是一个广播信道,要是帧没有加密的话,那么所有节点都是可以解析其信息的,所以这里节点2虽然是发送CTS给节点1,但其他节点也是也可以解析CTS信息:
(1) 当节点1接收到CTS后,其发现该CTS是之前自己发送RTS的反馈,即节点1知道信道空闲。再等待SIFS后,节点1发送数据frame,当数据传输完成之后,节点2向节点1反馈ACK,从而最终完成一次传输。
(2) 当其他节点接收到CTS之后,会发现该CTS不是我请求获得。它们会将CTS数据帧的duration给提出,并设置在自己本地的NAV(Network Allocation Vector)上。若NAV没有倒数到0,那么其会主动暂停其随机回退计数值。
两个节点发RTS也是会出现冲突的,所以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。
RTS Threadshold、Fragmentation Threshold、Retry Limit的默认值说明均来自《OReilly-802.11_Definitive Guide》,可以调整。