NS2 定时器:BackoffTimer/ DeferTimer/NavTimer/RxTimer/TxTimer/IFTimer

来源:互联网 发布:淘宝店铺如何转让 编辑:程序博客网 时间:2024/06/05 10:51

MacTimer: 是 mac-802.11中所有timer的共同父类

重要属性/方法:1) protected Mac802_11 *mac;用于timer调用mac的对应超时处理方法,timer的构造函数以Mac802_11类实例的指针为参数,并将其赋值给mac。2) public virtual void start(double time){... //设置timer状态,记录时间s.schedule(this, &intr, rtime); //this为timer自己的引用;rtime为timer定时器的计时时长;&intr为Event类型,用于标记此定时器事件在当前时间之后的rtime秒后调用此定时器事件(&intr)的handler句柄this } 例如:s.schedule(&sleep_handler,&sleep_event,duration_); //表示调度:在当前时间之后的duration_秒后调用sleep_event事件的sleep_handlerstart()最终调用schedule(),使事件调度器在经过rtime时间之后通知timer处理超时,以此实现了定时和超时通知的,即定时器的能力实际是由基于时间的事件调度器来实现的。3) public virtual void stop()主要调用了Scheduler::cancel(&intr)方法,取消调度器中的该定时器事件,并重置timer状态。4) public inline double expire(){return ((stime + rtime) - Scheduler::instance().clock());}区别于NS的通用定时器TimerHandler::expire(),此方法仅用于返回距离定时器超时还有多久时间。

一、BackoffTimer:


(1)主要目的:用于竞争退避机制

1.当检测到信道空闲了一个DIFS或EIFS时间后,

如果此时站点STA(节点)的退避计时器为0(backoff timer==0),那么STA将会产生一个随机回退时间再接入信道发送数据,而不是立即接入信道(目的:为了减少多个等待的STA在DIFS时间后同时接入而产生冲突);

如果此时站点STA(节点)的退避计时器不为0(backoff timer != 0),则继续按照退避计时器的内容进行等待。

2.当检测到信道忙,则开始随机退避。

(2)Backoff time = Random()*slotTime

mhBackoff_.start(cw_, is_idle(),phymib_.getDIFS())中:rtime = (Random::random() % cw) * mac->phymib_.getSlotTime();

(3)Random():返回的是[0,CW]之间的一个随机整数,CW为当前竞争窗口的大小。

(4)在DIFS或EIFS时间结束后,STA继续检测信道,每检测完一个空闲的slotTime,退避计时器减一;

如果退避计时器还在计时工作的期间检测到信道忙,则暂停退避计时器,等到信道重新空闲且持续了DIFS或EIFS时间后,退避计 时器才继续工作。

重要属性/方法:1) public void handle(Event *e){ ... // 重置timer状态mac->backoffHandler() // 调用Mac802_11对应超时处理方法}BackoffTimer超时的处理方法,将真正的backoff超时处理交给Mac802_11完成。2) public void start(int cw, int idle){ ...rtime = (Random::random() % cw) * mac->phymib_.getSlotTime(); // 生成随机回退时间...if(idle == 0)paused_ = 1; // 当前信道不空闲,则暂停BackoffTimer,实际最终会触发pause()方法else {assert(rtime >= 0.0);s.schedule(this, &intr, rtime); // 信道为空闲,开始回退计时} //在当前时间之后的rtime秒后调用此Backoff定时器事件的handler句柄this,handler函数中再调用backoffHandler()函数} 该方法即可用于启动新的回退计时,也可用于“暂停”当前回退计时。3) public void pause() { ... // 计算剩余回退时隙数slots rtime -= (slots * mac->phymib_.getSlotTime()); // 修改超时时间s.cancel(&intr); //取消调度器中的该定时事件,从而达到暂停计时的目的 } 该方法为暂停BackoffTimer所做的实际操作。4) public void resume(double difs) { ... difs_wait = difs; // 重置difs间隔时长 s.schedule(this, &intr, rtime + difs_wait); // 恢复回退计时 } 该方法用于重置difs间隔并恢复BackoffTimer的计时;


二、DeferTimer
(1)主要目的:
用于表示接入信道需要延迟的时间(不包括退避时间:backoff time)
1.当STA侦听信道是正确接收到了RTS/CTS等信息时,会得知当前信道将被占用的时长,该时长加上DIFS或EIFS即为需要延迟接入的时间defer time。

当MAC层使用握手机制发送RTS帧或使用常规机制发送DATA帧时会事先为该帧设置一个退避定时器BackoffTimer并按照二进制退避规则退避定时。当信道处于忙状态时退避定时器暂停信道空闲时恢复运行。其定时器值一般是DIFS加上随机数目的退避时隙长。当定时器结束时自动调用处理函数backoffHandler()完成相应帧的发送。

DeferTimer主要用于握手机制中CTS、DATA、ACK帧的发送调度一旦启动就会持续运行至定时结束即使信道处于忙状态时也不暂停。定时值一般是最小帧间隙SIFS以便为通信双方提供最优先的信道接入。DeferTimer定时器定时结束后会触发其处理函数deferHandler()完成相关分组的发送。


三、NavTimer:
1.NAV (网络分配矢量 Network Allocation Vector):通过控制信息来得知信道情况,而不是实际检测物理信道,它指示基站(节
点)不能在无线介质上发起传输的时间段,无论基站是否检测到信道空闲;
2.STA通过接收其它STA发送的帧里的Duration/ID域来更新NAV——当该值大于当前STA的NAV值且该帧不是发给这个STA的时候,就以
新的值设置NAV。
set_nav(usec(phymib_.getEIFS()));
set_nav(mh->dh_duration);等
3.NAV用于实现虚拟载波监听,它关注介质的忙状态(它在介质忙的时候递减):当NAV计数器不为0时,认为信道忙;为0时,认为信道空闲。
而backoff timer用于实现回退机制以减少冲突,它关注介质的空闲状态(它在介质空闲的时候递减)。


四、RxTimer:
1.用于模拟接收一个完整分组所花的接收时延;
2.在在Mac802_11::recv()方法中启动(即接收分组时启动),Mac802_11进入MAC_RECV状态,在定时器超时前若又有其它分组到来则会改变mac状态;
在定时器超时后检查mac状态即可得知分组是否正确接收完。

Mac802_11::recv(Packet *p, Handler *h){....mhRecv_.start(txtime(p)); }BackoffTimer::start(int cw, int idle, double difs){....if(idle == 0)paused_ = 1;else { //if channel is idle, start the backofftimerassert(rtime + difs_wait >= 0.0);s.schedule(this, &intr, rtime + difs_wait); //call BackoffTimer::handle(Event *), call mac->backoffHandler()}}


五、TxTimer:
1.发送方发出一个消息后需要得到相应回复,如CTS/ACK等;该定时器即被发送方用于对回复信息的计时
2.在Mac802_11::transmit()方法中启动,定时器超时后表示在规定时间内没有收到回复,调用Mac802_11:: sendHandler(),进而
调用Mac802_11::send_timer(),根据发送状态判断是否需要重传以及重传何种类型的消息(RTS/CTS/DATA/ACK)

Mac802_11::transmit(Packet *p, double timeout){ .....downtarget_->recv(p->copy(), this); // 3. call downtarget_ to receive a copy of this packet://Pass this packet to the "interface", which will in turn place the packet, on the channel.mhSend_.start(timeout); // 4.start sendtimer:(call mac->sendHandler(), call send_timer()): judge whether need for re-transmission.mhIF_.start(txtime(p)); // 5.start IFTimer: call txHandler()}MacTimer::start(double time){Scheduler &s = Scheduler::instance();.....s.schedule(this, &intr, rtime);}

六、IFTimer:

1.用于模拟发送一个完整分组所花的发送时延
2.在Mac802_11::transmit()方法中启动,定时器超时后表示分组已经发送成功,调用Mac802_11::txHandler(),其中调用mac层

trace对象EOTtarget_->recv(eotPacket_, (Handler *) 0),并设置mac的发送状态tx_active_为0。


二至六号的Timer属性总结为:
public void handle(Event *e)
{
... // 重置timer状态
mac->XXXHandler() // 调用Mac802_11对应超时处理方法,XXX通常为timer名称
}
XXXTimer超时的处理方法,将实际的超时处理交给Mac802_11:: XXXHandler()方法完成。


总结
NS中定时器工作机制总结如下:
1. 先通过定时器的start(time)方法,向Scheduler中加入延迟为time的事件,事件的处理器为Timer自己;
2. 延迟time时间之后,Scheduler调度Timer的handle()方法,表示定时器超时,进而实现定时器超时处理;
3. 超时前可以调用Timer的stop方法,进而调用Scheduler::cancel(e)方法,取消定时器计时事件。


 
原创粉丝点击