網(wǎng)絡(luò)模擬器NS2應(yīng)用分析
時(shí)間:2022-03-12 10:41:00
導(dǎo)語:網(wǎng)絡(luò)模擬器NS2應(yīng)用分析一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要隨著Internet的迅猛發(fā)展,網(wǎng)絡(luò)模擬占有十分重要的位置。文中探討和分析了NS-2的結(jié)構(gòu)、功能及其使用方法,最后給出一個(gè)實(shí)例,具體解釋了NS-2的使用方法和用相關(guān)工具對(duì)輸出結(jié)果進(jìn)行處理的方法,得到了預(yù)期的模擬結(jié)果。
關(guān)鍵詞網(wǎng)絡(luò)模擬;NS;應(yīng)用
引言
隨著Internet的迅猛發(fā)展,網(wǎng)絡(luò)規(guī)模和復(fù)雜性的迅速增加,網(wǎng)絡(luò)研究人員一方面要不斷思考新的網(wǎng)絡(luò)協(xié)議和算法,為網(wǎng)絡(luò)發(fā)展做前瞻性的基礎(chǔ)研究;另一方面也要研究如何利用和整合現(xiàn)有的網(wǎng)絡(luò)資源,使網(wǎng)絡(luò)達(dá)到最高效能。無論是哪一方面都需要對(duì)新的網(wǎng)絡(luò)方案進(jìn)行驗(yàn)證和分析。分析方法的有效性和精確性受假設(shè)的限制很大。實(shí)驗(yàn)方法的局限在于成本很高,實(shí)驗(yàn)床的規(guī)模很難做到很大,不能實(shí)現(xiàn)網(wǎng)絡(luò)中的多種通信流量和拓?fù)涞娜诤?。而模擬方法在很大程度上可以彌補(bǔ)前兩種方法的不足。NS-2是美國DARPA支持的項(xiàng)目VINT(theVirtualInterNetTested)中的基礎(chǔ)和核心部分。由USI/ISI,XeroxPARC,LBNL和UCBerkeley這些美國大學(xué)和實(shí)驗(yàn)室合作研究開發(fā),其目的在于建立一個(gè)網(wǎng)絡(luò)仿真平臺(tái),為網(wǎng)絡(luò)研究人員提供一系列的仿真工具,來實(shí)現(xiàn)新的網(wǎng)絡(luò)協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)。
1NS-2體系結(jié)構(gòu)及功能模塊
1.1NS-2簡介
NS-2是面向?qū)ο蟮?,基于離散事件驅(qū)動(dòng)的網(wǎng)絡(luò)環(huán)境模擬器。它實(shí)現(xiàn)了多種網(wǎng)絡(luò)協(xié)議的模擬,如網(wǎng)絡(luò)協(xié)議TCP、UDP,流量源行為,如FTP、Telnet、Web、CBR、VBR;實(shí)現(xiàn)了DropTail、RED、CBQ等幾種路由器隊(duì)列管理機(jī)制以及Dijkstra,動(dòng)態(tài)路由、靜態(tài)路由、組播路由等路由算法。此外,NS-2還支持組播協(xié)議SRM及部分MAC層協(xié)議。
NS-2用C++和Otcl語言編寫而成。它是免費(fèi)的,開放源代碼的,可以很方便地?cái)U(kuò)展NS-2的功能,將自己開發(fā)的新協(xié)議模塊集成到NS-2環(huán)境中。
1.2NS-2體系結(jié)構(gòu)
NS-2的結(jié)構(gòu)如圖1所示。
NS-2采用了兩級(jí)體系結(jié)構(gòu),為了提高代碼的執(zhí)行效率,NS-2將數(shù)據(jù)操作與控制部分的實(shí)現(xiàn)相分離,事件調(diào)度器和基本的網(wǎng)絡(luò)組件使用C++編寫和編譯,其主要功能是實(shí)現(xiàn)對(duì)數(shù)據(jù)包的處理;NS-2的前端是一個(gè)Otcl解釋器,主要的功能是對(duì)模擬環(huán)境的配置、建立。從圖1的左下角看,用戶利用Otcl庫中的模擬對(duì)象設(shè)計(jì)和運(yùn)行TCL仿真,事件調(diào)度器和網(wǎng)絡(luò)組件通過OTcl鏈接(tclcl類)和Otcl相關(guān)聯(lián),這樣用戶可以在Otcl空間能夠方便地對(duì)C++對(duì)象的函數(shù)和變量進(jìn)行修改與配置。
1.3NS-2的功能模塊
在NS-2中,整個(gè)模擬過程由一個(gè)名為Simulator的Tcl類來定義和控制的,Simulator類提供了一系列對(duì)模擬進(jìn)行配置的接口,這其中包括選擇“事件調(diào)度器(eventscheduler)”的接口。進(jìn)行模擬通常要首先創(chuàng)建一個(gè)Simulator類的實(shí)例對(duì)象,并調(diào)用該對(duì)象的一系列方法來創(chuàng)建節(jié)點(diǎn)(Node)、拓?fù)洌═opology)等模擬所必需的對(duì)象。
模擬器封裝了許多功能模塊:節(jié)點(diǎn)、鏈路、分組、、流量發(fā)生器、應(yīng)用模擬器等。
1)事件調(diào)度器:NS-2是一個(gè)事件驅(qū)動(dòng)的模擬器,調(diào)度器也就成為NS-2的調(diào)度中心,主要功能是處理分組(packet)的延遲和充當(dāng)定時(shí)器。從所有事件中選擇發(fā)生時(shí)刻最早的事件執(zhí)行,調(diào)用它的handle函數(shù),把該事件執(zhí)行完畢,然后從剩余的所有事件中選擇發(fā)生時(shí)刻最早的事件執(zhí)行,如此反復(fù)執(zhí)行。NS-2只支持單線程,如果有多于一個(gè)事件安排在同一時(shí)刻,那么會(huì)按照事件代碼插入的先后次序執(zhí)行。
2)節(jié)點(diǎn)(Node):表示端節(jié)點(diǎn)和路由器,主要由地址分類器、端口分類器、多播分類器和復(fù)制器等模擬組件構(gòu)成。分類器從邏輯上匹配一個(gè)分組,并基于匹配的結(jié)果把該分組傳遞給相應(yīng)的對(duì)象。復(fù)制器是生成一個(gè)分組的多份拷貝,并把這些拷貝轉(zhuǎn)發(fā)到各個(gè)訂閱了某一多播組G的輸出鏈路。
3)鏈路(Link):用來連接網(wǎng)絡(luò)節(jié)點(diǎn),所有的鏈路都是以隊(duì)列的形式來管理分組的到達(dá)、離開和丟棄。主要由DelayLink、Queues和TTLChcker等連接器(Connector)構(gòu)成。DelayLink構(gòu)造鏈路帶寬和延遲特征;Queues構(gòu)造和模擬與該鏈路相連的路由器的輸出緩沖;TTLChcker對(duì)該鏈路的數(shù)據(jù)包的TTL字段減1操作,并丟棄TTL值為0的數(shù)據(jù)包。(圖2)
圖2鏈路
4)分組(Packet):是對(duì)象間交互的基本單元。由一系列分組頭和一個(gè)可選的數(shù)據(jù)空間組成。分組頭的結(jié)構(gòu)在Simulator對(duì)象創(chuàng)建時(shí)就被初始化了,同時(shí)每個(gè)分組頭相對(duì)于分組的起始地址的偏移量也被記錄下來,提供用戶來存取各個(gè)頭部所包含的信息。
5)(Agent):代表了網(wǎng)絡(luò)層分組的起點(diǎn)和終點(diǎn),并被用于實(shí)現(xiàn)如TCP和UDP等網(wǎng)絡(luò)協(xié)議。Agent類支持分組的產(chǎn)生和接收,C++的Agent包含一系列的內(nèi)部狀態(tài)變量來表示分組的各個(gè)域。Agent可以實(shí)現(xiàn)多個(gè)層次的協(xié)議,對(duì)于一些運(yùn)輸層的協(xié)議,分組的大小和發(fā)送時(shí)間通常由Agen提供的應(yīng)用程序接口(API)來控制,對(duì)于在低層使用的Agent(路由Agent),分組的大小和發(fā)送時(shí)間通常由Agent自己控制。
6)流量發(fā)生器(trafficgenerator)、應(yīng)用模擬器(simulatedapplication):是構(gòu)建在運(yùn)輸層之上,流量發(fā)生器是模擬應(yīng)用程序產(chǎn)生網(wǎng)絡(luò)通信量,有四類:(1)EXPOO_Traffic、(2)POO_Traffic、(3)CBR_Traffic、(4)TafficTrace,它們一般用在UDP之上,應(yīng)用模擬器有FTP,Telnet,一般用在TCP之上。
2用NS-2進(jìn)行網(wǎng)絡(luò)模擬
進(jìn)行模擬之前,首先要分析模擬涉及哪個(gè)層次。NS模擬分兩個(gè)層次:一個(gè)是基于Otcl編程的層次,利用NS已有的網(wǎng)絡(luò)元素實(shí)現(xiàn)模擬,無需對(duì)NS本身進(jìn)行任何修改,只要編寫Otcl腳本,另一個(gè)層次是基于C++和Otcl編程的層次,如果NS中沒有所需的網(wǎng)絡(luò)對(duì)象,就需要對(duì)NS擴(kuò)展,利用Otcl和NS的接口類實(shí)現(xiàn)NS的更新,然后再編寫Otcl腳本。整個(gè)模擬的過程如圖3所示:
圖3利用NS-2進(jìn)行網(wǎng)絡(luò)模擬的過程
2.1Otcl實(shí)現(xiàn)模擬的一般過程
(1)建立networkmodel:描述模擬網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),確定鏈路的基本特性,如延遲、帶寬和丟失策略等。
(2)建立trafficmodel:包括端設(shè)備的協(xié)議綁定和通信業(yè)務(wù)量模型的建立,配置業(yè)務(wù)量模型的參數(shù),從而確定網(wǎng)絡(luò)上的業(yè)務(wù)量分布。
(3)設(shè)置Trace對(duì)象。Trace對(duì)象能夠把模擬過程中發(fā)生的特定類型的事件記錄在Trace文件中。NS通過Trace文件來保存整個(gè)模擬過程。模擬完成后,用戶可以對(duì)Trace文件進(jìn)行分析研究。
(4)編寫其他的輔助過程,設(shè)定模擬開始/結(jié)束時(shí)間,運(yùn)行Otcl腳本仿真。
(5)追蹤分析結(jié)果:對(duì)Trace文件進(jìn)行分析,利用gawk、xgraph、gnuplot得出有用的數(shù)據(jù)曲線,或者用Nam觀看網(wǎng)絡(luò)模擬運(yùn)行過程。
2.2C++建立新協(xié)議或修改已有網(wǎng)絡(luò)對(duì)象進(jìn)行擴(kuò)展要考慮的問題
如果模擬只要求對(duì)現(xiàn)有的協(xié)議進(jìn)行簡單修改即可完成,無需建立新的協(xié)議,則找到相應(yīng)的待修改協(xié)議代碼進(jìn)行預(yù)期的修改,然后直接編譯生成新的NS。然而,當(dāng)建立新協(xié)議時(shí)一般需要考慮以下問題:
(1)首先定義頭文件,包括數(shù)據(jù)結(jié)構(gòu)和決定新的繼承結(jié)構(gòu),并建立恰當(dāng)?shù)念惗x。
(2)定義C++代碼和Otcl代碼之間的接口連接,即定義OTcl連接函數(shù)。
(3)至少定義接收函數(shù)recv()和命令函數(shù)command()。
(4)新協(xié)議代碼完成后,要對(duì)相關(guān)文件進(jìn)行改動(dòng)。例如,如果定義了一個(gè)新分組頭,要改動(dòng)NS目錄下packet.h文件的enumpacket_t{}和classp_info{}相應(yīng)部分;改動(dòng)tcl/lib/ns-default.tcl文件,定義Tcl對(duì)象的缺省值;改動(dòng)tcl/lib/ns-packet.tcl文件,在該文件中為新的分組增加一個(gè)入口;改動(dòng)Makefile文件,將*.o文件加入到該文件NS對(duì)象文件列表中。
(5)在NS目錄下運(yùn)行MakeDepend和Make,重新編譯NS,至此生成了新的NS。
3應(yīng)用實(shí)例
本例將介紹如何使用一些工具來分析和呈現(xiàn)模擬結(jié)果,主要是測(cè)量端到端的延遲,而采用的方法一是去分析Trace文件,方法二是去修改NS核心,把所需要測(cè)量的數(shù)據(jù)直接記錄下來,限于篇幅我們不在此進(jìn)一步介紹方法二。模擬場(chǎng)景如圖4所示,包含四個(gè)節(jié)點(diǎn)(n0,n1,n2,n3),假設(shè)n0,n2和n1,n2之間鏈路帶寬2Mbps,延遲為10ms;n2和n3之間鏈路帶寬1.7Mbps,延遲為20ms;每個(gè)鏈路用DropTail策略;n2和n3之間鏈路最大隊(duì)列長度為10;n0,n3之間有一條建立在TCP上的FTP連接,n1,n3之間有一條建立在UDP上CBR連接;CBR是在
0.1秒開始發(fā)送,在4.5秒結(jié)束,F(xiàn)TP是在1.0秒開始發(fā)送,在4.0秒結(jié)束。
圖4模擬場(chǎng)景
3.1建立Otcl模擬代碼文件
#創(chuàng)建一個(gè)模擬對(duì)象
setns[newSimulator]
#為數(shù)據(jù)流定義不同的顏色,供NAM用
$nscolor1Blue
$nscolor2Red
#打開一個(gè)NAMtracefile
setnf[openout.namw]
$nsnamtrace-all$nf
#打開一個(gè)tracefile記錄數(shù)據(jù)包的傳送過程
setnd[openout.trw]
$nstrace-all$nd
#定義一個(gè)結(jié)束程序
procfinish{}{
globalnsnfnd
$nsflush-trace
#關(guān)閉NAMtracefile
close$nf
close$nd
#以后臺(tái)方式執(zhí)行NAM
execnamout.nam&
exit0
}
#創(chuàng)建四個(gè)節(jié)點(diǎn)
setn0[$nsnode]
setn1[$nsnode]
setn2[$nsnode]
setn3[$nsnode]
#把節(jié)點(diǎn)連接起來
$nsduplex-link$n0$n22Mb10msDropTail
$nsduplex-link$n1$n22Mb10msDropTail
$nsduplex-link$n2$n31.7Mb20msDropTail
#設(shè)定n2和n3之間最大隊(duì)列長度為10
$nsqueue-limit$n2$n310
#設(shè)定節(jié)點(diǎn)的位置,供NAM用
$nsduplex-link-op$n0$n2orientright-down
$nsduplex-link-op$n1$n2orientright-up
$nsduplex-link-op$n2$n3orientright
#設(shè)定n2-n3間的隊(duì)列位置,供NAM用
$nsduplex-link-op$n2$n3queuePos0.5
#建立一條TCP連接
settcp[newAgent/TCP]
$tcpsetclass_2
$nsattach-agent$n0$tcp
setsink[newAgent/TCPSink]
$nsattach-agent$n3$sink
$nsconnect$tcp$sink
#在NAM中,TCP的連接以藍(lán)色表示
$tcpsetfid_1
#在TCP連接之上建立FTP應(yīng)用
setftp[newApplication/FTP]
$ftpattach-agent$tcp
$ftpsettype_FTP
#建立一條UDP連接
setudp[newAgent/UDP]
$nsattach-agent$n1$udp
setnull[newAgent/Null]
$nsattach-agent$n3$null
$nsconnect$udp$null
#在NAM中,UDP的連接以紅色表示
$udpsetfid_2
#在UDP連接之上建立CBR應(yīng)用
setcbr[newApplication/Traffic/CBR]
$cbrattach-agent$udp
$cbrsettype_CBR
$cbrsetpacket_size_1000
$cbrsetrate_1mb
$cbrsetrandom_false
#設(shè)定FTP和CBR的開始和結(jié)束時(shí)間
$nsat0.1"$cbrstart"
$nsat1.0"$ftpstart"
$nsat4.0"$ftpstop"
$nsat4.5"$cbrstop"
#在5.0秒調(diào)用finish過程結(jié)束模擬
$nsat5.0"finish"
#執(zhí)行模擬
$nsrun
本例子在FedoraCore4,ns-2.29下測(cè)試通過,模擬結(jié)束后,產(chǎn)生兩個(gè)文件,一個(gè)是out.nam,這是供NAM用的,用來可視化整個(gè)模擬過程;另一個(gè)是out.tr,記錄了模擬過程中數(shù)據(jù)包傳送中的所有事件,這是我們分析的重點(diǎn)。
3.2利用awk提取out.tr文件中的數(shù)據(jù)
awk是一種程序語言,可以使用很短的代碼輕易地完成對(duì)文本檔案做修改、分析、提取和比較等處理。根據(jù)Trace文件格式,我們很容易寫出測(cè)量CBR數(shù)據(jù)包端到端延遲時(shí)間的awk程序delay.awk:
#測(cè)量CBR數(shù)據(jù)包端到端延遲時(shí)間
BEGIN{
highest_packet_id=0;
}
{
action=$1;
time=$2;
from=$3;
to=$4;
type=$5;
pktsize=$6;
flow_id=$8;
src=$9;
dst=$10;
seq_no=$11;
packet_id=$12;
if(packet_id>highest_packet_id)
highest_packet_id=packet_id;
if(start_time[packet_id]==0)
start_time[packet_id]=time;
if(flow_id==2&&action!="d"){
if(action=="r"){
end_time[packet_id]=time;
}
}else{
end_time[packet_id]=-1;
}
}
END{
for(packet_id=0;packet_id<=highest_packet_id;packet_id++){
start=start_time[packet_id];
end=end_time[packet_id];
packet_duration=end-start;
if(start<end)printf("%f%f\n",start,packet_duration);
}
}
本例執(zhí)行并把結(jié)果重定向到cbr_delay文件中:$awk–fdelay.awkout.tr>cbr_delay
3.3利用Xgraph繪出圖形
Xgraph是ns-allinone包中自帶的一個(gè)小巧的繪圖工具,它可以根據(jù)數(shù)據(jù)文件里的數(shù)據(jù)繪制出相應(yīng)的圖形。本例執(zhí)行:$xgraphcbr_delay,結(jié)果如圖5所示:
圖5cbr_delay圖
由圖可以看出:在一剛開始的時(shí)候,由于只有CBR的數(shù)據(jù)包,所以端到端的延遲是固定的,但在1.0秒后,F(xiàn)TP數(shù)據(jù)包參與爭(zhēng)奪網(wǎng)絡(luò)資源,因此,端到端的延遲變得不固定,但等到FTP傳輸結(jié)束后,CBR數(shù)據(jù)包的端到端的延遲又變得固定了。
4結(jié)論
網(wǎng)絡(luò)模擬日益成為分析、研究、設(shè)計(jì)和改善網(wǎng)絡(luò)性能的強(qiáng)大工具,NS-2便是其中功能強(qiáng)大且可以免費(fèi)得到的一種。本文詳細(xì)討論了NS-2的結(jié)構(gòu)、功能及其使用方法,并給出一個(gè)實(shí)例具體解釋NS-2的使用及使用相關(guān)工具對(duì)輸出結(jié)果進(jìn)行處理??偟膩碚f,NS-2結(jié)構(gòu)復(fù)雜,有一個(gè)相對(duì)陡峭的學(xué)習(xí)曲線,希望本文對(duì)學(xué)習(xí)NS-2能有所裨益。
參考文獻(xiàn)
[1]www.isi.edu/nsnam/NSDB.
[2]nile.wpi.edu/NSDB.
[3]劉俊,徐昌彪,隆克平.基于NS的網(wǎng)絡(luò)仿真探討J.計(jì)算機(jī)應(yīng)用研究,2002
[4]140.116.72.80/~smallko/ns2/ns2.htmDB