在NS2中新添協議

2021-06-21 04:33:49 字數 3544 閱讀 4428

在ns2下進行新協議開發的一般流程

由於ns2使用**物件模型,所以在協議開發的過程中,總是從c++和tcl兩個類入手。流程說明如下:

1、定義新的路由協議:在aodv.h中定義class aodv:public agent{}。在ns2中,所有路由協議都是從agent類繼承而來的。其中,recv()函式和command()函式是從agent類繼承下來的。recv()是agent在接收分組時的入口,源節點在

傳送乙個分組時會呼叫目標節點的相應agent的recv()函式。它是路由層收到資料報的處理函式,包括來自上層協議和下層協議的資料報;command()是命令處理函式。要在otcl物件中呼叫對應的c++物件的方法,ns是通過command()函式實現的。對於每個tclobject,ns2為其otcl中的解釋物件建立乙個例項過程,cmd{}。過程cmd{}呼叫影像物件的方法command(),並將cmd{}的引數作為乙個引數組傳遞給command()方法。此外,具體協議所用到的其它函式也在aodv類中定義。

2、定義乙個tclclass類的子類:定義的新的路由協議需要被ns所接納並且可以在tcl**中使用,需要在aodv.cc檔案進行如下定義:

static class aodvclass:public tclclass{}。

tclclass是乙個純虛類,從這個基類繼承出來的類提供兩個功能:構造和編譯類結構互為映象的解釋類結構以及提供初始化新的tclobject的方法。每個從tclclass繼承出來的類都和編譯類結構中的乙個tclobject的子類相關聯,並能初始化所關聯的類的新物件。在其建構函式中呼叫基類的建構函式aodvclass():tclclass(「agent/aodv」),其中agent/aodv指定了c++中的aodv類和tcl部分中的agent/aodv繫結在了一起,在編寫的tcl**中指定路由協議時就應該用agent/aodv。

3、修改ns/tcl/lib/ns-lib.tcl檔案:在ns2中執行tcl中指定路由協議時只會用到路由協議的名稱,因此,我們需要修改ns的系統tcl**,使得當設定路由協議為aodv時會呼叫我們新增加的agent/aodv類(也就是c++下的aodv類)。這需要在ns/tcl/lib/ns-lib.tcl檔案中的simulator類的create-wireless-node成員函式中增加如下**:

switch-exact $routingagent_,其中offset和access都是系統要求的,我們只需要作相應的修改。靜態變數offset_是rtp頭在ns2分組中的位元組偏移量;packet::access()返回用於儲存包頭的緩衝區的第乙個位元組的位址。然後我們需要在ns/tcl/lib/ns-packet.tcl檔案中新增包頭的名字foreach prot。

為了和ns2中的tcl**相結合,我們還需要在aodv.cc檔案中定義乙個packetheadeaclass類的子類:

static class aodvheaderclass:public packetheaderclass{}。

它是各種分組頭的基類,在此類中使得tcl中的packetheader/aodv類與c++中的hdr_aodv繫結在一起。如果rtp頭在配置時被啟用,rtpheaderclass類的靜態物件class_rtphdr提供了到otcl的連線。當模擬正在執行時,這個靜態物件以「packetheader/rtp」和「sizeof」作為引數,呼叫packetheaderclass的建構函式。這會使rtp頭的大小被儲存下來,然後被packetheadeamanager類的物件使用。另外,bind_offest()必須在rtpheaderclass類的建構函式中被呼叫,這樣,packetheadeamanager的物件就知道這個頭的偏移量(offset)儲存在**了。

5、建立包頭型別:修改ns/common/packet.h檔案。首先在enum packet_t中增加一項來表示我們新增加的包的型別,定義為pt_aodv,然後在class p_info類的p_info()建構函式中增加一行給出新增包型別的名字:name_[pt_aodv]=「aodv」。

6、在aodv類的建構函式定義時將新建立的包的型別傳遞給agent類的建構函式,在aodv.cc中定義此建構函式aodv::aodv():agent(pt_aodv)。

7、編譯**:在完成了協議的定義和實現後,我們要對新增加的檔案進行編譯並鏈結到ns2中去,這需要修改ns/makefile檔案裡,增加對新類的編譯。我們的檔案放在ns/aodv目錄下,在makefile檔案裡obj_cc變數的定義中增加下面這行:

aodv/aodv.o aodv/······

將所有將要生成的的.o檔案放在此處。然後依次執行:

./configure, make depend, make命令來重新編譯ns2。

8、初步測試,首先編寫乙個tcl檔案aodv.tcl 來驗證程式的正確性。(場景設定部分可以只取簡單的幾個節點即可)。

9、生成隨機場景:

./setdest –n 30 –p 10 –m 20 –t 500 –x 1000 –y 1000 >scene-30n-10p-20m-500t-1000-1000。(必須在setdest工具所在的目錄下執行此命令)並將生成的檔案放在和aodv.tcl檔案相同的目錄(ns/aodv)下。這樣下一步的source命令才能找到場景檔案,否則需要指定相對或絕對路徑。

10、使用source 「scene-30n-10p-20m-500t-1000-1000」命令替換剛才的測試檔案tcl檔案中的場景設定部分。此外還要相應地改變測試檔案aodv.tcl檔案中的拓撲大小及節點數等,使之與生成場景時的引數保持一致,否則執行ns時會出錯。

11、生成隨機資料流:

ns cbrgen.tcl –type tcp –nn 30 –seed 1 –mc 5 –rate 1.0 > cbr-30n-5c-lp

(必須在cbrgen.tcl所在的目錄ns/indep-utils/cmu-scen-gen下執行)。並將生成的檔案也放在和aodv.tcl檔案相同的目錄下(ns/aodv)。這樣下一步的source命令才能找到場景檔案,否則需要指定相對或絕對路徑。

12、使用source 「cbr-30n-5c-lp」 命令替換剛才的測試tcl檔案中的資料流設定部分。

13、在ns/aodv下重新執行ns aodv.tcl命令。在tcl指令碼中定義了如下**: set tracefd [open aodv.tr w]

$ns trace-all $tracefd

它們用於開啟乙個名為aodv.tr的檔案,用來記錄模擬過程的trace資料,變數tracefd指向該檔案。

而如下**:

set namtracefd [open aodv.nam w]

$ns namtrace-all $namtracefd

用於開啟乙個名為aodv.nam的檔案,用來記錄nam的trace檔案,並呼叫nam程式. 

14、編寫awk指令碼:把評價路由協議的效能指標如吞吐量、平均時延等,通過awk程式語言編寫字尾為.awk的檔案,然後執行gawk命令得到相應的資料檔案。

15、使用gnuplot工具進行畫圖分析:在ns2下進行協議**時常用gnuplot工具的第二種工作方式,即首先編寫乙個plot指令碼檔案xx.plot。在其中可以設定生成的格式、x軸、y軸及title等,最後用plot 「xx.data」畫圖。寫好plot指令碼後,呼叫gnuplot xx.plot畫圖。

16、使用nam工具直觀地檢視網路模擬過程。

ns2中AODV協議HDR CMN p 的含義

剛開始看 aodv 協議就被兩個函式難到 hdr cmn p 和hdr ip p 經查功能都差不多,以 hdr cmn p 為例說明。struct hdr cmn ch hdr cmn p 結構體hdr cmn 的定義在 ns allinone 2.34 ns 2.34 common packet....

從Linux學到NS2 (二)搭建NS2中重要元件

本篇問題 1.1 cc是linux下c 原始檔的預設字尾,cpp是c 語言檔案的字尾名,採用.cc字尾 執行 g poisson.cc o poisson.o std c 11 後生成檔案 poisson.o 其中.o是編譯的中間目標檔案,可以將多個中間目標檔案鏈結成可執行檔案。2.ns 的唯一記錄...

ns2 模擬WSN協議之手記

ns2中模擬wsn,用timestamp時間戳計算點對點delay延遲時 如果在發包時呼叫了 scheduler instance schedule target p,jitter 這裡用jitter來避免與鄰居同時發包來減少collision 但是這個也同時delay了發包時間。所以給發包加tim...