close
NS2裡主要的運作都是以TCL語言達成,
你可以把NS2想像成是TCL檔的解譯器
你可以把NS2想像成是TCL檔的解譯器
在這邊我先假設你已經安裝好NS2的環境了, 主要著重於TCL語言的撰寫部分
(若尚未安裝可參考柯志亨老師所提供的VM檔,
他已經很貼心地幫我們把環境都SETUP好了,可以省去不少前置動作)
在剛開始時, 我們需要先建立一個模擬器, 假設我們將它命名為ns
set ns [new Simulator]
接著,我們還需要建立一個檔案,以記錄模擬進行時的一些數據
set nf [open out.nam w] #打開out.nam以做寫入動作, 並以nf表示
$ns namtrace-all $nf #指定將ns所產生出要給nam用的data寫入nf
然後我們需要一個小函式來關閉trace file的寫入動作,並開啟NAM
至於實際上函式內是怎麼運作的現在可以先不用管,
我們主要知道他是用來做什麼就好了
然後,我們借由下面這種方式來指定模擬時間要跑多久
$ns at 5.0 "finish" #也就是說, ns 跑到第5秒時,執行finish這支函式
$ns run #開始跑
上述是要做網路模擬時,TCL檔裡基本應該要有的一些組成,
可以把他當成template, 以後的程式就從這邊開始寫
接下來我們需要建立一些網路結構中的節點:
set n0 [$ns node]
set n1 [$ns node]
.
.
基本上,節點都是以這樣的方式來宣告, 前面n0, n1為該節點的名稱
那麼,假設我們要連接某兩個節點,可以這樣寫:
$ns duplex-link $n0 $n1 1Mb 10ms DropTrail
也就是說,我們將n0, n1兩個節點以duplex-link的方式連接,
這個Link的頻寬是1 Mb, 10ms我不確定..
然後Queue的管理是採Droptrail的方式
所謂DropTrail是指接收方收到封包後是先暫存在Queue裡, 當收到的封包太多(超過Queue的長度)
就拒絕接下來的封包,也就是"去尾", 直到Queue裡的資料減少時再慢慢接收後來的封包
節點跟拓樸結構宣告完後,我們需要宣告一些事件來讓節點間有互動:
|
上述程式碼是指建立一個UDP的事件(命名為udp0), 並將其附加在n0上
然後宣告一個CBR traffic generator, 封包大小為500 bytes,
每隔0.005秒傳送一個封包(也就是一秒200個),然後附加在udp0這個事件上
另一部分, 我們宣告一個事件null0, 附加在n1上
set null0 [new Agent/Null]
$ns attach-agent $n1 $null0
再來這段程式碼就是重頭戲了
$ns connect $udp0 $null0
這段程式碼是表示說:我們把udp0這個事件跟null0這個事件做連接,
以達成封包的傳送動作。
咦?是不是哪裡怪怪的,為什麼不是n0跟n1做連接,而是兩個事件做連接??
這部份是ns模擬中,一個很重要的觀念:
In ns, data is always being sent
from one 'agent' to another.
from one 'agent' to another.
也就是說,
如果我們要將資料由n0傳給n1
我們需要建立一隻函式是用來將資料從n0傳出去的;
並建立另外一隻函式,是要接收資料給n1的
最後就是決定在模擬中什麼時候要開始傳封包,什麼時候結束傳封包了
$ns at 0.5 "$cbr0 start" $ns at 4.5 "$cbr0 stop"
上述就是該開始學習如何用TCL做網路模擬時的一些觀念跟介紹
我主要是參考 http://www.isi.edu/nsnam/ns/tutorial/ 裡
的 IV. The first Tcl script 這個part
的 IV. The first Tcl script 這個part
但我對於這部分也是剛起步不久...所以並不保證上面所說完全正確,
後續我了解更多後會再回來檢視這篇的內容:)
--
這邊是這篇裡所提到部份的完整程式碼, 有需要可以下載來跑跑看
全站熱搜