日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NS 802.11函数分析(一)

發布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NS 802.11函数分析(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?recv函數有兩個作用,不僅是接收其他節點發送的包,而且當節點接收到其他包的時候也會調用recv()

首先給出NS2中recv的源碼,和一些注釋:

1 void 2 Mac802_11::recv(Packet *p, Handler *h) 3 { 4 struct hdr_cmn *hdr = HDR_CMN(p); 5 /* 6 * Sanity Check 7 */ 8 assert(initialized()); 9 10 /* 11 * Handle outgoing packets. 12 */ 13 if(hdr->direction() == hdr_cmn::DOWN) {//向下傳輸,也就是節點要向外發送,故調用recv() 14 send(p, h); 15
16 return; 17 } 18 /* 19 * Handle incoming packets. 20 * 21 * We just received the 1st bit of a packet on the network 22 * interface. 23 * 24 */ 25 26 /* 27 * If the interface is currently in transmit mode, then 28 * it probably won't even see this packet. However, the 29 * "air" around me is BUSY so I need to let the packet 30 * proceed. Just set the error flag in the common header 31 * to that the packet gets thrown away. 32 */ 33 if(tx_active_ && hdr->error() == 0) {//如果當前正在發送的話則標記為錯誤,這個數據包會在后面的函數中被處理掉 34 hdr->error() = 1; 35 } 36 37 if(rx_state_ == MAC_IDLE) {//如果當前空閑則設置為接收態 38 setRxState(MAC_RECV); 39 pktRx_ = p; 40 /* 41 * Schedule the reception of this packet, in 42 * txtime seconds. 43 */ 44 if (mhProbe_.busy() && OnMinChannelTime) { 45 Recv_Busy_ = 1; // Receiver busy indication for Probe Timer 46 } 47 48
49 mhRecv_.start(txtime(p)); 50 } else { 51 /* 52 * If the power of the incoming packet is smaller than the 53 * power of the packet currently being received by at least 54 * the capture threshold, then we ignore the new packet. 55 */ 56 if(pktRx_->txinfo_.RxPr / p->txinfo_.RxPr >= p->txinfo_.CPThresh) {//有沖突發生時,如果新到的包功率比較小,信噪比在閥值以下的時候調用capture函數,主要作用是 57 capture(p); 58 } else {//沖突比較大的時候需要調用沖突函數 59 collision(p); 60 } 61 }

?  總結一下recv函數的工作流程主要是以下一些階段:

  1、判斷這個包是要發出去的還是收到的,發出去的直接調用send函數就行;

  2、判斷MAC的狀態,如果是發送態就直接將這個包標記為錯誤(這個錯誤會在后面處理),如果是空閑狀態,則這個時候可以正常接收數據包,將MAC狀態轉換成MAC_RECV狀態然后保存定時器(定時器的作用是NS2模擬發包過程,當定時器為零才發送完成)

  3、如果MAC不是空閑,我們正在接收其他的包,那么我們需要判斷這時新到的包是否會影響到原來正在接收的,也就是計算信噪比與閥值比較,當在閥值以下的時候我們忽略這個包(調用capture),否則產生沖突。

但是這兩個函數也不是十分簡單的。首先看capture:

?

1 void 2 Mac802_11::capture(Packet *p) 3 { 4 /* 5 * Update the NAV so that this does not screw 6 * up carrier sense. 7 */ 8 set_nav(usec(phymib_.getEIFS() + txtime(p))); 9 Packet::free(p); 10 }

?   這段代碼的作用是當新到達的包不會對原來的接收造成影響的時候,將這個包作為一個多余的信息丟掉,即free。但是還有一個設置NAV的值為EIFS+這個數據包傳輸時間,關于這一點我的理解是:假設這個節點順利完成了當前的接收任務,如果說干擾包的發送還是沒有完成的話,必然會再次收到它的信號,但是這個信號必然是無效的,所以直接設置NAV可以避開這個問題

再看collision:

1 void 2 Mac802_11::collision(Packet *p) 3 { 4 switch(rx_state_) { 5 case MAC_RECV: 6 setRxState(MAC_COLL); 7 /* fall through */ 8 case MAC_COLL: 9 assert(pktRx_); 10 assert(mhRecv_.busy()); 11 /* 12 * Since a collision has occurred, figure out 13 * which packet that caused the collision will 14 * "last" the longest. Make this packet, 15 * pktRx_ and reset the Recv Timer if necessary. 16 */ 17 if(txtime(p) > mhRecv_.expire()) { 18 mhRecv_.stop(); 19 discard(pktRx_, DROP_MAC_COLLISION); 20 pktRx_ = p; 21 mhRecv_.start(txtime(pktRx_)); 22 } 23 else { 24 discard(p, DROP_MAC_COLLISION); 25 } 26 break; 27 default: 28 assert(0); 29 } 30

?

這一段代碼主要是完成沖突的處理:

1、判斷如果是正常接收狀態,到這應該應經是沖突發生了,所以我們要改變MAC的狀態。

2、在沖突狀態下,他這采取了選擇接收結束時間按比較晚的那個包(但是這個包最終也會因為沖突發生被丟棄),至于原因感覺跟上面差不多既然沖突發生了,即使后來可以接收到一部分正確的包,但是意義也不大,所以直接用接收一個時間較長的把這段跳過去。

  這就是recv的大概過程了,牽涉的其他細節由于暫時沒有用到就沒有深究了。我理解不對的地方歡迎指正。

轉載于:https://www.cnblogs.com/MrLJC/p/3423645.html

總結

以上是生活随笔為你收集整理的NS 802.11函数分析(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。