版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 網(wǎng)絡模擬和協(xié)議仿真課程設計</p><p> 課程題目:基于NS-2的SDRAD路由協(xié)議的實現(xiàn) 人 員:*****</p><p><b> 摘要</b></p><p> 在網(wǎng)絡路由技術的研究中,實際網(wǎng)絡系統(tǒng)的實現(xiàn)往往是代價很高或不現(xiàn)實的。利用網(wǎng)絡仿真器NS2 對相關網(wǎng)絡路由協(xié)議進行仿真是一種既有效又經(jīng)濟
2、的研究方法,但目前的NS2 還不能支持所有網(wǎng)絡路由協(xié)議的仿真。本文根據(jù)拓展仿真的原理和方法,對在NS2 中添加路由協(xié)議進行了研究,添加了SDRAD 路由協(xié)議。</p><p> 關鍵詞:NS2;拓展仿真;路由協(xié)議;SDRAD</p><p><b> 引言</b></p><p> 在真實的網(wǎng)絡中,設計和調試網(wǎng)絡協(xié)議是一件困難且復雜的事情
3、,仿真成了最佳可供選擇的測試、評估和驗證手段之一。網(wǎng)絡仿真是用計算機程序對通信網(wǎng)絡進行模型化,通過程序的運行模仿通信網(wǎng)絡的運行過程。這是一種進行網(wǎng)絡技術研究的基本手段,不僅適用于網(wǎng)絡模型的構造和設計、協(xié)議性能的評價與分析,還適用于網(wǎng)絡協(xié)議的開發(fā)與研究以及真實網(wǎng)絡的故障診斷。網(wǎng)絡模擬器NS2(Network Simulator v2)是一種免費、源代碼公開的模擬軟件平臺,其協(xié)議代碼與真實網(wǎng)絡應用代碼很相似,仿真結果具有可靠性。NS2 是一
4、個面向對象的離散事件驅動網(wǎng)絡模擬器,支持多種流行的網(wǎng)絡協(xié)議如TCP、UDP 和路由調度、擁塞控制算法等。相對于一般的離散型模擬器,NS2 的優(yōu)勢在于它有非常豐富的構件庫,而且這些對象易于組合,易于拓展,但是對用戶的編程能力,實際網(wǎng)絡協(xié)議的理解能力要求較高。本文利用NS2 已有的對象,組合所要研究的網(wǎng)絡系統(tǒng)模型,在NS2 中添加了一個SDRAD[1]路由協(xié)議進行網(wǎng)絡仿真。</p><p> 由于無線傳感器網(wǎng)絡的眾
5、多優(yōu)勢,如可迅速大規(guī)模部署、可進行各種環(huán)境下的長期監(jiān)測、可減少人為干涉等,使得它逐步應用到各種軍事和民用領域,包括環(huán)境監(jiān)測、智能交通等。數(shù)據(jù)收集是無線傳感器網(wǎng)絡路由中的一種特殊情況,主要任務是通過單跳或多跳的方式將網(wǎng)絡中傳感器節(jié)點收集的數(shù)據(jù)傳送給基站。在環(huán)境監(jiān)測應用中??刹捎脭?shù)據(jù)收集的方式將數(shù)據(jù)匯集到匯聚節(jié)點.再進行進一步分析。用無線傳感器網(wǎng)絡進行環(huán)境數(shù)據(jù)收集時。不同于其他對實時性要求比較高的應用,其對數(shù)據(jù)傳輸?shù)难舆t性沒有太大要求,數(shù)據(jù)
6、傳輸速率也較低,對帶寬也無過高要求。如何降低網(wǎng)絡能耗、延長網(wǎng)絡生命周期成了環(huán)境監(jiān)測中數(shù)據(jù)收集的首要問題。DRAD[2] 路由協(xié)議可以很好地滿足上面提到的要求。為了模擬DRAD的原理,對它進行了簡化,形成了SDRAD協(xié)議。</p><p><b> 目錄</b></p><p> 第一章 協(xié)議介紹1</p><p> 第二章 協(xié)議設計2
7、</p><p> 2.1 網(wǎng)絡拓撲形成階段2</p><p> 2.2 數(shù)據(jù)收集階段3</p><p> 第三章 協(xié)議實現(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é)議類的實現(xiàn)7</p><p> 3.4.1 鄰居表管理7</p><p> 3.4.2 SDRAD路由協(xié)議中的關鍵函數(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> 第四章 仿真驗證12</p><p> 4.1 編寫仿真tcl腳本sdrad.tcl12</p><p> 4.2 在cygwin窗口中運行仿真命令15</p&
10、gt;<p> 第五章 實驗結果分析16</p><p> 5.1 拓撲形成階段16</p><p> 5.2 據(jù)收集階段17</p><p><b> 第六章 總結20</b></p><p><b> 參考文獻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)的簡稱,是一種基于異步休眠調度、用于環(huán)境監(jiān)監(jiān)測應用的數(shù)據(jù)收集協(xié)議。節(jié)點定期收集環(huán)境信息匯總到基站。為了將數(shù)據(jù)傳送到基站,DRAD將網(wǎng)絡描述成樹狀結構。節(jié)
13、點將自身感知到的數(shù)據(jù)或者需要轉發(fā)的數(shù)據(jù)通過下一跳節(jié)點向基站方向發(fā)送。但是,節(jié)點不是僅僅維護其下一跳節(jié)點的信息,而是維護所有鄰居的信息。當節(jié)點的下一跳節(jié)點失效時可以采用迂回策略,使數(shù)據(jù)包最終到達基站。</p><p> 網(wǎng)絡中的節(jié)點按照一定的規(guī)律進行休眠調度,節(jié)點維護的鄰居相關信息除了最小跳步數(shù)、剩余能量、鏈路質量等常用選路困素外,還包括計算其醒來的時間差。網(wǎng)絡不需要全局或局部的時間同步,也不要求節(jié)點修改內部時鐘
14、。而是通過記錄的與鄰居節(jié)點的時間差,決定發(fā)送數(shù)據(jù)包的時刻。此外,可以通過發(fā)送的數(shù)據(jù)包和接收節(jié)點回饋的ACK進行時間差修補。對下一跳節(jié)點進行選擇時,加入對鄰居節(jié)點醒來先后順序的考慮。為了簡單起見,路由方面借鑒經(jīng)典的基于地理位置路由的選路策略,如貪婪路由、對網(wǎng)絡空洞的處理。休眠調度也是利用簡單的調度策略,實現(xiàn)定義節(jié)點的睡眠和活躍周期。</p><p> SDRAD 路由協(xié)議是對DRAD協(xié)議的簡寫,簡化了的DRAD
15、協(xié)議。SDRAD 主要實現(xiàn)了建立網(wǎng)絡結構,收集數(shù)據(jù)信息的功能[3]。</p><p><b> 第二章 協(xié)議設計</b></p><p> SDRAD 協(xié)議分兩個階段:網(wǎng)絡拓撲形成階段和數(shù)據(jù)收集階段。接下來將對</p><p> 這兩個階段進行詳細說明。</p><p> 2.1 網(wǎng)絡拓撲形成階段</p&g
16、t;<p> 當節(jié)點部署到網(wǎng)絡并開啟電源后,并不是立即進入數(shù)據(jù)收集。而是首先由基站發(fā)送Hello 包,節(jié)點接受到Hello 包后,更新自己的鄰居節(jié)點信息,從而建立樹狀的網(wǎng)絡結構。協(xié)議剛啟時,所有節(jié)點的跳步數(shù)都為無窮大。首先,由基站廣播Hello 包,為了簡單,本例中將基站固定為序列號為0 的節(jié)點。節(jié)點接收到Hello 包后,更新本節(jié)點跳步數(shù)和鄰居列表,廣播自身。</p><p> Hello包的
17、分組頭</p><p> 節(jié)點的分布及形成的拓撲關系:</p><p><b> 圖1 結點分布</b></p><p> 如圖1,網(wǎng)絡中共有0~7 個節(jié)點,其中節(jié)點0 為基站,其跳步數(shù)為0。節(jié)點1,2 的跳步數(shù)為1,節(jié)點3,4,5 的跳步數(shù)為2,節(jié)點6 的跳步數(shù)為3。在網(wǎng)絡形成階段由基站發(fā)送Hello 包,節(jié)點1,2 接收到Hello
18、 包,將節(jié)點0加入到它們的鄰居表中,同時節(jié)點1,2 重新向外發(fā)送Hello 包,被節(jié)點3,4,5接收,依次建立鄰居表,形成SDRAD 的拓撲關系。</p><p> 2.2 數(shù)據(jù)收集階段</p><p> 進入數(shù)據(jù)收集階段后,當網(wǎng)絡中某一節(jié)點接受到數(shù)據(jù)包后,該節(jié)點就會向鄰居表中的某一節(jié)點發(fā)送數(shù)據(jù)收集包(collect 包),最終將接收到的數(shù)據(jù)信息發(fā)送到基站,傳給應用程序進行處理。選擇哪
19、一個鄰居節(jié)點呢?協(xié)議將隨機選擇鄰居表的一個節(jié)點進行轉發(fā)。</p><p> 圖2 數(shù)據(jù)轉發(fā)路徑圖</p><p> 如圖2,節(jié)點6 接收到數(shù)據(jù)信息,節(jié)點6將該數(shù)據(jù)封裝成Collect 包,依次傳送給節(jié)點5、節(jié)點1、在到基站(節(jié)點0)。路徑中結點5與結點1都是隨機選擇的。</p><p><b> 第三章 協(xié)議實現(xiàn)</b></p&g
20、t;<p> 3.1 SDRAD協(xié)議類</p><p> 為了實現(xiàn)SDRAD 協(xié)議類, 我們編寫了4 個程序文件, 分別是sdrad.h、sdrad.cc(SDRAD 協(xié)議的定義和實現(xiàn))、sdrad_packet.h(SDRAD 新增包頭的定義)、sdrad_nbtable.h(鄰居表的定義和實現(xiàn))。</p><p> 在ns2 中,所有路由協(xié)議都是從Agent 類繼承
21、而來的,實現(xiàn)協(xié)議時主要關心的是節(jié)點對包的接收和發(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 定時器類</p><p><b> public:</b></p><p> SDRAD(nsaddr_t id); //含一個參數(shù)的構造函數(shù)</p><p> void recv(Packet *p, Han
23、dler*); //接收上層協(xié)議送下來的數(shù)據(jù)并處理</p><p> protected:</p><p> //命令處理函數(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ù)進行處理</p><p> void resolve(Packet *p);</p><p> //鄰居表的信息維護</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(); //打印,檢驗
26、協(xié)議所建立的拓撲是否符合要求</p><p> void forward(u_int32_t seqno,Packet *p, double delay); //轉發(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; //定義定時器</p><
29、p><b> private:</b></p><p> //本協(xié)議中為了簡化處理,將IP 地址和序列號設置為同一唯一值</p><p> nsaddr_t index_; //本節(jié)點的IP 地址</p><p> u_int32_t seqno_; //本節(jié)點的序列號</p><p> u_int8_t
30、 hop_count_; //節(jié)點跳步數(shù)</p><p> protected:</p><p> SDRAD_nbtable nbthead_; //定義鄰居表</p><p> //為調試和跟蹤定義的變量</p><p> Trace *logtarget_;</p><p> NsObject *upt
31、arget_;</p><p> NsObject *port_dmux_;</p><p><b> };</b></p><p><b> 其構造函數(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é)議新建包頭,對應實現(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é)點序列號</p><p><b> //計算包頭大小</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é)點序列號</p><p> u_int32_t hc_dst_seq; //目的節(jié)點序列號</p><p> inline int size() {//計算包頭大小</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 中內置了一個鏈表結構list(源碼在~ns/lib/bsd-list.h 中),在此使用這個list 結構實現(xiàn)鄰居類(sdrad_nbtable.h):</p><p
44、> #include <lib/bsd-list.h> //包含頭文件</p><p> class SDRAD_Neighbor {</p><p> friend class SDRAD; //設置SDRAD 為友元</p><p><b> public:</b></p><p> SD
45、RAD_Neighbor(u_int32_t s, u_int8_t hop) { //構造函數(shù)</p><p> seqno_ = s;</p><p> hop_count_ = hop;</p><p><b> }</b></p><p> protected:</p><p>&
46、lt;b> //鏈表結構</b></p><p> LIST_ENTRY(SDRAD_Neighbor) nb_link; </p><p> //鄰居結點中的字段</p><p> u_int32_t seqno_; //序列號</p><p> u_int8_t hop_count_; //跳步數(shù)</p&
47、gt;<p><b> };</b></p><p><b> //定義鏈表結構</b></p><p> LIST_HEAD(SDRAD_nbtable, SDRAD_Neighbor); </p><p> 解釋類的定義和編譯類的聯(lián)接</p><p> 解釋類和編譯類的連
48、接方法比較固定,對于只關心協(xié)議內容的人,可參考ns2 中同層協(xié)議的實現(xiàn)方法。Tcl Hooks</p><p> 到目前為止,我們的SDRAD 協(xié)議還不能被ns 所認可,還需要其它定義。下面部分是不可缺少的,而且通常只需要按照這個典型模式實現(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é)議類的實現(xiàn)</p><p> 3.4.1 鄰居表管理</p><p> 本部分功能實現(xiàn)對鄰居表的增刪查改等,方便代理類的使用。</p><p><b> 插入<
52、;/b></p><p> 新建一個鄰居節(jié)點,插入nbtable 中。</p><p> void SDRAD::nb_insert(u_int32_t seqno, u_int8_t hop) </p><p><b> 查找</b></p><p> 查找序列號為seqno 的節(jié)點</p>
53、<p> SDRAD_Neighbor* SDRAD::nb_lookup(u_int32_t seqno)</p><p><b> 刪除</b></p><p> 刪除序列號為seqno 的節(jié)點</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é)議中的關鍵函數(shù)</p><p> 1> command 函數(shù)</p><p> int SDRAD::command(int argc,const char*const*argv)</p><p> command 函數(shù)的寫
56、法固定,主要實現(xiàn)Otcl 和C++的交互,對Otcl 命令</p><p> 進行解析。用來解析模擬器類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 啟動協(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ù),判別分組包類型,并對其進行轉發(fā)、更新、丟棄、重發(fā)等處理,來實現(xiàn)具體協(xié)議所要求的內容。</p><p> 3> sendHello函數(shù)</p><p> void SDRAD::sendHello(bool isbase){</p><p> 發(fā)送hello數(shù)據(jù)包?;局惶幚戆l(fā)送一次Hello 包,非基站節(jié)點根據(jù)自身
60、信息新建Hello 包,廣播。</p><p> 4> recvHello函數(shù)</p><p> void SDRAD::recvHello(Packet*p)</p><p> 基站接收到Hello 包,丟棄;節(jié)點接收到自身廣播的Hello 包,丟棄;節(jié)點接收到有效Hello 包,更新本節(jié)點的跳步數(shù),將上一跳節(jié)點信息加入鄰居表,并廣播自身;丟棄重復鄰
61、居Hello 包和非鄰居包。</p><p> HelloTimer定時器</p><p> 運行一段時間的網(wǎng)絡會不穩(wěn)定(包括網(wǎng)絡中有新結點加入,節(jié)點壽命結束,能量用盡等),用HelloTimer 定時器定時發(fā)送Hello 包,更新鄰居信息,建立新的樹狀網(wǎng)絡結構。</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)絡結構:</p><
64、;p> void SDRAD_HelloTimer::handle(Event*) {</p><p> agent->nb_purge(); //清楚鄰居表</p><p> agent->sendHello(true); //基站發(fā)送Hello 包</p><p> //該定時器每個50s 調度一次</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é)點通過第一節(jié)點建立好網(wǎng)絡結構后,就進入數(shù)據(jù)收集階段,此協(xié)議通過將有用數(shù)據(jù)處理成Collect 包在網(wǎng)絡之間傳送。在recv函數(shù)中節(jié)點在接收到有用數(shù)據(jù)后,通過resolve 函數(shù)將其處理成collect 包后轉發(fā)給鄰居節(jié)點。</p><p><b> 下一跳函數(shù)</b></p><p> u_int32_t SDRAD::nexthop_random(
67、) </p><p> 隨機選擇鄰居表中節(jié)點編號</p><p> 轉發(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é)點根據(jù)參數(shù)ipdst 確定下一跳目的地,發(fā)送collect包。</p><p> 接收collect包函數(shù)</p><p> void SDRAD::recvCollect(Packet *p) </p><p> 節(jié)點隨機選擇下一跳,發(fā)送col
69、lect 包。 基站處理數(shù)據(jù),丟棄廢包。</p><p> 3.5 將SDRAD整合到NS-2.35中</p><p> 3.5.1 建立協(xié)議文件</p><p> 本協(xié)議程序共五個文件,分別是: sdrad_packet.h、sdrad_nbtable.h、sdrad.h 和sdrad.cc。在<ns-2.35>目錄下建立sdrad 文件夾,將
70、上述這5 個文件放進去。</p><p> 3.5.2 修改NS-2.35源碼</p><p> 需要改五個文件: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文件中找到如下位置,添加紅色標記的一行。</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> 找到如下位置,添加紅色標記的一行。</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文件中找到如下位置,添加紅色標記的一
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 啟動協(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 文件中找到如下位置,添加紅色標記部分。</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文件中找到如下位置,添加紅色標記部分</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中運行如下命令完成源文件的編譯。</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> 第四章 仿真驗證</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窗口中運行仿真命令</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> 第五章 實驗結果分析</p><p> 5.1 拓撲形成階段</p><p> 圖3 nam模擬拓撲形成階段截圖(圖中圓圈的大小代表先后順序)</p>&l
109、t;p> 圖4 trace文件</p><p> 結合圖3和圖4可以看出,拓撲形成階段基站(節(jié)點0)發(fā)送hello數(shù)據(jù)包之后,節(jié)點1、節(jié)點2接收hello數(shù)據(jù)包,接著節(jié)點1、節(jié)點2發(fā)送hello數(shù)據(jù)包,節(jié)點3、4、5收到hello數(shù)據(jù)包,最后節(jié)點6收到數(shù)據(jù)包,拓撲形成。</p><p><b> 5.2 據(jù)收集階段</b></p><
110、p> 由于數(shù)據(jù)收集過程中,數(shù)據(jù)包是隨機選路的原因,不同時刻數(shù)據(jù)包所走的路徑是隨機的。下面隨機截取三個時刻的nam模擬的截圖如下:</p><p> 路徑:6 —> 4 —> 1 —> 0</p><p> 圖5 nam模擬的截圖</p><p> 圖6 trace文件</p><p> 從上面兩個圖分析,
111、節(jié)點6發(fā)送collect數(shù)據(jù)包給節(jié)點4,之后節(jié)點4轉發(fā)給節(jié)點1,最后發(fā)送給基站(節(jié)點0),節(jié)點0收到數(shù)據(jù)包。</p><p> 路徑:6 —> 3 —> 1 —> 0</p><p> 圖7 nam模擬截圖</p><p> 圖8 trace文件</p><p> 從上面兩個圖分析,節(jié)點6發(fā)送collect數(shù)據(jù)包
112、給節(jié)點3,之后節(jié)點3轉發(fā)給節(jié)點1,最后發(fā)送給基站(節(jié)點0),節(jié)點0收到數(shù)據(jù)包。</p><p> 路徑:6 —> 4 —> 2 —> 0</p><p> 圖9 nam模擬截圖</p><p> 圖10 trace文件</p><p> 從上面兩個圖分析,節(jié)點6發(fā)送collect數(shù)據(jù)包給節(jié)點3,之后節(jié)點3轉發(fā)給節(jié)點
113、2,最后發(fā)送給基站(節(jié)點0),節(jié)點0收到數(shù)據(jù)包。</p><p><b> 第六章 總結</b></p><p> 由于SDRAD協(xié)議是DRAD的簡化版,網(wǎng)絡中的節(jié)點不能按照一定的規(guī)律進行休眠調度,節(jié)點維護的鄰居相關信息沒有剩余能量、鏈路質量、計算其醒來的時間差等選路困素, 但是模擬的節(jié)點已經(jīng)能夠進行簡單通信,建立樹形拓撲路由,收集數(shù)據(jù)傳送到基站。實現(xiàn)協(xié)議的流程
114、已經(jīng)成功,使得協(xié)議有更多的功能,需要在簡單協(xié)議的基礎上添加更多的內容。</p><p> 通過這次課程設計,對NS模擬器有了進一步的認識,學會了在其上開發(fā)新協(xié)議的流程。</p><p><b> 參考文獻</b></p><p> [1] NS-2學習筆記.</p><p> [2] 劉微姍,陳曉江,段任,陳文娟
115、,劉晨,房鼎益. DRAD:一種基于異步休眠調度的無線傳感器網(wǎng)絡數(shù)據(jù)收集協(xié)議[J]. 計算機工程與科學,2010,32 (11):40-51.</p><p> [3] 宋玲,劉勃蘭. NS2 中添加路由協(xié)議的研究與實現(xiàn)[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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于NS-2的Ad Hoc網(wǎng)絡路由協(xié)議模擬.pdf
- 基于NS-2的Ad Hoc網(wǎng)絡路由協(xié)議的研究與仿真.pdf
- 無線移動Ad hoc網(wǎng)絡路由協(xié)議的研究及NS-2仿真.pdf
- 基于ns-2的AODV路由協(xié)議算法性能對比研究.pdf
- 基于NS-2實現(xiàn)的光軌網(wǎng)絡MAC協(xié)議與分配算法研究.pdf
- 基于NS-2的Anycast QoS路由研究與仿真.pdf
- ns2平臺的ad hoc網(wǎng)絡路由協(xié)議仿真
- Ad Hoc網(wǎng)絡路由協(xié)議的研究與NS2仿真.pdf
- 移動Ad Hoc網(wǎng)絡路由協(xié)議及其NS2仿真.pdf
- Ad Hoc網(wǎng)絡的QoS路由協(xié)議與NS2仿真研究.pdf
- 基于NS2的路由協(xié)議可視化仿真平臺的設計與實現(xiàn).pdf
- 基于NS2的無線Mesh網(wǎng)絡路由協(xié)議研究.pdf
- 基于NS2的AODV路由協(xié)議研究與實現(xiàn).pdf
- 課程設計rip路由協(xié)議的設計與實現(xiàn)
- 基于NS2的Ad Hoc網(wǎng)絡分群路由協(xié)議仿真分析與研究.pdf
- 基于NS-3的Ad Hoc網(wǎng)絡路由協(xié)議研究與仿真.pdf
- 基于網(wǎng)絡模擬軟件(NS-2)的IP網(wǎng)絡性能仿真技術研究.pdf
- 基于ns-2的tcp的模擬研究
- 移動Ad Hoc網(wǎng)絡路由協(xié)議研究及其NS2仿真.pdf
- 基于NS2的Ad Hoc網(wǎng)絡多播路由協(xié)議仿真分析與研究.pdf
評論
0/150
提交評論