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