版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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 對(duì)相關(guān)網(wǎng)絡(luò)路由協(xié)議進(jìn)行仿真是一種既有效又經(jīng)濟(jì)
2、的研究方法,但目前的NS2 還不能支持所有網(wǎng)絡(luò)路由協(xié)議的仿真。本文根據(jù)拓展仿真的原理和方法,對(duì)在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、,仿真成了最佳可供選擇的測試、評(píng)估和驗(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é)議性能的評(píng)價(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)度、擁塞控制算法等。相對(duì)于一般的離散型模擬器,NS2 的優(yōu)勢在于它有非常豐富的構(gòu)件庫,而且這些對(duì)象易于組合,易于拓展,但是對(duì)用戶的編程能力,實(shí)際網(wǎng)絡(luò)協(xié)議的理解能力要求較高。本文利用NS2 已有的對(duì)象,組合所要研究的網(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í)。不同于其他對(duì)實(shí)時(shí)性要求比較高的應(yīng)用,其對(duì)數(shù)據(jù)傳輸?shù)难舆t性沒有太大要求,數(shù)據(jù)
6、傳輸速率也較低,對(duì)帶寬也無過高要求。如何降低網(wǎng)絡(luò)能耗、延長網(wǎng)絡(luò)生命周期成了環(huán)境監(jiān)測中數(shù)據(jù)收集的首要問題。DRAD[2] 路由協(xié)議可以很好地滿足上面提到的要求。為了模擬DRAD的原理,對(duì)它進(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ǔ)。對(duì)下一跳節(jié)點(diǎn)進(jìn)行選擇時(shí),加入對(duì)鄰居節(jié)點(diǎn)醒來先后順序的考慮。為了簡單起見,路由方面借鑒經(jīng)典的基于地理位置路由的選路策略,如貪婪路由、對(duì)網(wǎng)絡(luò)空洞的處理。休眠調(diào)度也是利用簡單的調(diào)度策略,實(shí)現(xiàn)定義節(jié)點(diǎn)的睡眠和活躍周期。</p><p> SDRAD 路由協(xié)議是對(duì)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ù)收集階段。接下來將對(duì)</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 包,為了簡單,本例中將基站固定為序列號(hào)為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)對(duì)包的接收和發(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> //對(duì)上層發(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 地址和序列號(hào)設(shè)置為同一唯一值</p><p> nsaddr_t index_; //本節(jié)點(diǎn)的IP 地址</p><p> u_int32_t seqno_; //本節(jié)點(diǎn)的序列號(hào)</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é)議新建包頭,對(duì)應(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)序列號(hào)</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)序列號(hào)</p><p> u_int32_t hc_dst_seq; //目的節(jié)點(diǎn)序列號(hào)</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_; //序列號(hào)</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、接方法比較固定,對(duì)于只關(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)對(duì)鄰居表的增刪查改等,方便代理類的使用。</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> 查找序列號(hào)為seqno 的節(jié)點(diǎn)</p>
53、<p> SDRAD_Neighbor* SDRAD::nb_lookup(u_int32_t seqno)</p><p><b> 刪除</b></p><p> 刪除序列號(hào)為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ù)和序列號(hào)</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++的交互,對(duì)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ù),判別分組包類型,并對(duì)其進(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)編號(hào)</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ì),對(duì)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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于NS-2的Ad Hoc網(wǎng)絡(luò)路由協(xié)議模擬.pdf
- 基于NS-2的Ad Hoc網(wǎng)絡(luò)路由協(xié)議的研究與仿真.pdf
- 無線移動(dòng)Ad hoc網(wǎng)絡(luò)路由協(xié)議的研究及NS-2仿真.pdf
- 基于ns-2的AODV路由協(xié)議算法性能對(duì)比研究.pdf
- 基于NS-2實(shí)現(xiàn)的光軌網(wǎng)絡(luò)MAC協(xié)議與分配算法研究.pdf
- 基于NS-2的Anycast QoS路由研究與仿真.pdf
- ns2平臺(tái)的ad hoc網(wǎng)絡(luò)路由協(xié)議仿真
- Ad Hoc網(wǎng)絡(luò)路由協(xié)議的研究與NS2仿真.pdf
- 移動(dòng)Ad Hoc網(wǎng)絡(luò)路由協(xié)議及其NS2仿真.pdf
- Ad Hoc網(wǎng)絡(luò)的QoS路由協(xié)議與NS2仿真研究.pdf
- 基于NS2的路由協(xié)議可視化仿真平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于NS2的無線Mesh網(wǎng)絡(luò)路由協(xié)議研究.pdf
- 基于NS2的AODV路由協(xié)議研究與實(shí)現(xiàn).pdf
- 課程設(shè)計(jì)rip路由協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
- 基于NS2的Ad Hoc網(wǎng)絡(luò)分群路由協(xié)議仿真分析與研究.pdf
- 基于NS-3的Ad Hoc網(wǎng)絡(luò)路由協(xié)議研究與仿真.pdf
- 基于網(wǎng)絡(luò)模擬軟件(NS-2)的IP網(wǎng)絡(luò)性能仿真技術(shù)研究.pdf
- 基于ns-2的tcp的模擬研究
- 移動(dòng)Ad Hoc網(wǎng)絡(luò)路由協(xié)議研究及其NS2仿真.pdf
- 基于NS2的Ad Hoc網(wǎng)絡(luò)多播路由協(xié)議仿真分析與研究.pdf
評(píng)論
0/150
提交評(píng)論