基于竞争的MAC协议允许多个节点同时访问信道,这可能会产生冲突,但可以用多种办法解决,比如随机退避、RTS/CTS协议以及冲突避免技术。随机退避中比较典型的例子是载波侦听多路访问(CSMA),即节点在发送数据前先对介质进行侦听,检测介质上是否有正在进行的通信。如果节点发现介质正忙,那它将退避一段时间后再重试发送;如果发现信道是空闲的,那么在发送数据前该节点将等待一段随机的时间(即竞争周期)。竞争周期的应用降低了两个节点同时开始发送数据的可能性,因此减少了冲突。面向无线传感器网络的基于竞争的MAC协议会采用IEEE 802?11标准DCF中的RTS/CTS帧交换技术和超时技术,并结合无线传感器网络应用的特征,以实现无线传感器网络系统在能耗、寿命、延迟以及吞吐量等方面的性能优化。目前,典型的面向无线传感器网络的基于竞争的MAC协议有S-MAC[Wye02]、T-MAC[Tvdam03]、WiseMAC[Aelhoiydi04]、DMAC[Glu04]、DSMAC[Plin04]以及AC-MAC[Fli06,Jai04]等。下面将介绍S-MAC和T-MAC协议的基本设计。
1? S-MAC [Wye02]
显然,在无线传感器网络中,存在一些浪费能量的过程,包括空闲监听、冲突、串音以及开销控制。
空闲监听(idle listening)是指一个传感器节点等待其他节点可能向其传输数据的状态。
在大多数传感器网络应用中,如果节点没有侦听到信号,那么大多数时间都处于空闲状态。而传统的MAC协议,比如IEEE802?11和CDMA,都要求节点监听信道,等待可能的数据传输。研究表明,空闲监听消耗的能量占用于接收所消耗能量的50%~100%[Stemm97]。在很多无线传感器网络应用中,节点处于空闲监听状态的时间远比处于通信状态的时间要长,实际上这会消耗节点的大部分能量。数据冲突会导致传输包中数据的损坏,那就必须丢弃,并且之后数据的重传也增加了能耗以及网络延迟。类似地,节点间的串音以及控制开销也会导致无线传感器网络节点的能量浪费。
为了减少上述的能量浪费,S-MAC协议采用了周期性的睡眠和监听,然而,节点的周期性睡眠会导致数据包在逐跳转发过程中产生等待延迟。78S-MAC协议假设所有节点均用于同一应用或者一组应用中,由于节点有相同的应用目的,那么可能就会出现一个节点拥有的信息比其他节点多的情况。S-MAC允许拥有较多信息的节点更长时间地使用信道,这就能够维持更为重要的应用级的公平性而不是每一跳的公平性。
(1)周期性侦听/睡眠
在很多无线传感器网络应用中,节点经常处于空闲状态,为了减少空闲监听时的能量浪费,S-MAC采用了一组睡眠/唤醒状态。在睡眠状态下,节点将通信模块(消耗大部分能量)关闭而保持其他模块的开启状态。按照调度机制,在一段时间间隔后,节点从睡眠状态切换到唤醒状态,时间间隔的值取决于节点上的网络应用。在唤醒状态下,节点将通信模块打开,参与必要的网络通信。
为了适时地调度睡眠/唤醒状态以及与相邻节点的通信,节点应与相邻节点进行周期同步。为了避免时间同步可能产生的错误,S-MAC采用了两种技术。第一,用于同步的时间戳是相对的而非绝对的;第二,侦听时长大于时钟漂移时长。在S-MAC协议中,节点可以自由地选择侦听/睡眠的调度机制,但是最好与相邻节点保持同步以减少控制开销,这是因为当两个节点都处于唤醒状态时才能进行通信。也就是说,最理想的情况是相邻的节点都能同时转入睡眠或者唤醒状态。然而,在图3-8所示的多跳网络中,并非所有的相邻节点能够同步到相同的睡眠/唤醒调度机制下。例如,节点A和B采用相同的调度机制,同样节点C和D也采用相同的调度机制,但是可能和节点A、B采用的调度机制不同。一个节点通过向直接相邻的节点广播其调度机制达到交换调度机制的目的,以确保所有的相邻节点可以通信,即使它们采用不同的调度机制。
在S-MAC协议中,如果一个节点想与一个相邻节点通信,那么它必须等到该节点开始侦听(或处于唤醒状态)。如果超过一个节点要与同一个节点通信,那么在该节点处于唤醒状态时,这些节点必须竞争访问介质。对于这种竞争来说,需要采用RTS/CTS帧交换,第一个发出RTS帧并且收到接收者回复CTS帧的节点获得访问信道的权利。收到CTS帧后,节点就可以进行数据传输,之后继续按照调度机制进入睡眠或侦听模式。
(2)选择和维护调度机制
每个节点都应该在周期性地侦听/睡眠之前选择一个调度机制,并且与相邻节点交换调度机制。调度机制被保存在一个包含所有相邻节点调度信息的表中。调度机制的选择和插入按如下规则进行:
1)每个节点先侦听传输信道一段确定的时间后,如果节点没有收到其他节点的调度信息,那么该节点随机选择自己的侦听/睡眠调度机制并且将调度信息通过SYNC广播出去,声明自己将在t秒后进入睡眠状态。由于不需要遵循相邻节点的调度机制,该节点独立地选择自己的调度机制,它被称为同步源(synchronizer)。
2)在侦听期间,如果一个节点在选择自己的调度机制前接收到相邻节点的SYNC分组,这个节点将采用收到的SYNC分组中的调度机制,这样的节点被称为追随者(follower)。假设追随者知道SYNC分组的发送者在t秒后将切换到睡眠状态,为了避免与其他追随者可能产生的冲突,在等待一段随机的时间td秒后,它将广播自己的调度机制并且声明它将在t-td秒后进入睡眠状态。
3)如果一个节点已经选择了一个调度机制,之后又从其邻居节点接收到了一个不同的调度机制时,该节点应同时满足自己已有的调度机制和接收的调度机制中的工作需求,在两种调度机制中的侦听期均保持唤醒状态。
(3)保持同步
无线传感器网络节点间的同步是通过发送SYNC分组来保持的。SYNC分组包括源节点的地址以及下一次睡眠的时间。下一次睡眠的时间并不是绝对的,而是与SYNC分组的传输时间相对的,约等于收到该分组的时间。这有利于消除时钟同步错误。目标节点在收到SYNC分组后立即启动计时,在计时停止以后,该节点切换到睡眠状态。为了发送数据包以及SYNC分组,唤醒状态的时间被分成两部分。第一部分用于接收SYNC分组,第二部分用于接收RTS帧。每一部分还被进一步划分成时间片用于SYNC或数据包传输前的载波侦听。
每个节点周期性广播包含其调度机制的SYNC分组,80这样能让新加入的节点采用相同的调度机制。对新加入的节点来说,调度机制的选择过程与前文描述的是一样的。在将自己指定为同步源之前,新加入的节点会把初始的侦听时间设置得足够长,以增加接收到相邻节点调度机制的可能性。
(4)冲突与串音避免
为了避免多个节点同时向一个节点发送数据,S-MAC采用了RTS/CTS帧交换以及虚拟和物理载波侦听机制。研究表明,这是一个解决隐藏终端问题有效方法
[Pkarn90,Bharghavan93,IEEE07]。所有节点在进行数据传输前都应该进行载波侦听,如果源节点侦听到信道正忙,它就转入睡眠状态。当目标节点进入唤醒状态时,源节点也进入唤醒状态。S-MAC发送广播数据包时,比如SYNC分组,不需要RTS/CTS帧交换而是直接进行。对于单播(unicast)数据包,在传输过程中源节点和目标节点都需要遵循RTS/CTS/数据/ACK的顺序。此外,每个数据包还包括一个用于标识需要的剩余传输时间的字段,这与IEEE802?11中的网络分配矢量(NAV)的概念相似。这样,一个节点在接收到发送到其他节点的包后就知道需要保持静默或回到睡眠状态的时长。
S-MAC协议减少了由于串音而造成的能量浪费。采用S-MAC协议的节点只要侦听到CTS或CTS帧,就会转入睡眠状态,这是由于随后的数据和ACK的传输通常将花费较长时间。例如,在图3-9中,节点C正向节点D发送数据,很明显节点C与D不可能处于睡眠状态。由于冲突发生在接收端,为了避免冲突,节点E不能发送数据并且还应该处于睡眠状态。节点B理论上可以在节点A处于唤醒状态时向其发送数据,这是因为节点D不在节点B的传输范围内。但是,节点B的数据发送可能会造成节点C在准备接收ACK时发生冲突。类似地,节点E在C与D传输数据时也不能进行数据传输。因此,发送者和接收者的所有直接相邻节点在侦听到RTS或者CTS帧后都应转入睡眠模式。也就是说,根据RTS/CTS帧中的NAV信息,节点需要转入睡眠状态以避免串音,直到当前传输结束为止。
(5)消息传递
消息是一组有意义的数据,可以是一个比较大的数据包或一系列数据包。一方面,把一个长的消息装入一个数据包后,如果消息损坏就需要重传,这在能耗、延迟和带宽的利用率方面的代价是很昂贵的。另一方面,如果通过多个较短而且独立的数据包传递一条消息,就会大量增加控制开销,比如RTS/CTS帧的交换。因此,S-MAC协议将一条长消息分割为多个碎片,并且以突发的形式发送。在整个突发中只用一次RTS/CTS帧交换,以便在所有碎片传输过程中保留介质。只有当发送者接收到来自接收者的ACK后才认为一个碎片已经发送成功;如果发送者没有收到ACK帧,那么它将保留介质的时间延长一个数据碎片发送的时间,并且立即重传当前碎片。接收者在接收到每个数据碎片后会发送ACK帧,这样可以解决隐藏终端问题。当前传输的NAV信息也包含在ACK以及数据包中。这样,传输路径周围的节点就能知道此时正进行的数据传输的持续时间,即使数据包损坏或者节点在传输时才切换到唤醒状态。
(6)节能与增加延迟
在分析S-MAC中延迟带来的损失前,我们先了解一下多跳网络中基于竞争的MAC协议固有的一些延迟。这些延迟包括载波侦听延迟、退避延迟、传输延迟、传播延迟、处理迟延以及排队延迟。但是,在S-MAC中还存在另一种延迟,称为睡眠延迟(sleep delay),即源节点发现其目标节点处于睡眠状态而需要等待,一直到目标节点转为唤醒状态。假设规定1帧是一个完整的侦听和睡眠的周期,式3.2给出了在数据包以相同的概率在同一帧中到达的平均睡眠延迟:
其中,Ds表示睡眠延迟,Tframe 表示帧长,并且等于Ttime(表示睡眠时间)与Tlisten(表示侦听时间)之和,如式3.?3所示:82
式3.4给出了S-MAC中相对能量节省,最后一项表示节点的占空比。由该式可看出,侦听的时间越短,平均睡眠延迟越大。
S-MAC协议降低了节点的能耗,因此延长了网络寿命。但S-MAC是通过延迟来降低能耗的,那么把S-MAC应用在对时序要求严格的无线传感器网络中将不是最优的选择。
(7)S-MAC协议性能
文献[Wye02]中的实验表明,与IEEE802.11中DCF相比,S-MAC有很好的节能性质。如果源节点在以每1~10秒发送一条消息的传输负载下,那么一个类IEEE 802.11的MAC协议的能耗是S-MAC的2~6倍。为了减少S-MAC的延迟,文献[Wye04]介绍了一种名为自适应侦听(adaptive listen)的技术。其基本思想是把节点从低占空比的状态切换到更加活跃的状态。具体地说,自适应侦听使节点在完成当前的传输后继续保持唤醒状态一段时间,用于监听相邻节点的传输(理想状况下只有RTS或CTS),而不是等待固定分配的侦听时间。如果它是下一跳的节点,那么就可以立即接收来自相邻节点的数据,否则该节点转入睡眠状态,直到下一次分配好的侦听时间。
2? T-MAC[Tvdam03]
为了更好地解决无线传感器网络中空闲监听的问题,提出了另一种基于竞争的MAC协议——T-MAC(timeout MAC)。它在不需要无线通信模块时关闭,从而降低能耗[Tvdam03]。T-MAC协议的基本思想是在相同的时刻将网络中所有节点的无线通信模块打开,并且在通信结束一段时间后再将其关闭。83T-MAC协议是从S-MAC协议改进而来的,和S-MAC协议中根据预定的调度时间打开无线通信模块不一样,T-MAC可以动态地调整侦听/睡眠工作周期,这样的结果就是T-MAC协议在不同的消息速率下比S-MAC更加节能。
(1)协议设计
与S-MAC协议类似,T-MAC协议同样采用周期性的睡眠与唤醒机制来降低无线传感器网络的能耗。在睡眠状态下,节点的感应模块是打开的并且可以将采集的数据放入队列中。处于睡眠状态的节点也可以接收来自相邻节点的消息,并将其放入队列中。在活动或者唤醒状态,节点按需侦听或者传输数据。在数据传输过程中,为了保证避免冲突以及可靠传输,T-MAC也采用和S-MAC一样的RTS/CTS/数据/ACK模式。如果在一个给定时间TA(Time Active)内没有以下任何一个激活事件(activation event)发生,节点则转入睡眠状态。激活事件包括:
1)周期性定时器到时。
2)在无线信道上收到数据。
3)感知到无线通信的存在。
4)节点本身数据包或者ACK帧发送结束。
5)通过侦听RTS/CTS帧,确认邻居的数据交换已经结束。
每帧空闲监听最小的长度由TA值决定。由于在睡眠状态接收到的消息必须放入缓冲区内,因此最大的帧周期以缓冲容量为界。
1)簇与同步
T-MAC协议中的同步是通过一种称为虚拟簇的技术完成的[Wye02]。在虚拟簇中,有相同调度机制的节点形成簇,并非强制所有节点使用相同的调度机制。虚拟簇允许节点广播其调度机制,同时期望节点能够与相邻节点保持同样的调度机制。开始,每个节点先监听无线信道并且等待,如果一个节点在经过一段时间的监听和等待后没有收到数据,那么它将选择一个帧调度机制并且向邻居广播其SYNC分组。另一方面,如果一个节点收到了来自任意一个邻居的SYNC分组,那么它将按照收到的SYNC分组内的信息进行调度。此外,如果节点在广播其SYNC分组后收到了另一个SYNC分组,那么它将采用两种调度机制并且通知该SYNC的发送者存在多种调度机制。节点偶尔广播其调度信息,并且在无规律的间隔后,还要侦听完整的时间帧,才能监测出同一簇内存在的不同调度机制。84由于同属于一个虚拟簇内(即与发送节点的调度机制相同)的相邻节点和采用发送节点的调度机制作为额外调度机制的相邻节点,在发送节点处于活动状态时均为能接收数据的唤醒状态,发送节点在其活动状态开始时就可以发送数据包。
2)竞争解决
在T-MAC协议中,每一帧包含一个活动状态和一个睡眠状态。在睡眠状态下,感应数据加入到发送队列。因此,在每帧活动状态的开始,每个节点已经缓存了大量的数据,需要以突发形式发送出去,这就导致了在活动状态开始时对介质的高度竞争。T-MAC协议采用了RTS/CTS交换机制来应对信道竞争,节点在准备发送RTS帧前会在竞争周期内随机地对介质检测一段时间。在发送RTS帧后,如果接收者处于睡眠状态,发送者不会收到CTS帧。即使接收者处于活动状态,也可能由于冲突导致RTS帧丢失或者因为RTS或CTS帧串音,接收者不能回复CTS帧。由于接收者在活动状态,那么发送者可以重试RTS帧的发送,但是如果发送者在两次重试后都没有收到CTS帧,它将转入睡眠状态。
在前面已经提到,在TA时间内如果没有激活事件发生,节点将转入睡眠状态。这意味着接收者如果没有及时收到CTS帧,它将自动切换到睡眠状态。因此,TA值的大小必须能够保证发送者足以收到CTS帧[Tvdam03]。作为第三方的相邻节点,在监听到RTS或者CTS帧后,和S-MAC协议中要节点转入睡眠状态不一样,T-MAC选择继续监听。由于监听到发送节点发出的RTS/CTS帧的节点很有可能就是该发送节点接下来发出数据包的接收者,避免监听会导致节点无法监听并及时接收数据包,从而降低无线传感器网络的吞吐量。
3)T-MAC的早睡问题
在文献[Tvdam03]中,研究发现T-MAC在所有节点向汇聚节点发送数据时存在一些缺陷。比如,假设有4个节点A、B、C和D,数据传输方向是A→B→C→D,即A只传到B,B传到C,C传给D,如图3-10所示。
以节点C为例,为了与节点D通信,节点C首先必须通过与其相邻节点B竞争获得传输信道的使用权。如果节点C收到节点B发出的RTS帧,那么它将向节点B回复CTS帧从而暂时失去传输信道的使用权。与此同时,节点D也会监听到节点C发出的CTS帧,节点D将会在节点B和C的通信过程中保持唤醒状态。同理,如果节点C监听到节点B向节点A发出的CTS帧,将会保持唤醒状态进行信道监听,而节点D由于不知道节点A和B通信的存在将会转入睡眠状态。这样,即使节点C在随后的竞争中获得了传输信道的使用权,但是由于节点D处于睡眠状态,85节点C也只有等到下一个周期才能传输数据到节点D。这种情况就称为早睡问题,有两种方法可以解决该问题:未来请求发送(Future Request To Send, FRTS)和满缓冲区优先(full buffer priority)。
4)未来请求发送(FRTS)
FRTS的基本思想是让另一个节点知道还有信息要发送给它,即使传输介质在当前不可用。如图3-11所示,当节点C监听到B发送给A的CTS帧后,立即向下一跳的接收者D发出FRTS分组,通知节点D有数据传输。FRTS分组包含目的地址以及当前传输需要的时间长度等信息,在这一段时间内节点C不能向节点D发送数据。如果一个节点被禁止发送数据,那么它也不能发送FRTS分组。
FRTS分组的目的节点必须处于唤醒状态,这样才能接收FRTS分组以获取当前数据传输的信息。为了防止其他节点占用传输介质,之前信道的获得者(即节点A)在发送实际数据前需要发送一个DS(data-send)分组。该DS分组不包含任何有用信息,仅实现对信道的占用,因此,DS分组和FRTS分组的冲突不会影响接下来的数据传输。FRTS方法可以提高数据吞吐率,但DS分组和FRTS分组带来了额外的通信开销。
5)满缓冲区优先
当一个节点传输/路由缓冲区接近饱和时,节点将优先选择发送信息,而不是接收信息。如图3-12所示,节点B向节点C发送RTS帧,节点C因其缓冲区快满不发送CTS帧,而是向节点D发送RTS帧,然后将其数据发送给节点D。
不过,在这种机制下,前一次竞争胜者的接收者有更高的概率来控制传输介质。在这个例子中,节点C在与节点B的竞争中失败,但幸运的是节点C是胜者(即节点B)的接收者,那么实际上节点C(并非节点B)就得到了信道。显然,在这个例子中,节点D不存在早睡问题。此外,满缓冲区优先机制在网络中引入了一定程度的流量控制,这有利于无线传感器网络中多节点到汇聚节点的通信。
然而,当高负载流量不是以多节点到汇聚节点的形式流动时,必须谨慎地使用这种方法。当全向通信模式下的所有节点都采用全缓存优先法时,冲突的概率大大增加。冲突会降低整个WSN网络的性能,因此,T-MAC设置了一个阈值来限制节点采用满缓冲区优先。
(2)T-MAC协议性能
T-MAC协议引入了在超过预定时间后关闭无线通信模块的思想,是解决空闲侦听和在消息速率有波动的不稳定环境(无论时间还是位置上)下降低能耗的有效途径[Tvdam03]。模拟显示,在低网络负载的情况下,T-MAC协议的无线模块使用仅占2.5%,与传统的基于CSMA的协议相比可以节省高达96%的能量。在高网络负载的情况下,T-MAC协议通过不进入睡眠模式确保不会增加延迟,同时保证较高的吞吐率。在相同的网络流量下,T-MAC和S-MAC协议功耗相近,与基于CSMA的协议相比能耗下降多达98%。但是,在消息速率变化的网络中,T-MAC协议会比S-MAC协议节省更多能量(S-MAC协议会把节点无线电开启一段时间)。
T-MAC协议降低了节点的能耗,因此在不增加延迟的情况下可以延长网络的寿命。它减少了数据从源节点到目标节点的传输时间,并通过采用FRTS和满缓冲区优先的办法解决了早睡问题。