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

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_handler

start()最終調用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 backofftimer
assert(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)方法,取消定時器計時事件。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章