NS2學習

NS基本介紹

NS是由UC Berkeley大學開發的,來源於1989年的Real Network Simulator項目,通過多年發展,全世界各地研究者在此基礎上不斷綜合和完善,NS已經成爲一個涉及網絡各個方面的優秀的網絡模擬工具。因爲NS是一款免費的軟件,源碼公開,所以,學術界使用NS研究和開發協議進行網絡行爲模擬和性能仿真的人員較多,每一年在國內外發表的慾望了技術相關的學術論文中,利用NS給出模擬結果的文章很是多,所以,經過這種方法得出的研究結果也被學術界廣泛承認。前端

NS是一個面向對象的、離散時間驅動的模擬器。使用C++和OTcl(面向對象的Tcl語言)做爲開發語言。選擇這兩種語言進行開發,主要基於以下考慮:1.網絡協議模擬和實現須要高效的處理協議報頭信息,進行大量的數據處理,所以,程序內部模塊的運行速度相當重要,C++快速高效的特色很是適合於這部分工做;2.網絡模擬圍繞着網絡組件、拓撲結構和其餘環境參數而進行,參數須要快速改變以實現不一樣場景的網絡模擬,此時,網絡環境的配置(例如模擬時間、拓撲結構和節點類型等)就顯得很是重要,面向對象的OTcl腳本語言的靈活性就充分體現了優點。bash

NS安裝和配置

Ubuntu上NS必要工具和庫文件安裝網絡

1. 編譯gcc、make:sudo apt-get install build-essential架構

2. tk、tcl的庫文件:框架

   sudo apt-get install tcl8.4ide

   sudo apt-get install tcl8.4-dev函數

   sudo apt-get install tk8.4工具

   sudo apt-get install tk8.4-dev性能

3. 與nam相關的庫文件:sudo apt-get install libxmu-dev學習

NS安裝

1. 下載NS安裝壓縮包ns2-allinone-2.29.tar.gz

2. 解壓:tar –vxzf ns-allinone-2.29.tar.gz

3. 開始安裝:cd /$yourpath/ns/ns-allinone-2.29/ns-2.29/.install($yourpath是你放ns安裝包位置,後面假設是在/home/ns2)

4. 配置環境變量

5. 測試:在終端輸入ns,若是屏幕輸出%,則代表安裝成功。

環境變量的設置

安裝完畢後,還要修改用戶目錄(包括我的用戶/home下面,和root用戶/root下面)下的.bashrc,必須在該文件末尾追加如下3句代碼(這裏假定安裝的是ns2.29)

export PATH=$PATH: /home/ns2/ns-allinone-2.29/bin: /home/ns2/ns-allinone-2.29/tcl8.4.11/unix: /home/ns2/ns-allinone-2.29/tk8.4.11/unix

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH: /home/ns2/ns-allinone-2.29/otcl-1.11: /home/ns2/ns-allinone-2.29/lib

export TCL_LIBRARY = /home/ns2/ns-allinone-2.29/tcl8.4.11/library

設置環境變量是爲了設置NS的路徑和其執行過程當中須要使用的庫文件的路徑。

NS的架構

NS的模擬實現機制

分裂對象模型

前面提到NS使用OTcl和C++兩種語言結合工做,其中OTcl是解釋執行語言,C++是編譯執行語言,NS實例化一個組件會同時建立一個OTcl類對象和一個對應的C++類對象(節點除外),這兩個類互稱爲影像類,兩個對象互稱爲影像對象,能夠互操做。這就是NS的分裂對象模型——將對象分裂爲兩部分進行描述。

基於分裂對象的模型,NS採用兩級體系結構。NS的後臺描述事件調度器和大部分基本的網絡組件對象,主要功能是實現對數據分組的處理,使用C++實現和編譯,稱爲編譯層次;NS的前端主要功能是堆模擬環境的創建和配置,用一個OTcl解釋器對腳本進行解釋,執行相應的操做,稱爲解釋層次。NS中編譯類對象經過OTcl鏈接創建與之對應的解釋類對象,這樣用戶就可以方便對C++對象的函數進行修改和配置。理解這兩層次之間關係對NS學習有很大幫助。

互爲影響類的對象和變量是經過NS中特有的一種稱爲TclCL的機制關聯的,在NS的架構中,TclCL支撐了整個框架——NS的類庫都是創建於TclCL基礎上的,共包含6個:Tcl、TclObject、TclClass、TclCommand、EmbeddedTcl和InstVar。

離散事件模擬

不少資料把NS描述爲「本質上是一個離散事件模擬器」,這是由於NS的核心是離散事件驅動調度機制。事件驅動,指的是觸發一個事件,而後執行相應的動做。離散事件驅動模型特色是隻關注事物的狀態變化(即事件),不關心變化的過渡過程。模型靠每個事件引起其餘事件的方式來維持運轉。每一個事件都有發生時間,模型的運轉實際就是按事件發生時間順序逐個處理事件,處理過程當中將產生新的事件。系統時間就是當前事件的發生時間,它不是等間隔變化而是跳躍變化的。

基於這種思想,NS設立了事件調度器(Scheduler),Scheduler接收來自Network Object(好比說各個層)產生的事件,並插入事件鏈表(一個FIFO隊列),事件調度器計算仿真事件,當觸發某個事件發生的時間到達時,Scheduler會激活事件隊列中的事件,把事件取出並調用相應的函數進行處理。全部經由調度器調度的事件完成時間是由NS自己的一個虛擬時鐘所控制的,虛擬時鐘能夠將實際的時間尺度放大,例如實際時間上1ms完成的事件用代碼來仿真可能須要5s,因爲虛擬時鐘的做用,在NS中5s的時長被當作1ms來使用(這至關於在虛擬時鐘上的1ms就是實際的5s,即放大功能)。因此,NS的每一層對分組封包的處理是不會在虛擬時鐘內的刻度尺上刻畫的,刻畫刻度尺的是在調度器中規定的事件的前後時間差(這句有點抽象,不理解就忽略吧)。能夠想象NS的虛擬時鐘內有一個滾軸,驅動虛擬時鐘滾軸滾動的就是事件調度,在本次事件調度未完成以前,滾軸不會向前滾動,而只要本次事件調度完成,就會滾動去執行下一個調度事件。須要在同一時間觸發的事件將會以進入調度隊列的前後順序而被一次執行,儘管執行有前後,但NS認爲它們是同一時間執行的,所以,在執行這些事件的時候,時鐘的滾軸不會滾動,在跟蹤文件上顯示這些事件的發生時間也是相同的。

因爲採用了離散時間模擬的機制,在仿真中不用考慮實際系統中須要考慮的實時性問題,這是對模擬的一種簡化,能夠凸顯事件之間的前後順序和接觸對事件存在依賴的事件間的耦合。

OTcl與C++的交互

IMG_20140313_084205[1]


IMG_20140313_084214[1]

IMG_20140313_084233[1]

IMG_20140313_084238[1]

IMG_20140313_084248[1]

IMG_20140313_084257[1]

IMG_20140313_084310_1[1]

IMG_20140313_084318[1]

IMG_20140313_084335_1[1]

IMG_20140313_084350_1[1]

IMG_20140313_084358[1]

IMG_20140313_084402[1]

IMG_20140313_084416[1]

IMG_20140313_084426[1]

IMG_20140313_084438[1]

IMG_20140313_084447[1]

IMG_20140313_084453[1]

相關文章
相關標籤/搜索