2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p> 網(wǎng)絡(luò)模擬和協(xié)議仿真課程設(shè)計(jì)</p><p> 課程題目:基于NS-2的SDRAD路由協(xié)議的實(shí)現(xiàn) 人 員:*****</p><p><b>  摘要</b></p><p>  在網(wǎng)絡(luò)路由技術(shù)的研究中,實(shí)際網(wǎng)絡(luò)系統(tǒng)的實(shí)現(xiàn)往往是代價(jià)很高或不現(xiàn)實(shí)的。利用網(wǎng)絡(luò)仿真器NS2 對相關(guān)網(wǎng)絡(luò)路由協(xié)議進(jìn)行仿真是一種既有效又經(jīng)濟(jì)

2、的研究方法,但目前的NS2 還不能支持所有網(wǎng)絡(luò)路由協(xié)議的仿真。本文根據(jù)拓展仿真的原理和方法,對在NS2 中添加路由協(xié)議進(jìn)行了研究,添加了SDRAD 路由協(xié)議。</p><p>  關(guān)鍵詞:NS2;拓展仿真;路由協(xié)議;SDRAD</p><p><b>  引言</b></p><p>  在真實(shí)的網(wǎng)絡(luò)中,設(shè)計(jì)和調(diào)試網(wǎng)絡(luò)協(xié)議是一件困難且復(fù)雜的事情

3、,仿真成了最佳可供選擇的測試、評估和驗(yàn)證手段之一。網(wǎng)絡(luò)仿真是用計(jì)算機(jī)程序?qū)νㄐ啪W(wǎng)絡(luò)進(jìn)行模型化,通過程序的運(yùn)行模仿通信網(wǎng)絡(luò)的運(yùn)行過程。這是一種進(jìn)行網(wǎng)絡(luò)技術(shù)研究的基本手段,不僅適用于網(wǎng)絡(luò)模型的構(gòu)造和設(shè)計(jì)、協(xié)議性能的評價(jià)與分析,還適用于網(wǎng)絡(luò)協(xié)議的開發(fā)與研究以及真實(shí)網(wǎng)絡(luò)的故障診斷。網(wǎng)絡(luò)模擬器NS2(Network Simulator v2)是一種免費(fèi)、源代碼公開的模擬軟件平臺(tái),其協(xié)議代碼與真實(shí)網(wǎng)絡(luò)應(yīng)用代碼很相似,仿真結(jié)果具有可靠性。NS2 是一

4、個(gè)面向?qū)ο蟮碾x散事件驅(qū)動(dòng)網(wǎng)絡(luò)模擬器,支持多種流行的網(wǎng)絡(luò)協(xié)議如TCP、UDP 和路由調(diào)度、擁塞控制算法等。相對于一般的離散型模擬器,NS2 的優(yōu)勢在于它有非常豐富的構(gòu)件庫,而且這些對象易于組合,易于拓展,但是對用戶的編程能力,實(shí)際網(wǎng)絡(luò)協(xié)議的理解能力要求較高。本文利用NS2 已有的對象,組合所要研究的網(wǎng)絡(luò)系統(tǒng)模型,在NS2 中添加了一個(gè)SDRAD[1]路由協(xié)議進(jìn)行網(wǎng)絡(luò)仿真。</p><p>  由于無線傳感器網(wǎng)絡(luò)的眾

5、多優(yōu)勢,如可迅速大規(guī)模部署、可進(jìn)行各種環(huán)境下的長期監(jiān)測、可減少人為干涉等,使得它逐步應(yīng)用到各種軍事和民用領(lǐng)域,包括環(huán)境監(jiān)測、智能交通等。數(shù)據(jù)收集是無線傳感器網(wǎng)絡(luò)路由中的一種特殊情況,主要任務(wù)是通過單跳或多跳的方式將網(wǎng)絡(luò)中傳感器節(jié)點(diǎn)收集的數(shù)據(jù)傳送給基站。在環(huán)境監(jiān)測應(yīng)用中。可采用數(shù)據(jù)收集的方式將數(shù)據(jù)匯集到匯聚節(jié)點(diǎn).再進(jìn)行進(jìn)一步分析。用無線傳感器網(wǎng)絡(luò)進(jìn)行環(huán)境數(shù)據(jù)收集時(shí)。不同于其他對實(shí)時(shí)性要求比較高的應(yīng)用,其對數(shù)據(jù)傳輸?shù)难舆t性沒有太大要求,數(shù)據(jù)

6、傳輸速率也較低,對帶寬也無過高要求。如何降低網(wǎng)絡(luò)能耗、延長網(wǎng)絡(luò)生命周期成了環(huán)境監(jiān)測中數(shù)據(jù)收集的首要問題。DRAD[2] 路由協(xié)議可以很好地滿足上面提到的要求。為了模擬DRAD的原理,對它進(jìn)行了簡化,形成了SDRAD協(xié)議。</p><p><b>  目錄</b></p><p>  第一章 協(xié)議介紹1</p><p>  第二章 協(xié)議設(shè)計(jì)2

7、</p><p>  2.1 網(wǎng)絡(luò)拓?fù)湫纬呻A段2</p><p>  2.2 數(shù)據(jù)收集階段3</p><p>  第三章 協(xié)議實(shí)現(xiàn)4</p><p>  3.1 SDRAD協(xié)議類4</p><p>  3.2 數(shù)據(jù)包頭5</p><p><b>  3.3 鄰居表6<

8、/b></p><p>  3.4 SDRAD協(xié)議類的實(shí)現(xiàn)7</p><p>  3.4.1 鄰居表管理7</p><p>  3.4.2 SDRAD路由協(xié)議中的關(guān)鍵函數(shù)8</p><p>  3.5 將SDRAD整合到NS-2.35中10</p><p>  3.5.1 建立協(xié)議文件10</p

9、><p>  3.5.2 修改NS-2.35源碼10</p><p>  3.5.3 編譯NS-2.35源文件11</p><p>  第四章 仿真驗(yàn)證12</p><p>  4.1 編寫仿真tcl腳本sdrad.tcl12</p><p>  4.2 在cygwin窗口中運(yùn)行仿真命令15</p&

10、gt;<p>  第五章 實(shí)驗(yàn)結(jié)果分析16</p><p>  5.1 拓?fù)湫纬呻A段16</p><p>  5.2 據(jù)收集階段17</p><p><b>  第六章 總結(jié)20</b></p><p><b>  參考文獻(xiàn)21</b></p><p>

11、;<b>  附錄22</b></p><p>  sdrad.h22</p><p>  sdrad_packet.h24</p><p>  sdrad_nbtable.h25</p><p>  sdrad.cc26</p><p><b>  第一章 協(xié)議介紹</

12、b></p><p>  先來介紹一下DRAD協(xié)議,DRAD是(a Data collection Routing algorithm based on Asynchronous Duty-cycle in Wireless Sensor Networks)的簡稱,是一種基于異步休眠調(diào)度、用于環(huán)境監(jiān)監(jiān)測應(yīng)用的數(shù)據(jù)收集協(xié)議。節(jié)點(diǎn)定期收集環(huán)境信息匯總到基站。為了將數(shù)據(jù)傳送到基站,DRAD將網(wǎng)絡(luò)描述成樹狀結(jié)構(gòu)。節(jié)

13、點(diǎn)將自身感知到的數(shù)據(jù)或者需要轉(zhuǎn)發(fā)的數(shù)據(jù)通過下一跳節(jié)點(diǎn)向基站方向發(fā)送。但是,節(jié)點(diǎn)不是僅僅維護(hù)其下一跳節(jié)點(diǎn)的信息,而是維護(hù)所有鄰居的信息。當(dāng)節(jié)點(diǎn)的下一跳節(jié)點(diǎn)失效時(shí)可以采用迂回策略,使數(shù)據(jù)包最終到達(dá)基站。</p><p>  網(wǎng)絡(luò)中的節(jié)點(diǎn)按照一定的規(guī)律進(jìn)行休眠調(diào)度,節(jié)點(diǎn)維護(hù)的鄰居相關(guān)信息除了最小跳步數(shù)、剩余能量、鏈路質(zhì)量等常用選路困素外,還包括計(jì)算其醒來的時(shí)間差。網(wǎng)絡(luò)不需要全局或局部的時(shí)間同步,也不要求節(jié)點(diǎn)修改內(nèi)部時(shí)鐘

14、。而是通過記錄的與鄰居節(jié)點(diǎn)的時(shí)間差,決定發(fā)送數(shù)據(jù)包的時(shí)刻。此外,可以通過發(fā)送的數(shù)據(jù)包和接收節(jié)點(diǎn)回饋的ACK進(jìn)行時(shí)間差修補(bǔ)。對下一跳節(jié)點(diǎn)進(jìn)行選擇時(shí),加入對鄰居節(jié)點(diǎn)醒來先后順序的考慮。為了簡單起見,路由方面借鑒經(jīng)典的基于地理位置路由的選路策略,如貪婪路由、對網(wǎng)絡(luò)空洞的處理。休眠調(diào)度也是利用簡單的調(diào)度策略,實(shí)現(xiàn)定義節(jié)點(diǎn)的睡眠和活躍周期。</p><p>  SDRAD 路由協(xié)議是對DRAD協(xié)議的簡寫,簡化了的DRAD

15、協(xié)議。SDRAD 主要實(shí)現(xiàn)了建立網(wǎng)絡(luò)結(jié)構(gòu),收集數(shù)據(jù)信息的功能[3]。</p><p><b>  第二章 協(xié)議設(shè)計(jì)</b></p><p>  SDRAD 協(xié)議分兩個(gè)階段:網(wǎng)絡(luò)拓?fù)湫纬呻A段和數(shù)據(jù)收集階段。接下來將對</p><p>  這兩個(gè)階段進(jìn)行詳細(xì)說明。</p><p>  2.1 網(wǎng)絡(luò)拓?fù)湫纬呻A段</p&g

16、t;<p>  當(dāng)節(jié)點(diǎn)部署到網(wǎng)絡(luò)并開啟電源后,并不是立即進(jìn)入數(shù)據(jù)收集。而是首先由基站發(fā)送Hello 包,節(jié)點(diǎn)接受到Hello 包后,更新自己的鄰居節(jié)點(diǎn)信息,從而建立樹狀的網(wǎng)絡(luò)結(jié)構(gòu)。協(xié)議剛啟時(shí),所有節(jié)點(diǎn)的跳步數(shù)都為無窮大。首先,由基站廣播Hello 包,為了簡單,本例中將基站固定為序列號為0 的節(jié)點(diǎn)。節(jié)點(diǎn)接收到Hello 包后,更新本節(jié)點(diǎn)跳步數(shù)和鄰居列表,廣播自身。</p><p>  Hello包的

17、分組頭</p><p>  節(jié)點(diǎn)的分布及形成的拓?fù)潢P(guān)系:</p><p><b>  圖1 結(jié)點(diǎn)分布</b></p><p>  如圖1,網(wǎng)絡(luò)中共有0~7 個(gè)節(jié)點(diǎn),其中節(jié)點(diǎn)0 為基站,其跳步數(shù)為0。節(jié)點(diǎn)1,2 的跳步數(shù)為1,節(jié)點(diǎn)3,4,5 的跳步數(shù)為2,節(jié)點(diǎn)6 的跳步數(shù)為3。在網(wǎng)絡(luò)形成階段由基站發(fā)送Hello 包,節(jié)點(diǎn)1,2 接收到Hello

18、 包,將節(jié)點(diǎn)0加入到它們的鄰居表中,同時(shí)節(jié)點(diǎn)1,2 重新向外發(fā)送Hello 包,被節(jié)點(diǎn)3,4,5接收,依次建立鄰居表,形成SDRAD 的拓?fù)潢P(guān)系。</p><p>  2.2 數(shù)據(jù)收集階段</p><p>  進(jìn)入數(shù)據(jù)收集階段后,當(dāng)網(wǎng)絡(luò)中某一節(jié)點(diǎn)接受到數(shù)據(jù)包后,該節(jié)點(diǎn)就會(huì)向鄰居表中的某一節(jié)點(diǎn)發(fā)送數(shù)據(jù)收集包(collect 包),最終將接收到的數(shù)據(jù)信息發(fā)送到基站,傳給應(yīng)用程序進(jìn)行處理。選擇哪

19、一個(gè)鄰居節(jié)點(diǎn)呢?協(xié)議將隨機(jī)選擇鄰居表的一個(gè)節(jié)點(diǎn)進(jìn)行轉(zhuǎn)發(fā)。</p><p>  圖2 數(shù)據(jù)轉(zhuǎn)發(fā)路徑圖</p><p>  如圖2,節(jié)點(diǎn)6 接收到數(shù)據(jù)信息,節(jié)點(diǎn)6將該數(shù)據(jù)封裝成Collect 包,依次傳送給節(jié)點(diǎn)5、節(jié)點(diǎn)1、在到基站(節(jié)點(diǎn)0)。路徑中結(jié)點(diǎn)5與結(jié)點(diǎn)1都是隨機(jī)選擇的。</p><p><b>  第三章 協(xié)議實(shí)現(xiàn)</b></p&g

20、t;<p>  3.1 SDRAD協(xié)議類</p><p>  為了實(shí)現(xiàn)SDRAD 協(xié)議類, 我們編寫了4 個(gè)程序文件, 分別是sdrad.h、sdrad.cc(SDRAD 協(xié)議的定義和實(shí)現(xiàn))、sdrad_packet.h(SDRAD 新增包頭的定義)、sdrad_nbtable.h(鄰居表的定義和實(shí)現(xiàn))。</p><p>  在ns2 中,所有路由協(xié)議都是從Agent 類繼承

21、而來的,實(shí)現(xiàn)協(xié)議時(shí)主要關(guān)心的是節(jié)點(diǎn)對包的接收和發(fā)送,即recv 函數(shù)和send 函數(shù)。Recv 函數(shù)一般從Agent 類繼承而來,send 函數(shù)根據(jù)需要自己編寫。下面給出SDRAD 協(xié)議類的定義:</p><p>  class SDRAD: public Agent {</p><p>  friend class SDRAD_Neighbor; //SDRAD_Neighbor 類是鄰

22、居表類</p><p>  friend class SDRAD_HelloTimer; //Hello 定時(shí)器類</p><p><b>  public:</b></p><p>  SDRAD(nsaddr_t id); //含一個(gè)參數(shù)的構(gòu)造函數(shù)</p><p>  void recv(Packet *p, Han

23、dler*); //接收上層協(xié)議送下來的數(shù)據(jù)并處理</p><p>  protected:</p><p>  //命令處理函數(shù),實(shí)現(xiàn)Tcl 和C++之間的信息交換</p><p>  int command(int ,const char* const*);</p><p>  inline int initialized() { ret

24、urn 1 && target_; }</p><p>  //對上層發(fā)送的數(shù)據(jù)進(jìn)行處理</p><p>  void resolve(Packet *p);</p><p>  //鄰居表的信息維護(hù)</p><p>  void nb_insert(u_int32_t seqno, u_int8_t hop); //插入&l

25、t;/p><p>  SDRAD_Neighbor* nb_lookup(u_int32_t seqno); //查找</p><p>  void nb_delete(u_int32_t seqno); //刪除</p><p>  void nb_purge(); //清空</p><p>  void nb_print(); //打印,檢驗(yàn)

26、協(xié)議所建立的拓?fù)涫欠穹弦?lt;/p><p>  void forward(u_int32_t seqno,Packet *p, double delay); //轉(zhuǎn)發(fā)函數(shù)</p><p>  void sendHello(bool isbase); //發(fā)送Hello 包</p><p>  //Packet RX Routines</p><

27、p>  void recvHello(Packet *p); //接收Hello 包</p><p>  //接收SDRAD 包(包括Hello 包和Collect 包)</p><p>  void recvSDRAD(Packet*p);</p><p>  //Packet collect Routines,發(fā)送、接收Collect 包</p>

28、;<p>  void sendCollect(u_int32_t ipdst);</p><p>  void recvCollect(Packet *p);</p><p><b>  //Timers</b></p><p>  SDRAD_HelloTimer htimer; //定義定時(shí)器</p><

29、p><b>  private:</b></p><p>  //本協(xié)議中為了簡化處理,將IP 地址和序列號設(shè)置為同一唯一值</p><p>  nsaddr_t index_; //本節(jié)點(diǎn)的IP 地址</p><p>  u_int32_t seqno_; //本節(jié)點(diǎn)的序列號</p><p>  u_int8_t

30、 hop_count_; //節(jié)點(diǎn)跳步數(shù)</p><p>  protected:</p><p>  SDRAD_nbtable nbthead_; //定義鄰居表</p><p>  //為調(diào)試和跟蹤定義的變量</p><p>  Trace *logtarget_;</p><p>  NsObject *upt

31、arget_;</p><p>  NsObject *port_dmux_;</p><p><b>  };</b></p><p><b>  其構(gòu)造函數(shù)的實(shí)現(xiàn):</b></p><p>  voidSDRAD::SDRAD(nsaddr_t id):Agent(PT_SDRAD),port_

32、dmux_(0),htimer(this){</p><p>  index_ = id;</p><p>  seqno_ = id; //</p><p>  hop_count_ = INFINITY; //跳步數(shù)為無窮大</p><p>  logtarget_ = 0;</p><p>  LIST_INIT

33、(&nbthead_);</p><p>  length = 0; //鄰居表長度</p><p><b>  }</b></p><p><b>  3.2 數(shù)據(jù)包頭</b></p><p>  現(xiàn)在,我們?yōu)镾DRAD 協(xié)議新建包頭,對應(yīng)實(shí)現(xiàn)協(xié)議中的分組頭。下述代碼在sdrad_pack

34、et.h 中:</p><p>  //SDRAD包頭:hdr_sdrad</p><p>  struct hdr_sdrad {</p><p>  u_int8_t dh_type; //分組類型</p><p>  static int offset_;</p><p>  inline static int&

35、amp; offset() { return offset_; }</p><p>  inline static hdr_sdrad* access(const Packet* p) {</p><p>  return (hdr_sdrad*) p->access(offset_);</p><p><b>  }</b></p

36、><p><b>  };</b></p><p>  Hello包頭:hdr_sdrad_hello</p><p>  struct hdr_sdrad_hello {</p><p>  u_int8_t hh_type; //分組類型</p><p>  u_int8_t hh_hop_cou

37、nt; //跳步數(shù)</p><p>  u_int32_t hh_src_seq; //源節(jié)點(diǎn)序列號</p><p><b>  //計(jì)算包頭大小</b></p><p>  inline int size() {</p><p>  int sz = 0;</p><p>  sz = size

38、of(u_int8_t)</p><p>  + sizeof(u_int8_t)</p><p>  + sizeof(u_int32_t);</p><p>  return sz;</p><p><b>  }</b></p><p><b>  };</b><

39、/p><p>  Collect包頭:hdr_sdrad_collect</p><p>  struct hdr_sdrad_collect {</p><p>  u_int8_t hc_type; //分組類型</p><p>  u_int8_t hc_hop_count; //跳步數(shù)</p><p>  u_in

40、t32_t hc_src_seq; //源節(jié)點(diǎn)序列號</p><p>  u_int32_t hc_dst_seq; //目的節(jié)點(diǎn)序列號</p><p>  inline int size() {//計(jì)算包頭大小</p><p>  int sz = 0;</p><p>  sz = sizeof(u_int8_t)</p>

41、<p>  + sizeof(u_int8_t)</p><p>  + sizeof(u_int32_t)</p><p>  + sizeof(u_int32_t);</p><p>  return sz;</p><p><b>  }</b></p><p><b>

42、  };</b></p><p>  //聯(lián)合SDRAD 的分組頭,節(jié)約空間便于使用</p><p>  union hdr_all_sdrad {</p><p>  hdr_sdrad dh;</p><p>  hdr_sdrad_hello hh;</p><p>  hdr_sdrad_colle

43、ct hc;</p><p><b>  };</b></p><p><b>  3.3 鄰居表</b></p><p>  在ns2 中內(nèi)置了一個(gè)鏈表結(jié)構(gòu)list(源碼在~ns/lib/bsd-list.h 中),在此使用這個(gè)list 結(jié)構(gòu)實(shí)現(xiàn)鄰居類(sdrad_nbtable.h):</p><p

44、>  #include <lib/bsd-list.h> //包含頭文件</p><p>  class SDRAD_Neighbor {</p><p>  friend class SDRAD; //設(shè)置SDRAD 為友元</p><p><b>  public:</b></p><p>  SD

45、RAD_Neighbor(u_int32_t s, u_int8_t hop) { //構(gòu)造函數(shù)</p><p>  seqno_ = s;</p><p>  hop_count_ = hop;</p><p><b>  }</b></p><p>  protected:</p><p>&

46、lt;b>  //鏈表結(jié)構(gòu)</b></p><p>  LIST_ENTRY(SDRAD_Neighbor) nb_link; </p><p>  //鄰居結(jié)點(diǎn)中的字段</p><p>  u_int32_t seqno_; //序列號</p><p>  u_int8_t hop_count_; //跳步數(shù)</p&

47、gt;<p><b>  };</b></p><p><b>  //定義鏈表結(jié)構(gòu)</b></p><p>  LIST_HEAD(SDRAD_nbtable, SDRAD_Neighbor); </p><p>  解釋類的定義和編譯類的聯(lián)接</p><p>  解釋類和編譯類的連

48、接方法比較固定,對于只關(guān)心協(xié)議內(nèi)容的人,可參考ns2 中同層協(xié)議的實(shí)現(xiàn)方法。Tcl Hooks</p><p>  到目前為止,我們的SDRAD 協(xié)議還不能被ns 所認(rèn)可,還需要其它定義。下面部分是不可缺少的,而且通常只需要按照這個(gè)典型模式實(shí)現(xiàn)。其中Agent\SDRAD 指定了C++中的SDRAD 類和Tcl 部分中的Agent/SDRAD 綁定在了一起。</p><p>  //sdr

49、ad.cc 文件中:</p><p>  //TCL Hooks</p><p>  static class SDRADclass : public TclClass {</p><p><b>  public:</b></p><p>  SDRADclass():TclClass("Agent/SDRA

50、D") {}</p><p>  TclObject* create(int argc,const char* const* argv) {</p><p>  assert(argc == 5);</p><p>  return(new SDRAD((u_int32_t)atoi(argv[4])));</p><p><

51、b>  }</b></p><p>  }class_rtProtoSDRAD;</p><p>  3.4 SDRAD協(xié)議類的實(shí)現(xiàn)</p><p>  3.4.1 鄰居表管理</p><p>  本部分功能實(shí)現(xiàn)對鄰居表的增刪查改等,方便代理類的使用。</p><p><b>  插入<

52、;/b></p><p>  新建一個(gè)鄰居節(jié)點(diǎn),插入nbtable 中。</p><p>  void SDRAD::nb_insert(u_int32_t seqno, u_int8_t hop) </p><p><b>  查找</b></p><p>  查找序列號為seqno 的節(jié)點(diǎn)</p>

53、<p>  SDRAD_Neighbor* SDRAD::nb_lookup(u_int32_t seqno)</p><p><b>  刪除</b></p><p>  刪除序列號為seqno 的節(jié)點(diǎn)</p><p>  void SDRAD::nb_delete(u_int32_t seqno) </p><

54、;p><b>  清空</b></p><p><b>  清空鄰居表</b></p><p>  void SDRAD::nb_purge() </p><p><b>  打印</b></p><p>  輸出鄰居表的跳步數(shù)和序列號</p><p&

55、gt;  void SDRAD::nb_print() </p><p>  3.4.2 SDRAD路由協(xié)議中的關(guān)鍵函數(shù)</p><p>  1> command 函數(shù)</p><p>  int SDRAD::command(int argc,const char*const*argv)</p><p>  command 函數(shù)的寫

56、法固定,主要實(shí)現(xiàn)Otcl 和C++的交互,對Otcl 命令</p><p>  進(jìn)行解析。用來解析模擬器類create-sdrad-agent 函數(shù)中的命令。</p><p>  Simulator instproc create-sdrad-agent { node } {</p><p>  #Create SDRAD routing agent</p&g

57、t;<p>  set ragent [new Agent/SDRAD [$node id]]</p><p>  puts "=======[$node id]======== " ;#測試</p><p>  $self at 0.0 "$ragent start" ;# 在0.0s 啟動(dòng)協(xié)議</p><p>

58、;  $node set ragent_ $ragent</p><p>  return $ragent</p><p><b>  }</b></p><p>  2> recv函數(shù)</p><p>  void SDRAD::recv(Packet*p,Handler*)</p><p&

59、gt;  新協(xié)議類重載recv 函數(shù),判別分組包類型,并對其進(jìn)行轉(zhuǎn)發(fā)、更新、丟棄、重發(fā)等處理,來實(shí)現(xiàn)具體協(xié)議所要求的內(nèi)容。</p><p>  3> sendHello函數(shù)</p><p>  void SDRAD::sendHello(bool isbase){</p><p>  發(fā)送hello數(shù)據(jù)包?;局惶幚戆l(fā)送一次Hello 包,非基站節(jié)點(diǎn)根據(jù)自身

60、信息新建Hello 包,廣播。</p><p>  4> recvHello函數(shù)</p><p>  void SDRAD::recvHello(Packet*p)</p><p>  基站接收到Hello 包,丟棄;節(jié)點(diǎn)接收到自身廣播的Hello 包,丟棄;節(jié)點(diǎn)接收到有效Hello 包,更新本節(jié)點(diǎn)的跳步數(shù),將上一跳節(jié)點(diǎn)信息加入鄰居表,并廣播自身;丟棄重復(fù)鄰

61、居Hello 包和非鄰居包。</p><p>  HelloTimer定時(shí)器</p><p>  運(yùn)行一段時(shí)間的網(wǎng)絡(luò)會(huì)不穩(wěn)定(包括網(wǎng)絡(luò)中有新結(jié)點(diǎn)加入,節(jié)點(diǎn)壽命結(jié)束,能量用盡等),用HelloTimer 定時(shí)器定時(shí)發(fā)送Hello 包,更新鄰居信息,建立新的樹狀網(wǎng)絡(luò)結(jié)構(gòu)。</p><p>  sdrad.h 中HelloTimer 的定義:</p><

62、;p>  class SDRAD_HelloTimer : public Handler {</p><p><b>  public:</b></p><p>  SDRAD_HelloTimer(SDRAD* a) : agent(a) {}</p><p>  void handle(Event*);</p><

63、p><b>  private:</b></p><p>  SDRAD *agent;</p><p>  Event intr;</p><p><b>  };</b></p><p>  重寫handle 函數(shù),使基站發(fā)送Hello 包,建立新的網(wǎng)絡(luò)結(jié)構(gòu):</p><

64、;p>  void SDRAD_HelloTimer::handle(Event*) {</p><p>  agent->nb_purge(); //清楚鄰居表</p><p>  agent->sendHello(true); //基站發(fā)送Hello 包</p><p>  //該定時(shí)器每個(gè)50s 調(diào)度一次</p><p&g

65、t;  Scheduler::instance().schedule(this, &intr, 50);</p><p><b>  }</b></p><p><b>  Resolve函數(shù)</b></p><p>  void SDRAD:resolve(Packet *p) </p><p

66、>  節(jié)點(diǎn)通過第一節(jié)點(diǎn)建立好網(wǎng)絡(luò)結(jié)構(gòu)后,就進(jìn)入數(shù)據(jù)收集階段,此協(xié)議通過將有用數(shù)據(jù)處理成Collect 包在網(wǎng)絡(luò)之間傳送。在recv函數(shù)中節(jié)點(diǎn)在接收到有用數(shù)據(jù)后,通過resolve 函數(shù)將其處理成collect 包后轉(zhuǎn)發(fā)給鄰居節(jié)點(diǎn)。</p><p><b>  下一跳函數(shù)</b></p><p>  u_int32_t SDRAD::nexthop_random(

67、) </p><p>  隨機(jī)選擇鄰居表中節(jié)點(diǎn)編號</p><p>  轉(zhuǎn)發(fā)函數(shù)forward</p><p>  void SDRAD::forward(u_int32_t seqno,Packet *p, double delay) </p><p>  發(fā)送collect包函數(shù)</p><p>  void SD

68、RAD::sendCollect(u_int32_t ipdst) </p><p>  節(jié)點(diǎn)根據(jù)參數(shù)ipdst 確定下一跳目的地,發(fā)送collect包。</p><p>  接收collect包函數(shù)</p><p>  void SDRAD::recvCollect(Packet *p) </p><p>  節(jié)點(diǎn)隨機(jī)選擇下一跳,發(fā)送col

69、lect 包。 基站處理數(shù)據(jù),丟棄廢包。</p><p>  3.5 將SDRAD整合到NS-2.35中</p><p>  3.5.1 建立協(xié)議文件</p><p>  本協(xié)議程序共五個(gè)文件,分別是: sdrad_packet.h、sdrad_nbtable.h、sdrad.h 和sdrad.cc。在<ns-2.35>目錄下建立sdrad 文件夾,將

70、上述這5 個(gè)文件放進(jìn)去。</p><p>  3.5.2 修改NS-2.35源碼</p><p>  需要改五個(gè)文件:ns-2.35/common/packet.h</p><p>  ns-2.35/tcl/lib/ns-lib.tcl</p><p>  ns-2.35/tcl/lib/ns-packet.tcl</p>

71、<p>  ns-2.35/Makefile</p><p>  ns-2.35/common/packet.h文件中找到如下位置,添加紅色標(biāo)記的一行。</p><p>  static const packet_t PT_PROTONAME = 73;</p><p>  // insert new packet types here</p>

72、<p>  static packet_t PT_NTYPE = 75; // This MUST be the LAST one</p><p>  找到如下位置,添加紅色標(biāo)記的一行。</p><p>  name_[PT_DCCP_RESET]="DCCP_Reset";</p><p>  name_[PT_P

73、ROTONAME]= "protoname";</p><p>  name_[PT_SDRAD]="SDRAD";</p><p>  name_[PT_NTYPE]= "undefined";</p><p>  在ns-2.35/tcl/lib/ns-lib.tcl文件中找到如下位置,添加紅色標(biāo)記的一

74、段代碼。</p><p><b>  AODV {</b></p><p>  set ragent [$self create-aodv-agent $node]</p><p><b>  }</b></p><p><b>  SDRAD {</b></p>

75、<p>  set ragent [$self create-sdrad-agent $node]</p><p><b>  }</b></p><p><b>  AOMDV {</b></p><p>  set ragent [$self create-aomdv-agent $node]</p&

76、gt;<p><b>  }</b></p><p>  在合適的位置加入如下代碼:</p><p>  Simulator instproc create-sdrad-agent { node } {</p><p>  #Create SDRAD routing agent</p><p>  set

77、ragent [new Agent/SDRAD [$node id]]</p><p>  puts "=======[$node id]======== " ;#測試</p><p>  $self at 0.0 "$ragent start" ;# 在0.0s 啟動(dòng)協(xié)議</p><p>  $node set ragent

78、_ $ragent</p><p>  return $ragent</p><p><b>  }</b></p><p>  在ns-2.35/tcl/lib/ns-packet.tcl 文件中找到如下位置,添加紅色標(biāo)記部分。</p><p>  MDART # routing protocol for ad-ho

79、c networks</p><p>  # AOMDV patch</p><p><b>  AOMDV</b></p><p><b>  Protoname</b></p><p><b>  SDRAD#</b></p><p>  在ns-2

80、.35/Makefile文件中找到如下位置,添加紅色標(biāo)記部分</p><p>  wpan/p802_15_4trace.o wpan/p802_15_4transac.o \</p><p>  apps/pbc.o \</p><p>  protoname/protoname.o protoname/protoname_rtable.o \</p>

81、<p>  sdrad/sdrad.o \</p><p>  $(OBJ_STL)</p><p>  3.5.3 編譯NS-2.35源文件</p><p>  在cygwin中運(yùn)行如下命令完成源文件的編譯。</p><p>  huger@huger-PC ~/ns-allinone-2.35</p><

82、;p>  $ cd ns-2.35</p><p>  huger@huger-PC ~/ns-allinone-2.35/ns-2.35</p><p>  $ make clean</p><p>  huger@huger-PC ~/ns-allinone-2.35/ns-2.35</p><p><b>  $ mak

83、e</b></p><p><b>  第四章 仿真驗(yàn)證</b></p><p>  4.1 編寫仿真tcl腳本sdrad.tcl</p><p>  #Agent/UDP set packetSize_ 6000</p><p>  #Define options </p><p&g

84、t;  set val(ifqlen) 50 ;#max packet in ifq</p><p>  set val(nn) 7 ;#number of mobilenodes</p><p>  set val(rp) SDRAD</p><p>  set val(chan) Channel/

85、WirelessChannel</p><p>  set val(prop) Propagation/TwoRayGround</p><p>  set val(netif) Phy/WirelessPhy</p><p>  set val(mac) Mac/802_11</p><p>  set val(ifq)

86、 Queue/DropTail/PriQueue</p><p>  set val(ll) LL</p><p>  set val(ant) Antenna/OmniAntenna</p><p>  set val(stop) 20</p><p>  #==========================

87、==================</p><p>  # Main Program</p><p>  #============================================</p><p>  #ns_ random 0</p><p>  #Initialize Global Variables</p>

88、<p>  set ns_ [new Simulator]</p><p>  set tracefd [open sdrad.tr w]</p><p>  $ns_ trace-all $tracefd</p><p>  set namtrace [open sdrad.nam w]</p><p>  $ns_

89、 namtrace-all-wireless $namtrace 1000 500</p><p>  #set up topography</p><p>  set topo [new Topography]</p><p>  $topo load_flatgrid 1000 500</p><p>  #Create God<

90、/p><p>  create-god $val(nn)</p><p>  #Create the specified nunber of mobilenodes[$val(nn)] and "attach" them</p><p>  #to the channel.</p><p>  #configure node&

91、lt;/p><p>  set channel [new Channel/WirelessChannel]</p><p>  $channel set errorProbability_ 0.0</p><p>  $ns_ node-config -adhocRouting $val(rp)\</p><p>  -llType $val(l

92、l)\</p><p>  -macType $val(mac)\</p><p>  -ifqType $val(ifq)\</p><p>  -ifqLen $val(ifqlen)\</p><p>  -antType $val(ant)\</p><p>  -propType $val(prop)\<

93、;/p><p>  -phyType $val(netif)\</p><p>  -channel $channel\</p><p>  -topoInstance $topo\</p><p>  -agentTrace ON\</p><p>  -routerTrace ON\</p><p&

94、gt;  -macTrace OFF</p><p>  for {set i 0} {$i < $val(nn) } {incr i} {</p><p>  set node_($i) [$ns_ node]</p><p>  $node_($i) random-motion 0;</p><p><b>  }<

95、/b></p><p>  #Provide initial(X,Y,for now Z=0) co-ordinates for mobilenodes</p><p>  $node_(0) set X_ 100.0</p><p>  $node_(0) set Y_ 200.0</p><p>  $node_(0) set Z_

96、 0.0</p><p>  $node_(1) set X_ 250.0</p><p>  $node_(1) set Y_ 250.0</p><p>  $node_(1) set Z_ 0.0</p><p>  $node_(2) set X_ 250.0</p><p>  $node_(2) set Y

97、_ 150.0</p><p>  $node_(2) set Z_ 0.0</p><p>  $node_(3) set X_ 400.0</p><p>  $node_(3) set Y_ 300.0</p><p>  $node_(3) set Z_ 0.0</p><p>  $node_(4) set

98、X_ 400.0</p><p>  $node_(4) set Y_ 200.0</p><p>  $node_(4) set Z_ 0.0</p><p>  $node_(5) set X_ 400.0</p><p>  $node_(5) set Y_ 100.0</p><p>  $node_(5) s

99、et Z_ 0.0</p><p>  $node_(6) set X_ 550.0</p><p>  $node_(6) set Y_ 250.0</p><p>  $node_(6) set Z_ 0.0</p><p>  # Define node initial position in nam</p><p&

100、gt;  for {set i 0} {$i < $val(nn)} {incr i} {</p><p>  $ns_ initial_node_pos $node_($i) 50</p><p><b>  }</b></p><p>  set udp_(0) [new Agent/UDP]</p><p>

101、  $ns_ attach-agent $node_(6) $udp_(0)</p><p>  set null_(0) [new Agent/Null]</p><p>  $ns_ attach-agent $node_(0) $null_(0)</p><p>  $ns_ connect $udp_(0) $null_(0)</p><

102、p>  set cbr_(0) [new Application/Traffic/CBR]</p><p>  $cbr_(0) set packetSize_ 512</p><p>  $cbr_(0) set interval_ 0.05</p><p>  $cbr_(0) set random_ 1</p><p>  $cb

103、r_(0) set maxpkts_ 1000</p><p>  $cbr_(0) attach-agent $udp_(0)</p><p>  $ns_ at 5.0 "$cbr_(0) start"</p><p>  # Tell nodes when the simulation ends</p><p>  

104、for {set i 0} {$i < $val(nn) } {incr i} {</p><p>  $ns_ at $val(stop).0 "$node_($i) reset";</p><p><b>  }</b></p><p>  $ns_ at $val(stop).0 "stop"

105、</p><p>  $ns_ at $val(stop).01 "puts \"NS EXITING...\";$ns_ halt"</p><p>  proc stop {} {</p><p>  global ns_ tracefd </p><p>  $ns_ flush-trace<

106、;/p><p>  close $tracefd</p><p>  exec nam sdrad.nam &</p><p><b>  exit 0</b></p><p><b>  }</b></p><p>  puts "Starting Simul

107、ation..."</p><p>  $ns_ run </p><p>  4.2 在cygwin窗口中運(yùn)行仿真命令</p><p>  huger@huger-PC ~/ns-allinone-2.35/ns-2.35/sdrad</p><p>  $ startxwin</p><p> 

108、 huger@huger-PC ~/ns-allinone-2.35/ns-2.35/sdrad</p><p>  $ ns sdrad.tcl</p><p>  第五章 實(shí)驗(yàn)結(jié)果分析</p><p>  5.1 拓?fù)湫纬呻A段</p><p>  圖3 nam模擬拓?fù)湫纬呻A段截圖(圖中圓圈的大小代表先后順序)</p>&l

109、t;p>  圖4 trace文件</p><p>  結(jié)合圖3和圖4可以看出,拓?fù)湫纬呻A段基站(節(jié)點(diǎn)0)發(fā)送hello數(shù)據(jù)包之后,節(jié)點(diǎn)1、節(jié)點(diǎn)2接收hello數(shù)據(jù)包,接著節(jié)點(diǎn)1、節(jié)點(diǎn)2發(fā)送hello數(shù)據(jù)包,節(jié)點(diǎn)3、4、5收到hello數(shù)據(jù)包,最后節(jié)點(diǎn)6收到數(shù)據(jù)包,拓?fù)湫纬伞?lt;/p><p><b>  5.2 據(jù)收集階段</b></p><

110、p>  由于數(shù)據(jù)收集過程中,數(shù)據(jù)包是隨機(jī)選路的原因,不同時(shí)刻數(shù)據(jù)包所走的路徑是隨機(jī)的。下面隨機(jī)截取三個(gè)時(shí)刻的nam模擬的截圖如下:</p><p>  路徑:6 —> 4 —> 1 —> 0</p><p>  圖5 nam模擬的截圖</p><p>  圖6 trace文件</p><p>  從上面兩個(gè)圖分析,

111、節(jié)點(diǎn)6發(fā)送collect數(shù)據(jù)包給節(jié)點(diǎn)4,之后節(jié)點(diǎn)4轉(zhuǎn)發(fā)給節(jié)點(diǎn)1,最后發(fā)送給基站(節(jié)點(diǎn)0),節(jié)點(diǎn)0收到數(shù)據(jù)包。</p><p>  路徑:6 —> 3 —> 1 —> 0</p><p>  圖7 nam模擬截圖</p><p>  圖8 trace文件</p><p>  從上面兩個(gè)圖分析,節(jié)點(diǎn)6發(fā)送collect數(shù)據(jù)包

112、給節(jié)點(diǎn)3,之后節(jié)點(diǎn)3轉(zhuǎn)發(fā)給節(jié)點(diǎn)1,最后發(fā)送給基站(節(jié)點(diǎn)0),節(jié)點(diǎn)0收到數(shù)據(jù)包。</p><p>  路徑:6 —> 4 —> 2 —> 0</p><p>  圖9 nam模擬截圖</p><p>  圖10 trace文件</p><p>  從上面兩個(gè)圖分析,節(jié)點(diǎn)6發(fā)送collect數(shù)據(jù)包給節(jié)點(diǎn)3,之后節(jié)點(diǎn)3轉(zhuǎn)發(fā)給節(jié)點(diǎn)

113、2,最后發(fā)送給基站(節(jié)點(diǎn)0),節(jié)點(diǎn)0收到數(shù)據(jù)包。</p><p><b>  第六章 總結(jié)</b></p><p>  由于SDRAD協(xié)議是DRAD的簡化版,網(wǎng)絡(luò)中的節(jié)點(diǎn)不能按照一定的規(guī)律進(jìn)行休眠調(diào)度,節(jié)點(diǎn)維護(hù)的鄰居相關(guān)信息沒有剩余能量、鏈路質(zhì)量、計(jì)算其醒來的時(shí)間差等選路困素, 但是模擬的節(jié)點(diǎn)已經(jīng)能夠進(jìn)行簡單通信,建立樹形拓?fù)渎酚桑占瘮?shù)據(jù)傳送到基站。實(shí)現(xiàn)協(xié)議的流程

114、已經(jīng)成功,使得協(xié)議有更多的功能,需要在簡單協(xié)議的基礎(chǔ)上添加更多的內(nèi)容。</p><p>  通過這次課程設(shè)計(jì),對NS模擬器有了進(jìn)一步的認(rèn)識(shí),學(xué)會(huì)了在其上開發(fā)新協(xié)議的流程。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] NS-2學(xué)習(xí)筆記.</p><p>  [2] 劉微姍,陳曉江,段任,陳文娟

115、,劉晨,房鼎益. DRAD:一種基于異步休眠調(diào)度的無線傳感器網(wǎng)絡(luò)數(shù)據(jù)收集協(xié)議[J]. 計(jì)算機(jī)工程與科學(xué),2010,32 (11):40-51.</p><p>  [3] 宋玲,劉勃蘭. NS2 中添加路由協(xié)議的研究與實(shí)現(xiàn)[J]. 通訊和計(jì)算機(jī),2006,3(10):33-37</p><p><b>  附錄</b></p><p><

116、b>  sdrad.h</b></p><p>  #ifndef __SDRAD_H__</p><p>  #define __SDRAD_H__</p><p>  #include <sys/types.h></p><p>  #include <cmu-trace.h></p>

117、<p>  #include <priqueue.h></p><p>  #include <packet.h></p><p>  #include <agent.h></p><p>  #include "ip.h"</p><p>  #include "

118、;sdrad_nbtable.h"</p><p>  #include "sdrad_packet.h"</p><p>  #include <classifier-port.h></p><p>  #ifdef DEBUG</p><p>  FILE *fp=fopen("out

119、.txt","w+"); //just for test</p><p><b>  #endif</b></p><p>  //current time</p><p>  #define CURRENT_TIME Scheduler::instance().clock()</p>&l

120、t;p>  #define INFINITY 0xFF</p><p>  //hello time</p><p>  #define SDRAD_HELLO_DELAY 0.001//S</p><p>  #define SDRAD_HELLO_INTERVAL 1//1000ms</p><p>  #define SDRAD_

121、HELLO_END 20//S</p><p>  class SDRAD;</p><p>  class SDRAD_HelloTimer:public Handler{</p><p><b>  public:</b></p><p>  SDRAD_HelloTimer(SDRAD*a):agent(a){}&

122、lt;/p><p>  void handle(Event*);</p><p><b>  private:</b></p><p>  SDRAD *agent;</p><p>  Event intr;</p><p><b>  };</b></p>&l

123、t;p>  class SDRAD:public Agent{</p><p>  friend class SDRAD_Neighbor;</p><p>  friend class SDRAD_HelloTimer;</p><p><b>  public:</b></p><p>  SDRAD(nsad

124、dr_t id);</p><p>  void recv(Packet*p,Handler*);</p><p>  protected:</p><p>  int command(int,const char* const*);</p><p>  inline int initialized(){return 1&&t

125、arget_;}</p><p>  //Route Table Management</p><p>  void resolve(Packet *p);</p><p>  //Neighbor Table Management</p><p>  void nb_insert(u_int32_t seqno,u_int8_t hop);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論