NS2 教學 1
2 執行目錄底下 setup.exe 安裝 Cygwin Cygwin 是許多自由軟體的集合, 最初由 Cygnus Solutions 開發, 用於各種版本的 Microsoft Windows 上, 運行 UNIX 類系統 Cygwin 的主要目的是通過重新編譯, 將 POSIX 系統 ( 例如 Linux BSD, 以及其他 Unix 系統 ) 上的軟體移植到 Windows 上
3
4
5
6
XFree86-base XFree86-bin XFree86-prog XFree86-lib XFree86-etc make patch perl gcc gcc-g++ gawk gnuplot tar gzip 7
8
9
10 點選 進入 Cygwin
將 ns-allinone-2.27.tar.gz 移至 cygwin/home 的目錄底下 進入 cygwin 解壓縮指令 :tar xvfz ns-allinone-2.27.tar.gz 11
12 環境檔設定 透過文字編輯器修改 Cygwin 環境檔 (PSPad) export NS_HOME=/home/GG/ns-allinone-2.27 export PATH=$NS_HOME/tcl8.4.5/unix:$NS_HOME/tk8.4.5/unix:$NS_HOME/bin:$PATH export LD_LIBRARY_PATH=$NS_HOME/tcl8.4.5/unix:$NS_HOME/tk8.4.5/unix:$NS_HOME/otcl- 1.8:$NS_HOME/lib:$LD_LIBRARY_PATH export TCL_LIBRARY=$NS_HOME/tcl8.4.5/library
cd ns-allinone-2.27 進入子目錄./install ( 安裝 ) 13
startxwin.bat ns exp3.tcl 14
exp3.tcl 15
16 Tcl Tcl (Tool Command Language) 在 NS2 中主要用來描述腳本, 也就是用來描述模擬的網路環境和參數設定
NS2 簡單範例 exp3.tcl # 產生一個模擬的物件 set ns [new Simulator] # 針對不同的資料流定義不同的顏色, 這是要給 NAM 用的 $ns color 1 Blue $ns color 2 Red # 開啟一個 NAM trace fileset nf [open out.nam w] $ns namtrace-all $nf
# 開啟一個 trace file, 用來記錄封包傳送的過程 set nd [open out.tr w] $ns trace-all $nd # 定義一個結束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd # 以背景執行的方式去執行 NAM (The Network Animator) exec nam out.nam & exit 0 }
# 產生四個網路節點 set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node] # 把節點連接起來 $ns duplex-link $n0 $n2 2Mb 10ms DropTail $ns duplex-link $n1 $n2 2Mb 10ms DropTail $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail # 設定 ns2 到 n3 之間的 Queue Size 為 10 個封包大小 $ns queue-limit $n2 $n3 10 # 設定節點的位置, 這是要給 NAM 用的 $ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n1 $n2 orient right-up $ns duplex-link-op $n2 $n3 orient right
# 觀測 n2 到 n3 之間 queue 的變化, 這是要給 NAM 用的 $ns duplex-link-op $n2 $n3 queuepos 0.5 # 建立一條 TCP 的連線 set tcp [new Agent/TCP] $tcp set class_ 2 $ns attach-agent $n0 $tcp set sink [new Agent/TCPSink] $ns attach-agent $n3 $sink $ns connect $tcp $sink # 在 NAM 中,TCP 的連線會以藍色表示 $tcp set fid_ 1 # 在 TCP 連線之上建立 FTP 應用程式 set ftp [new Application/FTP] $ftp attach-agent $tcp $ftp set type_ FTP
# 建立一條 UDP 的連線 set udp [new Agent/UDP] $ns attach-agent $n1 $udp set null [new Agent/Null] $ns attach-agent $n3 $null $ns connect $udp $null # 在 NAM 中,UDP 的連線會以紅色表示 $udp set fid_ 2 # 在 UDP 連線之上建立 CBR 應用程式 set cbr [new Application/Traffic/CBR] $cbr attach-agent $udp $cbr set type_ CBR $cbr set packet_size_ 1000 $cbr set rate_ 1mb $cbr set random_ false
# 設定 FTP 和 CBR 資料傳送開始和結束時間 $ns at 0.1 "$cbr start" $ns at 1.0 "$ftp start" $ns at 4.0 "$ftp stop" $ns at 4.5 "$cbr stop # 結束 TCP 的連線 ( 不一定需要寫下面的程式碼來實際結束連線 ) $ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink # 在模擬環境中,5 秒後去呼叫 finish 來結束模擬 ( 這樣要注意模擬環境中 # 的 5 秒並不一定等於實際模擬的時間 $ns at 5.0 "finish # 執行模擬 $ns run
執行結果
Awk 運用 (awk 主要用來顯示模擬過程記錄檔進而做數值分析 一二三四五六七八九十十一十二 event Time From node To node Pkt type Pkt size Flags Fid Src addr Dst addr Seq num + 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0 Pkt id 當 awk 讀入資料列後, 會把每個欄位的值存入欄位變數 欄位變數 意義 $0 為一字串, 其內容為目前 awk 所讀入的資料列. $1 代表 $0 上第一個欄位的資料. $2 代表 $0 上第二欄個位的資料.
指令 awk f out.tr 25
Awk 範例 delay.awk BEGIN { # 程式初始化, 設定一變數以記錄目前最高處理封包的 ID highest_packet_id = 0; } { action = $1; time = $2; node_1 = $3; node_2 = $4; type = $5; flow_id = $8; node_1_address = $9; node_2_address = $10; seq_no = $11; packet_id = $12;
# 記錄目前最高的 packet ID if ( packet_id > highest_packet_id ) highest_packet_id = packet_id; # 記錄封包的傳送時間 if ( start_time[packet_id] == 0 ) start_time[packet_id] = time; # 記錄 CBR (flow_id=2) 的接收時間 if ( flow_id == 2 && action!= "d" ) { if ( action == "r" ) { end_time[packet_id] = time; } } else { # 把不是 flow_id=2 的封包或者是 flow_id=2 但此封包被 drop 的時間設為 -1 end_time[packet_id] = -1; } } END { # 當資料列全部讀取完後, 開始計算有效封包的端點到端點延遲時間 for ( packet_id = 0; packet_id <= highest_packet_id; packet_id++ ) { start = start_time[packet_id]; end = end_time[packet_id]; packet_duration = end - start; # 只把接收時間大於傳送時間的記錄列出來 if ( start < end ) printf("%f %f\n", start, packet_duration); } }
執行方法 : ($ 為 shell 的提示符號 ) $awk -f measure-delay.awk out.tr 若是要把結果存到檔案, 可使用導向的方式 ( 把結果存到 cbr_delay 檔案中 ) $awk -f measure-delay.awk out.tr > cbr_delay
29 圖形模式 輸入 gnuplot
plot cdr_delay 30