NS-2
Introduction A object-oriented, discrete event driven network simulator targeted at networking research. developed at UC Berkely written in C++ and OTcl. Free Open Source UNIX/Windows
NS-2 package Tcl8.4.5- TCL語言之編譯器 Tk8.4.5- TK圖形化模組 OTcl-1.8- 物件導向TCL編譯器 Tclcl-1.5- 連接TCL語言與C++語言之介面 NS2-2.7- 網路模擬器 NAM-1.10- 將NS2模擬出結果(文字檔)以圖形化介面顯示出來。
NS-2 Architecture OTcl:network topology C++:Network Component Event Scheduler
Tcl, Otcl, Tclcl Tcl: Tool command language Otcl: Object-Oriented Tcl Scripting language Otcl: Object-Oriented Tcl Tclcl: 連接TCL語言與C++語言之介面
NS2、TCP/IP、OSI 7-Layer Network Component Agent(TCP,UDP,…) Traffic Generator(FTP, CBR,…) Node Link
Why C++ & Otcl 用 C++ : // 注重時間, 速度 效能 用 OTcl : // 注重彈性, 常改變 處理封包傳送 更改一些底層或新增 protocols 之類的 C++ Class 不常更動, 執行速度快 用 OTcl : // 注重彈性, 常改變 負責設定檔部分 運作已編譯過的 C++ Objects 常會更動, 執行時需花一點直譯的時間
Discrete Event Scheduler time_, uid_, next_, handler_ head_ -> head_ -> handler_ -> handle() insert time_, uid_, next_, handler_
UI – NAM, XGraph Nam nam < trace-file > Xgraph 一個能將 NS2 模擬結果視覺化顯示出來的工具, 他能顯示封包的流向和 Drop 等資訊. 執行方式: nam < trace-file > Xgraph 能依據檔案的包含x軸和y軸資訊,就可以根據這些資訊, 畫出曲線圖 Ex: x 軸 y 軸 $time $packet_drop_count
HOW TO SIMULATE 撰寫Tcl控制文件 執行ns 執行nam 利用 Tcl 語言撰寫控制 NS2 內部模組之程式。(副檔名 .tcl ) 執行ns Ex: # ./ns xxx.tcl 執行nam Ex: # ./nam xxx.nam
Tcl 基本語法 cmd arg arg arg 程式裡面, 所有命令看到的參數都是字串 註解字元: (放在一個命令最前面的) # 第一個字是命令名稱, 其餘的是命令參數 程式裡面, 所有命令看到的參數都是字串 註解字元: (放在一個命令最前面的) # 變數代換字元: $ 數學/邏輯 運算式 以 expr 處理 …[…] parser 會先處理, 並將結果做前面參數
Tcl 基本語法(cont.) # 設定 x 變數,x 值為100(注意這100是字串) set x 100 # 透過 expr 將 $x $y 當成數字作數學運算, 並設定 z 變數為300 set z [expr $x+$y] # 設定 a = b = 100, 此時 b 已被代換成 100 set a [set b 100] # 設定一個陣列叫 array_, 並把 array_(1) 的值設為27 set array_(1) 21
Tcl 流程控制 While For If - else set b 0 set i 100 while {$i > = 0} { set b [expr $b+$i] incr i -1 } For for {set i 100} {$i > =0} {incr i -1} { … If - else if { $k>4 } { puts " k > 4 " } else { puts " k < = 4 "
Tcl 副程式 # 範例: (計算x階乘的procedure) proc fac {x} { if {$x < 0} { error "Invalid argument $x: must be a positive integer" } elseif {$x < = 1} { return 1 } else { return [expr $x * [fac [expr $x-1]]] }
NS-2語法 #目的在創造一個 NS2 模擬的物件 #1. 初使化封包格式( packet format) #2. 創造一個Scheduler set ns [new Simulator] #建立一個名稱叫做 node_ 的 Node set node_ [$ns node] #建立一條 Node n0 到 n1 的一條實體連結, 並設定頻寬、delay 時間和 queue 的 type $ns simplex-link < n0 > < n1 > < bandwidth > < delay> <queue_type> EX: $ns duplex-link $n0 $n1 2Mb 20ms DropTail
NS-2語法(Cont.) #將一個 agent(protocol)結合到一個 node 上, Node 預設的 agent 是 Null. $ns attache-agent <node> <agent> # 創造一個TCP的Agent set tcp [new Agent/TCP] # TCP agent 結合到 node(n0) $ns attach-agent $n0 $tcp #光是 TCP 無法產生任何 Traffic, 所以再建立一些 application #的 Protocol 於 TCP 上(如 FTP、Telnet) set ftp [new Application/FTP] $ftp attach-agent $tcp
NS-2語法(Cont.) #在兩個 agent 中建立一條 logical 的連結, #不同實體連結, 如 agent1 和 agent2 之間可能相隔好幾個點. $ns connect < agent1 > < agent2 > #將 ns2 模擬的內容寫回到在 < tracefile > 檔案中 $ns trace-all < tracefile > #將ns2 模擬的內容寫回到在 < tracefile > 檔案 , #以讓nam 上去顯示模擬畫面 $ns namtrace-all < tracefile >
NS-2語法(Cont.) #在特定的時間 < time > 讓這個事件 < event > 被執行 $ns at < time > < event > # EX:在4.5秒的時候執行 ftp $ns at 4.5 "$ftp start" # EX:在5秒時候執行我們自己所定義的 finish 函式 $ns at 5.0 "finish“ #開始執行 scheduler $ns run
Simple simulation example
Analysis trace_file