版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章NS無線網(wǎng)絡(luò)仿真及應(yīng)用6.1NS2簡介6.2NS基本原理及其運行機制6.3NS相關(guān)工具介紹6.4例程及其分析隨著仿真技術(shù)快速發(fā)展,應(yīng)用領(lǐng)域越來越廣,作為仿真領(lǐng)域的一個分支——網(wǎng)絡(luò)仿真技術(shù)也獲得了快速發(fā)展。國外網(wǎng)絡(luò)仿真技術(shù)已經(jīng)相當(dāng)成熟,已經(jīng)由小型網(wǎng)絡(luò)仿真器向大型混合網(wǎng)絡(luò)仿真器發(fā)展,甚至有的發(fā)達國家已經(jīng)實現(xiàn)了聯(lián)合網(wǎng)絡(luò)仿真平臺。但國內(nèi)相對比較落后,主要是對一些小型網(wǎng)絡(luò)進行仿真,仿真方法主要還是停留在經(jīng)驗、實驗和計算基礎(chǔ)上,對網(wǎng)絡(luò)仿真技術(shù)還沒有進行系統(tǒng)的研究。這與國內(nèi)信息網(wǎng)絡(luò)技術(shù)快速發(fā)展的趨勢相矛盾,為此有必要對網(wǎng)絡(luò)仿真技術(shù)進行研究。目前對通信網(wǎng)絡(luò)仿真主要有兩種途徑:第一種是采用通用計算機語言或?qū)iT用于離散事件仿真的計算機語言,通過編程,實現(xiàn)對通信網(wǎng)絡(luò)仿真;第二種是借助已有的網(wǎng)絡(luò)仿真工具進行仿真,它提供了一種新的網(wǎng)絡(luò)設(shè)計和優(yōu)化的方法。采用第一種仿真方法的難度大且通用性不好,而借助專用網(wǎng)絡(luò)仿真工具不需要大量編程,通用性好,很容易實現(xiàn)通信網(wǎng)絡(luò)仿真,是通信網(wǎng)絡(luò)仿真的發(fā)展方向。國外研制出了一系列高質(zhì)量的網(wǎng)絡(luò)仿真工具,主要包括兩種類型:一是基于大型網(wǎng)絡(luò)開發(fā)的網(wǎng)絡(luò)仿真工具,例如OPNET、G1o2MoSim等;二是基于小型網(wǎng)絡(luò)開發(fā)的網(wǎng)絡(luò)仿真工具,例如NS2、COMNETIII等。大多數(shù)網(wǎng)絡(luò)仿真工具的價格十分昂貴,對科研院所、大學(xué)來說都是一筆巨大投資。這里主要探討NS2。
NS2是當(dāng)前進行網(wǎng)絡(luò)模擬和仿真的主要工具,由于其具有開放源代碼、功能強大和高度的靈活性等優(yōu)點,因而在業(yè)界受到一致好評和廣泛使用。NS針對有線、無線網(wǎng)絡(luò)(也包括局域網(wǎng)、衛(wèi)星網(wǎng)絡(luò))上TCP、路由、數(shù)據(jù)鏈路、組播協(xié)議,以及網(wǎng)絡(luò)QoS、各種隊列等的仿真提供了大量的支持。同時提供了跟蹤和顯示仿真結(jié)果以及網(wǎng)絡(luò)拓撲生成等很多工具。用一句話概括這個軟件的功能就是:它可以在一臺計算機上動態(tài)仿真一個網(wǎng)絡(luò)的運行。6.1NS2?簡?介6.1.1NS2的起源
NS起源于1989年的REAL網(wǎng)絡(luò)模擬器。在過去的幾年中,NS發(fā)生了實質(zhì)性的演變。1995年,NS的開發(fā)獲得了DVRPA的支持而通過VINT項目,由LBL、XeroxPARC、UCB和USC/IST合作進行。目前NS的開發(fā)得到了DARPA的SAMAN項目和NSF的CONSER項目的支持。NS具有開放性的結(jié)構(gòu)和良好的可擴充性。NS已經(jīng)從其他研究者那里吸收了豐富的模塊,包括UCBDaedelus和CMUMonarch計劃以及SUN微系統(tǒng)公司獲得的無線代碼。
REAL模擬器起先是為了研究分組交換數(shù)據(jù)網(wǎng)絡(luò)中的流量控制和擁塞方案的動態(tài)性的。它提供給用戶一種方法來描述這些網(wǎng)絡(luò)并觀察它們的行為。REAL模擬器使用的是C++語言編寫的一種模擬器,它提供源代碼給用戶,以便使感興趣的用戶可以根據(jù)他們自己的需要修改模擬器,從而達到特定要求。在此基礎(chǔ)上,LawrenceBerkeleyNationalLaboratory的網(wǎng)絡(luò)模擬研究組開發(fā)了NS的第一個版本。
NS1繼承了REAL模擬器的工作,包括幾種風(fēng)格的TCP(包括SACK、Tahoe和Reno)和路由器調(diào)度算法等,并形成了一個可擴展容易配置的事件驅(qū)動器引擎。NS1所使用的模擬描述語言是工具命令語言Tcl的擴展。一個模擬由一個Tcl程序來描述。通過NS的命令可以定義網(wǎng)絡(luò)的拓撲、配置業(yè)務(wù)源和會聚點、收集和統(tǒng)計信息并調(diào)用模擬執(zhí)行命令。通過建立這樣一個通用的語言,NS具有很強大的模擬配置描述能力。在對NS1改進的基礎(chǔ)上,UCBerkeley發(fā)布了NS第二個版本——NS2。NS2相對NS1來說有了重大的改變。例如,NS2重新定義了對象結(jié)構(gòu),使用MIT的面向?qū)ο蟮腡cl(Otcl)代替了Tcl作為模擬配置的接口,Otcl解釋器的接口代碼和主模擬器分離等。
NS2經(jīng)歷了不斷的改進,已經(jīng)發(fā)布了更多更新的版本?,F(xiàn)在已經(jīng)出現(xiàn)了NS2.31。目前NS還在發(fā)展,還不是一個完善的產(chǎn)品。雖然NS所包含的組件庫已經(jīng)相當(dāng)豐富,但是不可能包括所有特定用戶所需要的模塊。而且,軟件中的bug還在不斷地發(fā)現(xiàn)和改正。NS還在不斷地繼續(xù)發(fā)展。在最新的NS發(fā)行版本中,包括了許多模擬所需要的組件,如模擬器、節(jié)點和分組轉(zhuǎn)發(fā)、鏈路和延遲、隊列管理與分組調(diào)度、代理、時鐘、分組頭及其格式、錯誤模型、局域網(wǎng)、地址結(jié)構(gòu)(平面型和層次型)、移動網(wǎng)絡(luò)、衛(wèi)星網(wǎng)絡(luò)、無線傳播模型、能量模型等;提供了豐富的數(shù)學(xué)支持,如隨機數(shù)產(chǎn)生等;提供了追蹤和監(jiān)視方法等;提供了完整的路由支持,如單播/組播路由、動態(tài)/靜態(tài)路由、層次路由等。6.1.2NS2的安裝與運行
NS2軟件在Unix系統(tǒng)上開發(fā),因此FreeBSD、Linux、SunOS、Solaris等Unix和類Unix系統(tǒng)是安裝NS2的最佳平臺。當(dāng)然,NS2也可以安裝并運行在Windows9x/2000/XP平臺上,但需要安裝cygwin插件。由于在Unix上有很多NS2的輔助工具軟件和用戶提供的源代碼資源,因此推薦大家在Unix平臺上使用NS2。我們以RedHatLinux9.0平臺為基礎(chǔ),介紹NS2的安裝。
NS2的主要模塊包括Tcl、Tk、Otcl、TclCL、ns、TclDebug、nam和Xgraph等,其中前五個為必選模塊,其余的模塊則是可選擇的。NS2的用戶可以使用兩種方式從其主頁上下載安裝:一種方式是單個模塊下載,然后逐個編譯、安裝。這種安裝方式下,各個模塊的安裝是有順序的,用戶應(yīng)該按照主頁上模塊排列的順序依次編譯、安裝。另一種方式稱為“all-in-one”,NS2的開發(fā)者已經(jīng)將用戶可能需要的模塊都組成一個安裝包,并且準備好了編譯文件。這種方式對于初學(xué)者來說是非常方便的。下面就說明怎樣以“all-in-one”的方式安裝NS2。假定安裝的NS2版本是2.30,安裝文件ns-allinone-2.30.tar.gz已經(jīng)存在于/home/nsuser目錄下,nsuser是用戶自己的目錄名。安裝時,用戶輸入如下代碼:
cd/home/nsuser
tarxzvfns-allinone-2.30.tar.gz
cdns-allinone-2.30
./install安裝結(jié)束后,系統(tǒng)會提示用戶進行配置路徑文件和環(huán)境變量:
gedit?.bashrc
exportPATH=“$PATH:/home/nsuser/ns-allinone-
2.30/bin:/home/nsuser/ns-allinone-2.30/
tcl8.4.5/unix:/home/nsuser/ns-allinone-2.30/tk8.4.5/unix"ExportLD_LIBRARY_PATH="$LD_LIBRARY:/home/nsuser/ns-allinone-2.30/otcl-1.9:/
home/nsuser/ns-allinone-2.30/lib"
exportCL_LIBRARY=“$TCL_LIBRARY:/home/nsuser/ns-
allinone-2.30/tcl8.4.5/library"上面的目錄需改為用戶自己的目錄。到這一步NS已經(jīng)安裝成功了,新建一個終端,輸入NS并回車,如果出現(xiàn)%,那么NS就安裝成功。
NS2的運行方法有以下兩種:
(1)命令行方式,輸入“ns”,進入NS2的命令行環(huán)境,然后直接輸入各種指令來交互運行NS2。
(2)腳本方式,指定一個腳本文件(*.tcl文件),讓NS2執(zhí)行。如:
ns<example.tcl>因為腳本文件定義了整個模擬的過程,可以對網(wǎng)絡(luò)的拓撲結(jié)構(gòu)、數(shù)據(jù)的收發(fā)過程等事件作細致的描述,所以我們通常使用方法(2)來運行NS2。6.1.3NS2的目錄結(jié)構(gòu)使用all-in-one方式安裝NS2非常簡單,安裝完成后,有以下幾個目錄:
(1)?Tcl8.xTcl的安裝目錄。
(2)?Tk8.x、Tk的安裝目錄。
(3)?Tclcl1.x的安裝目錄。
(4)?nam1.x.nam的安裝目錄,用于模擬結(jié)果的動畫演示和分析。
(5)?Xgraph1.x.Xgraph的安裝目錄,用于繪制模擬結(jié)果的曲線。
(6)?NS2.2x的安裝目錄,其中包含NS2.2x的C++和Tcl代碼,最終編譯生成的可執(zhí)行文件就位于該目錄的根目錄下。NS2.2x中包含有幾個很重要的目錄。其中,Tcl目錄包含了需要編譯的Tcl代碼,以及ex目錄,其中包含了很多例子腳本,可以供學(xué)習(xí)和研究參考。lib目錄中包含了NS2需要的很多庫文件,比如ns-default、tcl、ns-lib.tcl等,是模擬中經(jīng)常需要閱讀和改寫的代碼。如圖6-1所示為NS2.2x的目錄結(jié)構(gòu)。圖6-1NS2.2x目錄結(jié)構(gòu)6.1.4NS2的特點
NS2是一個包括12個小軟件的軟件包,其中Tcl、Tk、Otcl、TclCL、NS為必選軟件,TclDebug、nam、Xgraph、Gt-itm、SGB、Cweb、zlib為可選軟件,它支持一般的網(wǎng)絡(luò)仿真。
NS2具有如下的一些特點:
(1)仿真采用兩種語言。NS2仿真的一個顯著特點是采用兩種語言——C++和Otcl,以滿足仿真的特殊需要。C++是一種相對運行速度較快但是改變比較慢的語言,程序的運行時間很短,但轉(zhuǎn)換時間很長,比較適合具體協(xié)議描述。Otcl運行速度較慢,但可以快速轉(zhuǎn)變腳本語言,正好和C++互補,用來進行仿真參數(shù)的配置是最適合不過的。另外,TclCL模塊能夠?qū)煞N語言中的變量和對象連接起來。
(2)支持各種業(yè)務(wù)模型和多種通信協(xié)議。NS2內(nèi)置了各種常用的業(yè)務(wù)模型,包括FTP業(yè)務(wù)模型、CBR業(yè)務(wù)模型、On/Off業(yè)務(wù)模型等。同時它還支持TCP和UDP兩種傳輸協(xié)議以及多種路由協(xié)議,包括分級路由、廣播路由、多播路由、靜態(tài)路由、動態(tài)路由等,這極大方便了用戶的使用。另外,NS2支持通過C++二次開發(fā)用戶自己需要的協(xié)議。
(3)采用面向?qū)ο蠹夹g(shù)。NS2采用面向?qū)ο蠹夹g(shù),這就保證了軟件的可擴充性和重用性,提高了程序開發(fā)的效率。對象的屬性能夠很容易地配置,每個對象屬于相應(yīng)的行為和功能的類。類也可以繼承其他類,也可以通過C++來定義新的類來滿足用戶自己特定的需求。
(4)很強的結(jié)果處理能力。為了分析仿真結(jié)果,仿真結(jié)果的數(shù)據(jù)必須能夠完整收集。NS2提供了兩種基本數(shù)據(jù)追蹤能力:跟蹤和監(jiān)控。跟蹤能夠?qū)⒚總€數(shù)據(jù)包在任何時刻的狀態(tài)記錄到指定文件中,例如包在隊列或鏈路中丟棄、到達、離開的行為都可以記錄下來;而監(jiān)視則可有選擇地記錄自己需要的數(shù)據(jù),例如統(tǒng)計發(fā)送包、接收包、丟棄包的總數(shù)量,并且監(jiān)控也可用來對所有包或者指定單一數(shù)據(jù)流的監(jiān)測。
(5)?NS2可以運行在Linux、UNIX、Windows等多種操作系統(tǒng)平臺上。在Windows平臺上安裝Cygwin后再安裝NS2,也是一個非常合適的方案。同時NS2還提供了動態(tài)顯示仿真過程的nam觀察器和Xgraph圖形顯示工具。用戶從nam觀察器中可以直觀了解數(shù)據(jù)包的傳遞過程,而Xgraph工具可以很方便地將仿真結(jié)果轉(zhuǎn)換成圖表形式。6.1.5使用NS進行網(wǎng)絡(luò)模擬的方法和一般過程進行網(wǎng)絡(luò)模擬前,首先要分析模擬涉及哪個層次。NS模擬分兩個層次:一個是基于Otcl編程的層次,利用NS已有的網(wǎng)絡(luò)元素實現(xiàn)模擬,無須對NS本身進行任何修改,只要編寫Otcl腳本;另一個層次是基于C++和Otcl編程的層次,如果NS中沒有所需的網(wǎng)絡(luò)元素,就需要首先對NS擴展,添加需要的網(wǎng)絡(luò)元素。這就要利用分裂對象模型,添加新的C++類和Otcl類,然后再編寫Otcl腳本。整個模擬的過程如圖6-2所示。圖6-2利用NS進行網(wǎng)絡(luò)模擬的過程假設(shè)用戶已經(jīng)完成了對NS的擴展,或者NS所包含的構(gòu)件已經(jīng)滿足了要求,那么進行一次模擬的步驟大致如下:
(1)開始編寫Otcl腳本。首先配置模擬網(wǎng)絡(luò)拓撲結(jié)構(gòu),此時可以確定鏈路的基本特性,如延遲、帶寬和丟失策略等。
(2)建立協(xié)議代理,包括端設(shè)備的協(xié)議綁定和通信業(yè)務(wù)量模型的建立。
(3)配置業(yè)務(wù)量模型的參數(shù),從而確定網(wǎng)絡(luò)上的業(yè)務(wù)量分布。
(4)設(shè)置trace對象。trace對象能夠把模擬過程中發(fā)生的特定類型的事件記錄在trace文件中。NS通過trace文件來保存整個模擬過程。仿真完成后,用戶可以對trace文件進行分析研究。
(5)編寫其他的輔助過程,設(shè)定模擬結(jié)束時間,至此Otcl腳本編寫完成。
(6)用NS解釋并執(zhí)行剛才編寫的Otcl腳本。
(7)對trace文件進行分析,得出有用的數(shù)據(jù)。也可以用nam等工具觀看網(wǎng)絡(luò)模擬的運行過程。
(8)調(diào)整配置拓撲結(jié)構(gòu)和業(yè)務(wù)量模型,重新進行上述模擬過程。
NS2的模擬腳本由Otcl語言寫成,格式固定,以下是一個非常簡單的NS2模擬腳本的例子,它模擬局域網(wǎng)中兩個節(jié)點相互發(fā)送UDP數(shù)據(jù)流的過程。其模擬過程具體如下:第一步,創(chuàng)建一個Simulatorobject:
setns[newSimulator]第二步,創(chuàng)建跟蹤分析文件:
setf[openout.trw]
$nstrace-all$f
setnf[openout.namw]
$nsnamtrace-all$nf第三步,撰寫一個finish函數(shù),用于在模擬結(jié)束中調(diào)用,以及關(guān)閉跟蹤文件等:
procfinish{}{
globalnsfnf
$nsflush-trace
close$f
close$nf
execnamout.nam&
exit0}第四步,創(chuàng)建網(wǎng)絡(luò)拓撲:
setn0[$nsnode]
setn1[$nsnode]
$nsduplex-link$n0$n11Mbl0msDropTail第五步,創(chuàng)建Agent、Application及Traffic,加載UDP數(shù)據(jù)流:
#CreateaUDPagentandattachittonoden0setudp0
[newAgent/UDP]
$nsattach-agent
$n0$udp0
#CreateaCBRtrafficsourceandattachittoudp0
setcbr0[newApplication/Traffic/CBR]
$cbr0setpacketSize_500
$cbr0setinterval_0.005
$cbr0attach-agent$udp0第六步,將創(chuàng)建的Agent連接起來:
setnull0[newAgent/Null]
$nsattach-agent$n1$null0
$nsconnect$udp0$null0第七步,開始數(shù)據(jù)傳輸:
$nsat0.5"$cbr0:start"
$nsat4.5"$cbr0stop"第八步,運行模擬:
$nsrun第九步,停止模擬:
$nsat5.0"finish"6.2NS基本原理及其運行機制
6.2.1
NS原理概述
NS的原理主要有以下幾點。
1.離散事件模擬器
NS是一個離散事件模擬器。離散事件模擬是幾種常用的系統(tǒng)模擬模型之一。簡單地說,事件規(guī)定了系統(tǒng)狀態(tài)的改變,狀態(tài)的修改僅在事件發(fā)生時進行。在一個網(wǎng)絡(luò)模擬器中,典型的事件包括分組到達、時鐘超時等。模擬時鐘的推進由事件發(fā)生的事件量確定。模擬處理過程的速率不直接對應(yīng)著實際事件。一個事件的處理可能又會產(chǎn)生后續(xù)的事件,例如對一個接收到的分組的處理觸發(fā)了更多的分組的發(fā)送。模擬器所做的就是不停地處理一個個事件,直到所有的事件都被處理完或者某一特定的事件發(fā)生為止。
NS的核心部分是一個離散事件模擬引擎。NS中有一個“調(diào)度器”(Scheduler)類,負責(zé)記錄當(dāng)前事件,調(diào)度網(wǎng)絡(luò)事件隊列中的事件,并提供函數(shù)產(chǎn)生新事件,指定事件發(fā)生的時間。NS的事件調(diào)度機制是實現(xiàn)仿真事件與物理事件同步的關(guān)鍵。
2.豐富的構(gòu)件庫有了離散事件模擬引擎,原則上用戶可以對任何系統(tǒng)進行模擬,而不限于通信網(wǎng)絡(luò)系統(tǒng)。用戶可以自己完成對所要研究的系統(tǒng)的建模工作,編寫各種事件的處理代碼,然后利用這個離散事件模擬器來完成這個模型的模擬。然而,這樣做既不能發(fā)揮NS的優(yōu)勢,也不符合NS設(shè)計者的本意。針對網(wǎng)絡(luò)模擬,NS已經(jīng)預(yù)先做了大量的模型化工作。NS對網(wǎng)絡(luò)系統(tǒng)中一些通用的實體已經(jīng)進行了建模。例如鏈路、隊列、分組、節(jié)點等,并利用對象來實現(xiàn)了這些實體的特性和功能,這就是NS的構(gòu)件庫。相對于一般的離散事件模擬器來說,NS的優(yōu)勢就在于它有非常豐富的構(gòu)件庫,而且這些對象易于組合、易于擴展。用戶可以充分利用這些已有的對象進行少量的擴展,組合出所要研究的網(wǎng)絡(luò)系統(tǒng)模型,然后進行模擬。這樣就大大減輕了進行網(wǎng)絡(luò)模擬研究的工作量,提高了效率。圖6-3中給出了NS構(gòu)件庫的部分類層次結(jié)構(gòu)。實時仿真平臺的各組件,也是基于這個層次結(jié)構(gòu)擴展而來的。圖6-3NS構(gòu)件庫(部分)
NS的構(gòu)件庫所支持的網(wǎng)絡(luò)類型包括廣域網(wǎng)、局域網(wǎng)、移動通信網(wǎng)、衛(wèi)星通信網(wǎng)等,所支持的路由方式包括層次路由、動態(tài)路由、多播路由等。NS還提供了跟蹤和監(jiān)測的對象,可以把網(wǎng)絡(luò)系統(tǒng)中的狀態(tài)和事件記錄下來以便分析。另外,NS的構(gòu)件庫中還提供了大量的數(shù)學(xué)方面的支持,包括隨機數(shù)產(chǎn)生、隨機變量、積分等。
3.分裂對象模型
NS的構(gòu)件庫是用兩種面向?qū)ο蟮恼Z言編寫的:C++和Otcl。NS中的構(gòu)件通常都作為一個C++類來實現(xiàn),同時有一個Otcl類與之對應(yīng)。用戶通過編寫Otcl腳本來對這些對象進行配置、組合,描述模擬過程,最后調(diào)用NS完成模擬。這種方式被稱為分裂對象模型。
NS使用這種分裂對象模型,是出于兼顧模型性能和靈活性兩方面的考慮。一方面C++是高效的編譯執(zhí)行語言,使用C++實現(xiàn)功能的模擬,可使模擬過程的執(zhí)行獲得比較好的性能。另一方面,Otcl是解釋執(zhí)行的,用Otcl進行模擬配置,可以在不必重新編譯的情況下隨意修改模擬參數(shù)和模擬過程,提高了模擬的效率。同時,這種分裂對象模型增強了構(gòu)件庫的可擴展性和可組合性,用戶通常只需要編寫Otcl腳本就可以把一些構(gòu)件組合起來,成為一個“宏對象”。用戶通過Otcl進行模擬配置,很多情況下只需要了解構(gòu)件的使用和配置接口就可以了,而不需要了解這些構(gòu)件的功能是如何實現(xiàn)的。
4.開放的源碼
NS中所體現(xiàn)的這些先進的設(shè)計思想使得NS成為了一種實用的網(wǎng)絡(luò)模擬器。同時,NS是免費的,并且開放源碼。這使得利用NS進行網(wǎng)絡(luò)模擬的研究者可以很方便地擴展NS的功能,也可以很方便地共享和交流彼此的研究成果。6.2.2NS的離散事件模擬機制要理解NS2的離散事件模擬機制,首先應(yīng)該理解離散事件模擬的基本概念和基本要素。在此基礎(chǔ)上,對NS2中的離散模擬事件機制加深理解,有助于掌握NS2模擬工具。
1.離散事件模擬的基本概念和基本要素要理解什么是離散事件模擬,首先應(yīng)該理解離散事件系統(tǒng)。簡單地說,離散事件系統(tǒng)就是事件規(guī)定了系統(tǒng)狀態(tài)的改變,狀態(tài)的修改僅在事件發(fā)生時進行。模擬是一種通過為實際系統(tǒng)或假想的系統(tǒng)建立模型,以研究該系統(tǒng)在各種條件下的行為的技術(shù)。模擬一般注重系統(tǒng)隨系統(tǒng)時間變化的行為。離散事件模擬是一種常用的模擬方法。離散事件模擬用于研究系統(tǒng)隨時間變化而發(fā)生的行為。事件和模擬時間是離散事件模擬的基本要素。因此,理解一個離散事件方針系統(tǒng),就應(yīng)該抓住事件和模擬時間這兩個基本概念。模擬的過程,可以看做是模擬時間從0增加到模擬終止時間的過程。而對離散事件模擬來說,模擬時間的推進就是由事件的發(fā)生來推進的。
2.系統(tǒng)、模型與模擬
1)系統(tǒng)系統(tǒng)是處于一定的環(huán)境中相互聯(lián)系和相互作用的、若干組成部分結(jié)合而成的具有特定功能的有機整體。系統(tǒng)具有“三要素”,即實體、屬性和活動。實體確定了系統(tǒng)構(gòu)成,也就確定了系統(tǒng)的邊界;屬性也稱為描述變量,描述每一個實體的特征;活動定義了系統(tǒng)內(nèi)部實體之間的相互作用,從而確定了系統(tǒng)內(nèi)部發(fā)生變化的過程。系統(tǒng)一般由邊界、輸入、輸出、控制、處理、反饋等六個部分組成。
2)模型為了研究、分析、設(shè)計和實現(xiàn)一個系統(tǒng),需要進行實驗。實驗方法大體可分為兩大類:一類是直接在真實系統(tǒng)上進行,另一類是先構(gòu)造模型,通過對模型的實驗來代替或部分代替真實系統(tǒng)的實驗。在真實系統(tǒng)上實驗有如下缺陷:首先,在真實系統(tǒng)上進行實驗可能會引起系統(tǒng)破壞,或發(fā)生故障,或發(fā)生傷亡事故;其次,需要進行多次實驗時,難以保證每次實驗的條件相同;再次,實驗時間太長或費用昂貴;最后,系統(tǒng)還處于設(shè)計階段,真實的系統(tǒng)尚未建立,人們需要準確地了解未來的系統(tǒng)性能。因此,在模型上試驗越來越受到青睞,建模技術(shù)也隨之發(fā)展起來了。所謂模型,指的是按一定的研究目的對所研究的系統(tǒng)準確的描述和表現(xiàn)。模型對系統(tǒng)的描述應(yīng)是準確和恰到好處的,是建立在一定的研究目的之上的。
3)模擬
1961年,G.W.Morgenthater首次對“模擬“進行了技術(shù)性定義,即“模擬意指在實際系統(tǒng)尚不存在的情況下對于系統(tǒng)或活動本質(zhì)的實現(xiàn)”。另一個對“模擬”進行技術(shù)性定義的是Ken,他在1978年的著作《連續(xù)系統(tǒng)模擬》中將模擬定義為“用能代表所研究的系統(tǒng)的模型作實驗”。1982年,Spriet進一步將模擬的內(nèi)涵加以擴充,定義為“所有支持模型建立與模型分析的活動即為模擬活動”。1984年,Oren在給出了模擬的基本框架“建模—實驗—分析”的基礎(chǔ)上,提出了“模擬是一種基于模型的活動”的定義,這個定義被認為是現(xiàn)代模擬技術(shù)的一個重要概念。
3.離散事件模擬離散事件系統(tǒng)的模擬問題,是指隨機時刻點上發(fā)生的事件引起系統(tǒng)中實體的狀態(tài)變化。而通信系統(tǒng)正是這樣的系統(tǒng)。描述這類系統(tǒng)的模型一般不是一組數(shù)學(xué)表達式,而是一幅表示數(shù)量關(guān)系和邏輯關(guān)系的流程圖。離散事件系統(tǒng)的算法體現(xiàn)在其建??蚣芎湍M策略中。在離散事件的模擬中有以下三類基本模擬策略:
(1)事件調(diào)度法:按這種方法建立模型時,所有事件均放在事件表中,模型中設(shè)置一個時間控制成分,該成分從事件表中選擇具有最早發(fā)生時間的事件,并將模擬時鐘修改到該事件發(fā)生的時間,再調(diào)用與該事件相應(yīng)的事件處理模塊,該事件處理完后返回時間控制成分。這樣,事件的選擇與處理不斷地進行,直到模擬終止的條件產(chǎn)生為止。
(2)活動掃描法:在此方法中,系統(tǒng)由部件組成,而部件包含著運動,這些活動的發(fā)生應(yīng)當(dāng)滿足規(guī)定事件發(fā)生的條件。每一個成分均有一個激活條件,如條件滿足,則激活該成分的活動例程。模擬過程中,活動的發(fā)生時間也作為條件之一,而且較之其他條件具有更高的優(yōu)先權(quán)。即在判斷激活條件時首先判斷該活動發(fā)生的時間是否滿足,然后再判斷其他條件。對活動的掃描循環(huán)進行,直到模擬終止為止。
(3)進程交互法:這種方法的特點是系統(tǒng)模擬時鐘的控制程序采用兩張事件表,其一是當(dāng)前事件表(CurrentEventsList,CEL),它包含了從當(dāng)前時間點開始有資格執(zhí)行的事件記錄,但是該事件是否發(fā)生的條件尚未判斷。其二是將來事件表(FutureEventsList,F(xiàn)EL),它包含在將來某個模擬時刻發(fā)生的事件記錄。每一個事件記錄中包含該事件的若干屬性,其中必有一個屬性,說明該事件在過程中所處位置的指針。進程交互法首先按一定的分布產(chǎn)生到達實體并置于FEL中,實體進入排隊等待,然后對當(dāng)前事件表進行掃描,判斷各種條件是否滿足,再對滿足條件的活動進行處理,模擬時鐘推進到服務(wù)結(jié)束并將該實體從系統(tǒng)中清除,最后將FEL作為當(dāng)前事件的實體移到當(dāng)前事件表中。
4.NS中的離散事件模擬機制簡述在NS中,整個模擬過程是由一個名為Simulator的Tcl類來定義和控制的,Simulator類提供了一系列對模擬進行配置的接口,這其中包括選擇“事件調(diào)度器(EventScheduler)”接口。進行模擬通常要首先創(chuàng)建一個Simulator類的實例對象,并調(diào)用該對象的一系列方法來創(chuàng)建節(jié)點(Node)、拓撲(Topology)等模擬所必需的對象。Simulator類提供了一些與建立模擬有關(guān)的方法,分為如下三類:
(1)創(chuàng)建和管理拓撲結(jié)構(gòu),即管理Node和Link。
(2)與tracing有關(guān)的方法。
(3)與事件調(diào)度器(EventScheduler)有關(guān)的方法。模擬開始以后,Simulator對象會完成一系列初始化的工作,這其中包括:
(1)通過調(diào)用create_packetformat來初始化packet的結(jié)構(gòu)。
(2)創(chuàng)建一個“事件調(diào)度器(scheduler,缺省時為calendarscheduler)”。
(3)創(chuàng)建一個“nullagent”。
NS是一個事件(Event)驅(qū)動的模擬器,目前NS支持兩種類型的事件調(diào)度器:非實時的(NoneReal-time)和實時的(Real-time)。非實時的調(diào)度器又分為三種:linked-list、heap、calendar(這是缺省的scheduler);從邏輯上說這三種scheduler是相同的,但它們所采用的數(shù)據(jù)結(jié)構(gòu)不同。之所以要保留三種scheduler,主要是為了使NS能夠向前兼容,因此我們在使用非實時的scheduler時,一般只需要用缺省的calendarscheduler就可以了。
scheduler的主要功能是處理分組(Packet)的延遲以及充當(dāng)定時器。一個scheduler的執(zhí)行過程是這樣的:從所有事件中選擇發(fā)生時刻最早的事件,調(diào)用它的handler函數(shù),把該事件執(zhí)行完畢,然后從剩余的所有事件中選擇發(fā)生時刻最早的事件執(zhí)行,如此反復(fù)執(zhí)行。NS只支持單線程,故在某一時刻只能有一個事件在執(zhí)行,如果有多于一個事件被安排在同一時刻,那么會按照事件代碼插入的先后次序執(zhí)行。圖6-4所示為事件調(diào)度器(EventScheduler)工作過程的示意圖。圖6-4NS的時間調(diào)度示意圖6.2.3NS基于無線網(wǎng)絡(luò)仿真實現(xiàn)原理最初,NS2中無線網(wǎng)絡(luò)仿真模型是在CMU的Monarchgroup的基礎(chǔ)上發(fā)展起來的。無線網(wǎng)絡(luò)仿真模型主要包括移動節(jié)點、路由結(jié)構(gòu)和用以構(gòu)建移動節(jié)點網(wǎng)絡(luò)棧的網(wǎng)絡(luò)組件。其中網(wǎng)絡(luò)組件主要包括信道(Channel)、網(wǎng)絡(luò)接口(NetworkInterface)、無線電傳播模型(RadioPropagationModel)、MAC協(xié)議、接口隊列(InterfaceQueue)、鏈路層(LinkLayer)和地址解析協(xié)議ARP(AddressResolutionProtocol)等。由CMU/Monarch引入的無線模塊可以進行純無線網(wǎng)絡(luò)(包括無線局域網(wǎng)WirelessLAN),原始NS2無線網(wǎng)絡(luò)仿真僅支持純無線局域網(wǎng)和Adhoc網(wǎng),目前在此基礎(chǔ)上又作了進一步發(fā)展,以適應(yīng)有線與無線互連網(wǎng)絡(luò)和移動IP網(wǎng)仿真。無線網(wǎng)絡(luò)仿真模型本質(zhì)上是由位于核心的移動節(jié)點組成的,并附加了一些輔助特性,以滿足Adhoc移動節(jié)點類的實現(xiàn)原理。
1.節(jié)點類的實現(xiàn)原理移動節(jié)點類是無線網(wǎng)絡(luò)仿真實現(xiàn)的核心,也是建立無線拓撲結(jié)構(gòu)的基礎(chǔ),它是一個組合體對象,C++移動節(jié)點類由父類節(jié)點類派生。移動節(jié)點類可以看成是在基本節(jié)點類的基礎(chǔ)上添加了無線和移動的功能,如在給定拓撲結(jié)構(gòu)中的移動能力或在信道上傳送和接收數(shù)據(jù)的能力,以用于建立移動、無線網(wǎng)絡(luò)仿真環(huán)境。移動節(jié)點和基本節(jié)點的主要區(qū)別是移動節(jié)點不是通過鏈路的方式把節(jié)點相連。移動特性主要包括節(jié)點的移動、定期的位置更新以及網(wǎng)絡(luò)拓撲結(jié)構(gòu)的邊界等等,這些都是由C++實現(xiàn)的;而基本節(jié)點的內(nèi)部網(wǎng)絡(luò)組件則是由腳本語言O(shè)tcl實現(xiàn)的。
2.移動的實現(xiàn)原理
NS2中移動節(jié)點按設(shè)計可在三維拓撲結(jié)構(gòu)中運行,但目前第三維坐標(Z)沒有被使用。也就是說,移動節(jié)點可被假定為始終在一個平面上移動,即Z的值始終固定,默認為0。實現(xiàn)節(jié)點的運動主要有兩種方法:第一種方法在一開始就明確地指定節(jié)點開始的位置、目的位置和節(jié)點移動的速度。可以通過如下命令實現(xiàn),這些命令通常是放在一個單獨的場景文件中。
$nodesetx_<x1>$nodesety_<y1>$nodesetz_<z1>$nsat$time$nodesetdest<x2><y2><speed>在這種方法中,每當(dāng)需要知道節(jié)點在某一給定時刻的位置時,節(jié)點的運動就會更新。節(jié)點運動的更新是由于相鄰的節(jié)點詢問間距變化產(chǎn)生的,或是使用上述命令改變了節(jié)點的方向和速度。第二種方法在一個隨機位置啟動移動節(jié)點,通過編制程序來更新節(jié)點的速度和方向。目的地址和速度的值均采用隨機函數(shù)生成。第二種方法相對第一種方法來說更靈活,用戶可根據(jù)需要靈活選用。其使用命令如下:$mobilenodestart另外,不管采用哪種方法,在產(chǎn)生移動節(jié)點之前,都需要在創(chuàng)建移動節(jié)點之前定義移動節(jié)點的移動范圍,通常使用下面的方法定義平面拓撲的長和寬:
settopo[newTopography]
$topoload_flatgrid$opt(x)$opt(y)
3.移動節(jié)點的組成在進行移動節(jié)點的模擬時,首先要了解移動節(jié)點的基本工作機制,也就是移動節(jié)點的組成。移動節(jié)點是由一系列網(wǎng)絡(luò)構(gòu)件構(gòu)成的,這些構(gòu)件包括鏈路層(LinkLayer,LL}、連接到LL上的ARP模塊、接口隊列(InterfaceQueue,IFQ)、MAC層(MAC)、網(wǎng)絡(luò)接口(NetworkInterface)。移動節(jié)點通過網(wǎng)絡(luò)接口連接到無線信道(Channel)上。移動節(jié)點的各個網(wǎng)絡(luò)構(gòu)件是在Otcl中創(chuàng)建并組合在一起的。下面簡單介紹移動節(jié)點的各個網(wǎng)絡(luò)構(gòu)件以及無線信道:
(1)?LinkLayer。移動節(jié)點使用的LL連接了一個ARP模塊,用來把IP地址解析成物理(MAC)地址。通常,對于所有發(fā)出的分組,路由Agent會把分組傳遞給LL。LL把分組傳遞給接口隊列(InterfaceQueue)。對于所有接收到的分組,MAC層將分組傳遞給LL,LL再將分組傳遞給node_entry_。
(2)?ARP。地址解析協(xié)議模塊從LL接收請求。如果ARP已經(jīng)知道目標節(jié)點的物理(MAC)地址,它就把該物理地址寫入分組的MAC頭中;否則,它就廣播一個ARP請求并暫時緩存當(dāng)前的分組。對于每一個未知的目標物理地址,都有一個可以存放一個分組的緩沖區(qū)。當(dāng)更多的傳送給同一個目標節(jié)點的分組被送到ARP模塊時,前面被緩沖的分組就被丟棄掉。一旦ARP知道了分組的下一跳目標節(jié)點的物理地址,該分組就被放入接口隊列中。
(3)?InterfaceQueue。接口隊列是由PriQueue類實現(xiàn)的,PriQueue類是一個優(yōu)先級隊列,它優(yōu)先處理路由協(xié)議分組。它可以對所有隊列中的分組進行過濾,刪除那些具有特定目標地址的分組。
(4)?MAC層。MAC層實現(xiàn)了IEEE802.11的DCFMAC協(xié)議。
(5)?NetworkInterface。網(wǎng)絡(luò)接口是移動節(jié)點訪問信道的接口。這個接口通過碰撞和無線傳輸模塊來接收其他節(jié)點發(fā)送到信道上的分組。它將波長、傳輸功率等信息寫入分組頭,接收節(jié)點的無線傳輸模塊通過分組頭中的這些信息來判斷分組在到達時的功率是否足夠,只有功率大于某臨界值時分組才能被正確接收。
(6)?Antenna。移動節(jié)點使用單一增益的全向天線。
(7)?RadioPropagationModel。無線信號傳輸模型,這個模型用來計算每個分組在到達接收節(jié)點時的信號強度(功率)。在移動節(jié)點的網(wǎng)絡(luò)接口層有一個接收功率閾值,當(dāng)收到的分組的信號強度(功率)小于該閾值時,這個分組就被標記為error并被MAC層丟棄掉。NS中包含了三個無線信號傳輸模型:Free-space模型、Two-raygroundreflection模型和Shadowing模型。
(8)?Channel。無線信道的功能是將分組復(fù)制給所有連接到本信道上的移動節(jié)點(除了分組的源節(jié)點)。所有收到分組的節(jié)點需要自己根據(jù)無線信號傳輸模型來判斷是否能正確接收到分組。每一個Channel對象都會維護一個網(wǎng)絡(luò)接口對象的列表,列表中包含了所有連到這個Channel上的網(wǎng)絡(luò)接口對象,Channel只保存這個列表的頭結(jié)點指針ifhead_。通過ifhead_,Channel可以遍歷整個列表,這樣Channel就能實現(xiàn)從一個網(wǎng)絡(luò)接口對象收到packet,然后復(fù)制n份給其他的n個網(wǎng)絡(luò)接口對象。6.2.4模擬環(huán)境的搭建首先我們要先搭建一個無線場景。假設(shè)這個場景中包含node_(0),node_(1),node_(2),…,node_(n)。由于我們要用到n個移動節(jié)點,因此在生成的命令中用到node數(shù)組變量,需提前建立它們。在NS運行的Tcl文件里使用如下代碼:
for{seti0}{$i<$val(nn)}{incri}{
setnode_($i)[$nsnode]
}在創(chuàng)建節(jié)點之前還應(yīng)定義它的各種屬性,就是配置節(jié)點。函數(shù)Simulator::node-config{}就是用來配置節(jié)點的屬性的。節(jié)點的屬性包括節(jié)點的地址類型、移動節(jié)點的各個網(wǎng)絡(luò)構(gòu)件的類型、Adhoc網(wǎng)絡(luò)中移動節(jié)點的路由協(xié)議類型、是否打開各層(Agent,Router,MAC)的trace功能等等。我們在這里對這些功能的定義如下:
(1)?addressType:設(shè)定節(jié)點的地址類型。在NS2中,節(jié)點的地址有兩種類型,即def(也稱flat)和hierarchical。def(flat)是缺省類型,用一個32?bit的數(shù)表示節(jié)點的地址。hierarchical是分層的地址,可以把32?bit的地址分為幾層(缺省是3層),這種地址結(jié)構(gòu)在模擬組播業(yè)務(wù)時比較方便,可以按照組播樹來設(shè)置節(jié)點的地址。在這里我們就采用def缺省類型。
(2)?adhocRouting:設(shè)定自組網(wǎng)(Adhocnetwork)中的移動節(jié)點(MobileNode)所使用的路由協(xié)議。
(3)?llType:設(shè)定移動節(jié)點的邏輯鏈路層(LogicLinkLayer)。
(4)?macType:設(shè)定移動節(jié)點的MAC層(MediaAccessControllayer)類型。
(5)?Type:設(shè)定移動節(jié)點的隊列類型。
(6)?ifqLen:設(shè)定移動節(jié)點的隊列長度。
(7)?antType:設(shè)定移動節(jié)點的天線類型。
(8)?propType:設(shè)定移動節(jié)點的無線信號傳輸模型。這里我們設(shè)置的傳輸模型為TwoRayGround方式。
(9)?phyType:設(shè)定移動節(jié)點的物理層類型。
(10)?channelType:設(shè)定移動節(jié)點的無線信道類型。
(11)?topoInstance:設(shè)定移動節(jié)點的拓撲對象。
(12)?agentTrace:是否打開應(yīng)用層的Trace。
(13)?routerTrace:是否打開路由的Trace。
(14)?macTrace:是否打開MAC層的Trace。
(15)?movementTrace:是否打開節(jié)點位置和移動信息的Trace。6.2.5分裂對象模型的基本概念前面我們已經(jīng)簡單介紹了Tcl和Otcl。Tcl是一種解釋執(zhí)行的簡單的腳本語言。其解釋器是用C語言編寫的,具有很強的可擴展性。只要用戶增加相應(yīng)的解釋執(zhí)行模塊的程序,就可擴展出新的命令。
Otcl是對Tcl的擴展,增加了面向?qū)ο蟮母拍?。在Otcl中,可以定義類和對象,類可以包括數(shù)據(jù)成員和類似成員函數(shù)的實例過程,也可以繼承,這些特點使得Otcl的邏輯描述能力大大增強了。然而這些還不夠,為了進一步增強編程的靈活性,提高程序的效率,我們需要把Otcl和C++結(jié)合起來。為了能充分發(fā)揮Otcl和C++這兩種面向?qū)ο笳Z言的強大能力,我們需要一種機制,使得在C++中能直接調(diào)用Otcl解釋器的功能,Otcl和C++能夠互相直接操作對方定義的數(shù)據(jù),并且C++中的類可以和Otcl中的類對應(yīng)起來。這種機制就是TclCL。這種方式被稱為分裂對象模型,組件的主要功能通常在C++中實現(xiàn),Otcl中類主要提供C++對象面向用戶的接口。用戶可以通過Otcl來訪問對應(yīng)的C++對象成員變量和函數(shù)。C++對象和Otcl對象之間通過TclCL的機制來關(guān)聯(lián),這樣使NS模擬性能更強更靈活。作為面向?qū)ο蟮木W(wǎng)絡(luò)模擬器,NS2由編譯和解釋兩個層次組成,編譯層次包括C++類庫,而解釋層次包括對應(yīng)的Otcl類,用戶以O(shè)tcl解釋器作為前臺來使用NS。
NS內(nèi)大部分類是TclObject的子類,用戶在解釋器環(huán)境創(chuàng)建新模擬對象,然后映像到對應(yīng)的編譯層次對象。NS2的編譯和解釋層次有著緊密的聯(lián)系,從用戶的觀點來看,在編譯和解釋層次中的類是一一對應(yīng)的。NS2使用兩種語言是因為模擬器有兩種不同的任務(wù):C++執(zhí)行速度快,但重新修改并編譯慢,可用于協(xié)議細節(jié)的實現(xiàn);Otcl雖然運行緩慢,但修改起來很快而且是交互的,便于多次模擬配置。
NS2采用了Otcl/C++分裂架構(gòu),其中Otcl處于主動位置,C++實際上是一個被Otcl調(diào)用的庫。C++用來實現(xiàn)復(fù)雜的類與對象屬性及其行為,Otcl用來操縱對象。在分裂對象模型的框架下,一次模擬過程實際上是這樣完成的:
(1)執(zhí)行模擬腳本。
(2)?NS2執(zhí)行一些初始化操作,然后實例化腳本中描述的各個組件,并將這些模擬元素連接起來,共同組織到一個Simulator的實例中。
(3)啟動事件,開始執(zhí)行模擬的過程。作為一個離散事件模擬器,事件的發(fā)生推進著模擬的進行,比如包到達定時器超時等。同時,在模擬的過程中要記錄信息,這些信息包括每個組件對事件的處理。這些信息要存儲在跟蹤文件中,在模擬結(jié)束后進行分析。
(4)所有事件完成后,模擬結(jié)束。通過對跟蹤文件進行提取,來分析模擬的結(jié)果。6.2.6C++和Otcl的實現(xiàn)原因模擬器有兩方面的事情需要做。一方面,具體協(xié)議的模擬和實現(xiàn)需要一種程序設(shè)計語言,它需要較高效率的處理字節(jié)(Byte)、報頭(PacketHeader)等信息,以及應(yīng)用合適的算法在大量的數(shù)據(jù)集合上進行操作。為了實現(xiàn)這個任務(wù),程序內(nèi)部模塊的運行速度(Run-timeSpeed)是非常重要的,而運行模擬環(huán)境的時間、尋找和修復(fù)bug的時間,重新編譯和運行的時間(Run-aroundTime)就顯得不是很重要了。另一方面,許多網(wǎng)絡(luò)中的研究工作都圍繞著網(wǎng)絡(luò)組件和環(huán)境的具體參數(shù)的設(shè)置和改變而進行,需要在短時間內(nèi)快速地開發(fā)和模擬出所需要的網(wǎng)絡(luò)環(huán)境(Scenarios),并且方便修改和發(fā)現(xiàn)、修復(fù)程序中的bug。在這種任務(wù)中,運行時間(Run-aroundTime)就顯得很重要了,因為模擬環(huán)境的建立和參數(shù)信息的配置只需要運行一次。為了滿足以上兩種不同任務(wù)的需要,NS的設(shè)計實現(xiàn)使用了兩種程序設(shè)計語言,C++和Otcl。這兩種程序設(shè)計語言都是面向?qū)ο?ObjectOriented)的程序設(shè)計語言。
C++程序模塊的運行速度非??欤菑娭祁愋偷某绦蛟O(shè)計語言(變量嚴格定義整型,浮點型和字符、字符串類型),容易實現(xiàn)精確的、復(fù)雜的算法,但是修改和發(fā)現(xiàn)、修正bug所花費的時間要長一些,這是因為它比較復(fù)雜。該特性正好用于解決第一個方面的問題。
Otcl是腳本程序編寫語言,是無強制類型的,比較簡單,容易實現(xiàn)和修改,也容易發(fā)現(xiàn)和修正bug,盡管它的運行速度和C++的模塊相比要慢很多。該特性正好用于解決第二方面的問題。在做模擬以及對NS進行擴展時,針對不同的任務(wù)選擇語言來實現(xiàn)的一般規(guī)則包括:
(1)以下情況使用Otcl:對模擬環(huán)境的配置、建立和在模擬中只需要運行一次的程序;如果通過Otcl腳本已經(jīng)存在的C++對象就能夠很方便地達到目的。
(2)以下情況使用C++:需要對一個數(shù)據(jù)流的每個分組進行處理的任何工作;如果必須修改已存在的C++類的行為。
NS通過TclCL把兩種語言中的對象和變量聯(lián)系起來。NS的構(gòu)件庫是一個層次結(jié)構(gòu)。其中的構(gòu)件通常都是由相互關(guān)聯(lián)的兩個類來實現(xiàn)的,一個在C++中,一個在Otcl中。因此,NS中就包含了一個C++類的層次結(jié)構(gòu)和一個Otcl類的層次結(jié)構(gòu),如圖6-5所示。構(gòu)件的主要功能通常在C++程序中實現(xiàn),Otcl中的類則主要提供C++對象面向用戶的配置接口。圖6-5分裂對象模型因此,在NS中C++中的類和Otcl中的類通常具有對應(yīng)關(guān)系,兩邊的類的繼承關(guān)系也通常是一致的。每當(dāng)實例化一個構(gòu)件時,都會同時創(chuàng)建一個Otcl中的對象和一個對應(yīng)的C++對象,并且這兩個對象可以互操作。例如圖6-6給出了一對相關(guān)聯(lián)的Otcl對象和C++對象的例子。在這個例子中,當(dāng)用戶在Otcl腳本中通過“newAgent/TCP”創(chuàng)建了一個Otcl對象_o123時,也相應(yīng)地在C++中創(chuàng)建了一個對象*tcp。通過Otcl對象_o123,我們可以直接訪問C++對象*tcp的數(shù)據(jù)成員以實現(xiàn)參數(shù)配置;而TCP的協(xié)議處理、數(shù)據(jù)傳輸和流控算法則是由C++對象*tcp的函數(shù)實現(xiàn)的。圖6-6Otcl和C++類的對應(yīng)關(guān)系6.3NS相關(guān)工具介紹6.3.1gnuplot
gnuplot是一個命令導(dǎo)向的交談式繪圖程序(Command-drivenInteractiveFunctionPlottingProgram),在1986年由ColinKelley和ThomasWilliams開發(fā)。gnuplot的功能就是把數(shù)據(jù)資料和數(shù)學(xué)函數(shù)轉(zhuǎn)換成容易觀察的平面或立體的圖形,幫助研究者進行數(shù)據(jù)分析。因此gnuplot并不是一般常見的美工繪圖軟件,它最適合的是在科學(xué)研究的過程中,幫助研究人員完成數(shù)據(jù)資料繪制與理論模型比較等機械化的工作,來加速研究的進行,這也正是我們在這里講解gnuplot的原因。科學(xué)研究也有自己的流程,通常都通過實驗來收集數(shù)據(jù),并對數(shù)據(jù)進行觀察分析,從中找出一些規(guī)律或問題,并反過來指導(dǎo)以后的研究。而觀察大量數(shù)據(jù)的最好方式,自然是繪圖。gnuplot就是為科學(xué)研究而開發(fā)的自動化繪圖軟件,可以把數(shù)據(jù)資料和數(shù)學(xué)函數(shù)轉(zhuǎn)換成容易觀察的平面或立體的圖形。它可以讓使用者很容易地讀入外部的數(shù)據(jù)結(jié)果,在屏幕上立即顯示圖形,并且可以選擇和修改圖形的畫法,明顯地表現(xiàn)出數(shù)據(jù)的特性。通過圖形,研究者可以尋找數(shù)據(jù)的規(guī)律,或者驗證模型的正確性等。而在實驗完成后,同樣可以利用gnuplot把結(jié)果記錄下來,可以將圖形打印出來或者輸出成通用的圖形格式,為記錄實驗結(jié)果或以后撰寫論文所用。現(xiàn)在gnuplot在Unix、Linux和Windows等平臺下都能實現(xiàn),然而它在各種平臺上的使用方法特別是提供的命令和函數(shù)基本上相同。下面,我們就以Linux下的gnuplot為例進行講解。
gnuplot有兩種工作方式:交互式方式或批處理方式。在命令行下,直接輸入gnuplot就可以進入交互式方式。使用者可以在文字界面下輸入命令,并及時察看反饋。退出gnuplot時,只需要使用quit命令或exit命令。若在gnuplot后面的參數(shù)中帶有文件名,gnuplot將進入批處理模式。在批處理模式下,gnuplot實際是采用load函數(shù)按順序把所有文件調(diào)入并批處理執(zhí)行其中的命令,完成后自動退出。文件中的命令和交互方式下使用的命令完全一樣。特別地,文件名“-”表示標準輸入。如下例,gnuplot就會按順序執(zhí)行file1和file2中的命令:
gnuplotfilelfile2
gnuplot中的命令和函數(shù)名都區(qū)分大小寫。所有的命令名都可以使用特定的簡寫名,并且不會發(fā)生混淆(但load和call例外,必須使用全名)。在一行中的命令數(shù)量不限,采用“;”分割開。字符串必須用單引號或雙引號括起來,例如load“filename”或cd“dir”。我們?nèi)绻炎龊玫膱D保存下來,以便讓其他文件使用,那么需要做兩件事:第一是要設(shè)定輸出格式,第二是告訴gnuplot要存成什么文檔。Gnuplot支持ps、pdf、png、jpg等多種格式。比方說,我們現(xiàn)在要保存為png格式,名叫mygraph.png,就輸入這樣的指令:
setoutput“mygraph.png”
settermpng
replot當(dāng)然,如果要輸出為pdf格式,就是settermpdf,其他格式也都是類似的方式。這是告訴gnuplot,以后圖形不要出現(xiàn)在屏幕上,換成用戶要求的格式輸出??墒侨绾卧僮寛D出現(xiàn)在屏幕上呢?那就是設(shè)回原有的輸出,這里各個平臺的設(shè)置方式不同,我們分別說明如下:
Linux的X-Windows系統(tǒng):settemx11
MacOSX:settermaqua
Windows:settermwindows其實gnuplot還支持更多的格式,可以用下面的指令查到詳細情形:
helpterm6.3.2gawk在NS2中,模擬產(chǎn)生的trace文件往往非常大,一般情況下,必須借助相應(yīng)的處理工具才能夠提取相應(yīng)的數(shù)據(jù)信息。比如,要統(tǒng)計一次模擬中的丟包率,必須計算出發(fā)送的包的數(shù)量和接收到的包的數(shù)量;要計算平均時延,必須計算出每個數(shù)據(jù)包的發(fā)送時間和接收時間,從而得出每個包的時延并進行統(tǒng)計。類似這樣的工作,可以用C語言編寫文本處理程序來完成,也可以使用Perl語言來完成,但gawk相對來說非常方便,本小節(jié)介紹gawk語言的使用。
1.gawk簡介
gawk是一種程序語言。它具有一般程序語言常見的功能。因為gawk語言具有某些特點,如:使用直譯器(Interpreter),不需先行編譯;變量無型別之分(Typeless),可使用文字當(dāng)數(shù)組的注標(AssociativeArray)等特色。因此,使用gawk撰寫程序比起使用其他語言更簡潔便利且節(jié)省時間。gawk還具有一些內(nèi)建功能,使得gawk擅于處理具有數(shù)據(jù)列(Record)、字段(Field)型態(tài)的數(shù)據(jù);此外,gawk內(nèi)建有pipe的功能,可將處理中的數(shù)據(jù)傳送給外部的Shell命令加以處理,再將Shell命令處理后的數(shù)據(jù)傳回gawk程序,這個特點也使得gawk程序很容易使用系統(tǒng)資源。
2.gawk的原理以下對gawk程序架構(gòu)以及相關(guān)的術(shù)語加以介紹。
1)名詞定義資料列:gawk從數(shù)據(jù)文件上讀取的基本單位,gawk讀入的第一筆資料列為:“+0.112cbr1000…21.03.100”第二筆資料列為:“-0.112cbr1000…21.03.100”一般而言,一筆數(shù)據(jù)列相當(dāng)于數(shù)據(jù)文件上的一行資料。字段(Field):數(shù)據(jù)列上被分隔開的子字符串。以資料列“+0.112cbr1000…21.03.100”為例,其各字段內(nèi)容結(jié)構(gòu)如下:一二三四五六七八九十十一十二+0.112cbr1000…21.03.100一般而言是以空格符來分隔相鄰的字段的。當(dāng)gawk讀入數(shù)據(jù)列后,會把每個字段的值存入字段變量。字段變量意義$0為一字符串,其內(nèi)容為目前gawk所讀入的資料列$1代表$0上第一個字段的數(shù)據(jù)$2代表$0上第二欄個位的資料……
2)程序主要結(jié)構(gòu)
Pattern1 {Actions1} Pattern2 {Actions2} Pattern3 {Actions3}一般常用“關(guān)系判斷式”來當(dāng)成Pattern。例如:
x>3 用來判斷變量x是否大于3
x==5 用來判斷變量x是否等于5
gawk提供C語言常見的關(guān)系操作數(shù),如:>、<、>=、<=、==、!=?等等。Actions由許多gawk指令所構(gòu)成,而gawk的指令與C語言中的指令非常類似。
I/O指令:print、printf()、getline…流程控制指令:
if(…){…}else{…}、while(…){…}……
gawk程序的流程為先判斷Pattern的結(jié)果,若為真(True)則執(zhí)行相對應(yīng)的Actions,若為假(False)則不執(zhí)行相應(yīng)的Actions。若是處理的過程中沒有Pattern,gawk會無條件地去執(zhí)行Actions。
3)工作流程執(zhí)行g(shù)awk時,它會反復(fù)進行下列四個步驟:
(1)自動從指定的數(shù)據(jù)文件中讀取一筆數(shù)據(jù)列。
(2)自動更新(Update)相關(guān)的內(nèi)建變量之值。
(3)逐次執(zhí)行程序中所有的Pattern{Actions}指令。
(4)當(dāng)執(zhí)行完程序中所有的Pattern{Actions}時,若數(shù)據(jù)文件中還有未讀取的數(shù)據(jù),則反復(fù)執(zhí)行步驟(1)~(4)。
gawk會自動重復(fù)進行上述的四個步驟,所以使用者無須在程序中編寫這個循環(huán)。6.3.3cbrgen
cbrgen工具用來生成傳輸負載(TrafficOverload),可以產(chǎn)生TCP流或者CBR流(ContantBytesRateStream)。它所在目錄為?~ns/indep-utils/cmu-scen-gen,只有cbrgen.tcl文件。cbrgen的使用方式如下:
nscbrgen.tcl[-typecbr|tcp][-nnnodes][-seedseed][-mcconnections][-raterate]其中各參數(shù)說明如下:
type:該參數(shù)指定了產(chǎn)生的是TCP流還是CBR流。
nn:通過nodes的值指定了有多少個節(jié)點。
mc:指定了這些節(jié)點間的最大連接數(shù)。
rate:通過rate值指定了每個連接間的流的負載量。如果產(chǎn)生的是CBR流,則包長固定為512?字節(jié),rate值指定的是每秒發(fā)送多少個包。
seed:指定了隨機數(shù)種子。例如,共有4個節(jié)點,最多有1條連接,在某個隨機時刻啟動一個CBR流,每秒發(fā)送1個長度為512字節(jié)的包。
nscbrgen.tcl-typecbr-nn4-seed1-mc1-rate1.0輸出結(jié)果如下,可以使用管道命令輸出到某個文件中去。
#nodes:4,maxconn:1,sendrate:1.0seed:l###1connectingto2attime25568388786897245#setudp_(0)[newAgent/UDP]
$ns_attach-agent$node_(1)$udp_(0)setnull_(0)[newAgent/Null]$ns_attach-agent$node_(2)$null_(0)
setcbr_(0)[newApplication/Traffic/CBR]
$cbr_(0)setpacketSize_512
$cbr_(0)setinterval_1.0
$cbr_(0)setrandom_1
$cbr_(0)setmaxpkts_1000
$cbr_(0)attach-agent$udp_(0)
$ns_connect$udp_(0)$null_(0)
$ns_at2.5568388786897245“$cbr_(0)start”
#
#Totalxoreces/connection:1/1
#6.3.4setdest
setdest是CMU大學(xué)在NS中推出無線網(wǎng)模擬模塊時提供的一個工具,可以用來隨機生成無線網(wǎng)所需要的節(jié)點運動場景,即一定數(shù)量的節(jié)點在某個固定大小的矩形區(qū)域中隨機朝某個目的節(jié)點運動,在到達該目的地后做一段時間的停留(也可以不停留)后,選擇另一個目的地隨機地以一個速度繼續(xù)運動。
setaest工具在?~ns/indep-utils/cmu-scen-gen/setdest目錄下,使用前需要進行make。setdest的命令格式如下:
./setdest-n<num_of_nodes>-p<pausetime>-s<maxspeed>-t<simtime>?-x<maxx>-y<maxy>><outdir>/<scenario-file>它使用到的參數(shù)定義如下:
n:num_of_nodes的值指定了場景中總共有多少個節(jié)點。
p:?pausetime指定了節(jié)點在運動到一個目的地后停留的時間,如果設(shè)為0,則節(jié)點不停留。
s:maxspeed指定了節(jié)點隨機運動速度的最大值,單位是m/s,節(jié)點的運動速度將在[0,maxspeed]中隨機選擇。
t:simtime指定了模擬場景的持續(xù)時間(單位為s)。
x:maxx指定節(jié)點運動區(qū)域的長度(x軸方向,單位為m)。
y:maxy指定節(jié)點運動區(qū)域的寬度(y軸方向,單位為m)。最后outdir/scenario-file指定了生成場景的輸出文件。下面的例子中,在生成的場景中,3個節(jié)點在300?m?×?500?m的矩形中不停地運動,最大速度為2?m/s,平均速度為1?m/s。場景的模擬時間為10?s。
./setdest-n3-p0-s2-t10-x300-y500>scen-3n-0p-10t-2s-300-500使用setdest生成的場景,可以在NS控制臺或者運行腳本中使用source命令調(diào)入。此外,由于生成的命令中用到了node_數(shù)組變量和god_變量,需要提前建立這些對象。例如我們在NS運行的tcl文件里一般會這樣使用下面的代碼:
#
#CreateGod
#
setgod_[create-god$val(nn)]
for{seti0}{$i<3}{incri}{
setnode_($i)[$ns_node]
$node_($i)random-motion0}
puts“Loadingscenariofile…”
sourcescen-3n-0p-10t-2s-300-5006.3.5threshold在無線網(wǎng)絡(luò)中,傳輸信號的強度一般隨著距離的增加而迅速降低,采用不同的傳播模型則信號衰減的公式有所不同。在NS中提供了三種傳輸模型:Freespace、TwoRayGround和Shadowing模型。一個數(shù)據(jù)包如果要在接收者方能正確接收,接收功率必須大于某一個接收功率閾值(threshold)。threshold工具就是用來計算在某種傳播模型下,如何設(shè)定接收功率閾值來控制無線傳輸?shù)姆秶?/p>
threshold工具所在目錄為?~ns/indep-utils。先采用下面的命令編譯得到可執(zhí)行文件:
g++threshold.cc-othreshold
threshold的命令格式如下:
threshold-m<propagation-model>[other-options]distance其中propagation-model指定了傳播模型,必須是Freespace、TwoRayGround和Shadowing中的某一種。distance指定了傳輸范圍。other-options指定了一些參數(shù),其中部分參數(shù)是三種模型都包括的,如:
Pt<transmit-power> 發(fā)送者的發(fā)送功率
fr<frequency> 發(fā)送者的發(fā)送頻率
Gt<transmit-antenna-gain> 發(fā)送天線的放大率
Gr<receive-antenna-gain> 接收天線的放大率
L<system-loss> 系統(tǒng)丟失率,L≥1有些參數(shù)是TwoRayGround模型特有的,如:
ht<transmit-antenna-height> 發(fā)送天線的高度
hr<receive-antenna-height> 接收天線的高度下面的例子計算出在默認的情況下,設(shè)定什么樣的接收功率閾值可以使得采用TwoRayGround模型下的無線傳輸范圍為400?m。
./threshold-mTwoRayGround300輸出結(jié)果如下:
distance=300
propagationmodel:TwoRayGround
Selectedparameters:
Transmitpower:0.281838
Frequency:2.472e+9
Transmitantennagain:1
Receiveantennagain:1
Systemloss:1
Transmitantennaheight:1.5
Receiveantennaheight:1.5
ReceivingthresholdRXThresh_is:1.76149e-10前面列出的都是目前的參數(shù)選擇,最后給出結(jié)果,接收功率閾值應(yīng)該為:1.76149e?-10。這樣,我們只需要在NS運行時使用下面的命令來設(shè)定該閾值,就可以使得無線通信距離變?yōu)?00?m。
Phy/WirelessPhysetRXThresh_5.57346e-11如果我們更具體一點,改變不同節(jié)點的接收閾值,那么就可以得到有單向鏈路的場景。當(dāng)然,更合理的做法可以是改變不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物標志物在藥物臨床試驗中的醫(yī)學(xué)研究意義
- 生物制劑臨床試驗中生物樣本庫管理規(guī)范
- 深度解析(2026)《GBT 20529.2-2010企業(yè)信息分類編碼導(dǎo)則 第2部分:分類編碼體系》
- 餐飲業(yè)門店經(jīng)理面試問題集
- 生活質(zhì)量干預(yù)方案
- 深度解析(2026)《GBT 19475.2-2004縮微攝影技術(shù) 開窗卡掃描儀制作影像質(zhì)量的測量方法 第2部分質(zhì)量要求和控制 》
- 工程項目經(jīng)理中級職位的答案解析
- 瓣膜性房顫患者卒中預(yù)防
- 深度解析(2026)《GBT 19352.4-2003熱噴涂 熱噴涂結(jié)構(gòu)的質(zhì)量要求 第4部分基本的質(zhì)量要求》
- 年產(chǎn)xxx復(fù)式水表項目可行性分析報告
- 人教版(PEP)英語六年級上冊 Unit4 Part A Lets learn 教案
- 基于無人機的精準投遞技術(shù)研究
- 人教版五年級《語文上冊》期末試卷(全面)
- 項目八 任務(wù)二:機械手液壓系統(tǒng)分析
- (完整文本版)日文履歷書(文本テンプレート)
- 國家開放大學(xué)《管理英語4》邊學(xué)邊練Unit 5-8(答案全)
- 時尚·魅力-大學(xué)生魅商修煉手冊智慧樹知到期末考試答案章節(jié)答案2024年南昌大學(xué)
- 《金牌店長培訓(xùn)》課件
- 宜昌市點軍區(qū)2023-2024學(xué)年七年級上學(xué)期期末數(shù)學(xué)綜合測試卷(含答案)
- 井下單項、零星工程管理制度模版
- 道路危險貨物運輸企業(yè)安全生產(chǎn)標準化評價實施細則
評論
0/150
提交評論