CSMA/CA是写入IEEE802.11的无线网络MAC层标准协议,相信看到这篇文章的读者都知道它是用来做什么的。但许多短文对这个协议的解释都有所缺乏,因此本文用状态转换图的形式详细说明协议的工作流程。(好吧其实是作者看到一个状态图有感而发,见参考资料)
请看下面的状态转换图:
其中,CS=1(0)意味着载波被占用(可用),Q=1表示队列中有(无)待发送的帧(frame)。感兴趣的读者可以自行推断上述状态代表什么。
好了,首先说明,CS=1还是CS=0是怎么判断呢?有时是通过侦听载波,有时是通过RTS/CTS机制,虽然图中并未说明。下面沿着状态图简述CSMA/CA工作流程:
(初始状态为I, 节点有待发的帧,于是开始侦听载波)
I:idle,发送方侦听到信道忙,则转到D,否则转到T。
D:defer,若信道忙,等待一段时间后,若信道空闲,转到B。
T:transmit,若信道可用,等待一个DCF之后发送一个RTS。若收到的CTS中包含自己的地址,说明预约信道成功,开始传输数据帧。传输过程中遇到出错,则转到B,进入退避过程;遇到信道被占用时转到D。
B:backoff,即CSMA/CA的退避机制,用于处理传输出错的情况。出错一般只由两种情况导致,即冲突(collision)和信道噪声(carrier noise)。退避时,从{1, 3, 7, 15, ... 2^m-1}中选择一个时间进行延时。
退避过程:DCF在退避状态下有一个竞争窗口机制,如果一次传输成功了,发送端需要将竞争窗口置为最小值(802.11中规定contention window最小为31)。对于重传的节点,每一次传输失败都将contention window的大小成倍放大,即第一次重传时窗口大小为63,第二次是127,直到达到重传次数上限,则作丢包处理。竞争窗口越小,越有利于竞争。
另附MAC层中自私行为的实现:
1,增大CCA threshold。
CCA (空闲信道评估,Clear Channel Assessment)用于监测信道是否空闲。节点监测信道中的RSSI并于阈值进行比较,若超出阈值则认为信道忙,否则信道可用。自私节点通过增大这一阈值,使得自身对于信道是否可用不敏感,因此在信道忙的时候仍然发包,导致其他节点的传输收到干扰。这种行为属于暴力自私行为,因为在干扰下自私节点自身的包也会丢失。
2,减小backoff time,即选择小甚至最小的CW。
通过选择最小的CW,自私节点在传输出错的时候总是先于冲突节点发包,从而导致不公平性。篡改backoff time的自私行为是最难以解决的问题之一。
参考资料:Utpal Paul, Passive Measurement of Interference in WiFi Networks with Application in Misbehavior Detection[J], TMC, 2013.