2007.07.07
首先將NS2模擬的架構做簡單的介紹:
(1)使用TCL將網路環境建置起來,做為NS2模擬的腳本
(2)執行模擬後會產生out.tr(模擬過程記錄檔)和out.nam(NAM紀錄檔)
(3)利用out.tr的紀錄做分析,經由AWK語言的撰寫,算出我們需要的網路數值分析
(4)將AWK運算的結果存檔,使用gnuplot工具將數據轉換成我們要的型式,以便分析
模擬的第一步就是先建立script腳本,以下我們用簡單的例子將兩端點的拓樸圖建置起來:
█ 網路概況:兩端點從n0送封包到n1,頻寬為1Mbps、傳遞延遲10秒、使用DropTail佇列機制傳輸
*兩端點UDP傳輸拓樸圖
# End-to-End.tcl
# 產生一個模擬的物件
set ns [new Simulator]
# 建立一個NAM trace file(模擬過程記錄檔)
set nf [open out.nam w] # 建立out.nam檔案,用nf當參數去寫入
$ns namtrace-all $nf # namtrace-all 為nam寫入的格式
# 建立一個trace file,用來記錄封包傳送的過程
set nd [open out.tr w] # 用來記錄封包傳送過程
$ns trace-all $nd # tr檔主要是給awk程式去做數據分析
# 定義結束的程序
proc finish {} {
global ns nf nd # 取用外部變數ns nf nd
$ns flush-trace # 沖刷使用過的記憶體
#關閉記錄檔
close $nf # nf為out.nam
close $nd # nd為out.tr
exec nam out.nam & # 將記錄檔用NAM顯示出來
exit 0
}
# 產生兩個網路節點:nl, n2
set n0 [$ns node]
set n1 [$ns node]
$ns duplex-link $n0 $n1 1Mb 10ms DropTail # duplex-link 將2個節點連結
# n0 - n1 有1Mbps 的頻寬
# 傳遞延遲時間10ms
# DropTail (FIFO傳送方式)
set udp0 [new Agent/UDP] # 建立 UDP 連線
$ns attach-agent $n0 $udp0 # UDP 連線起始端
set null0 [new Agent/Null]
$ns attach-agent $n1 $null0 # UDP 終端
$ns connect $udp0 $null0 # udp0 和 null0 建立虛擬連結
# 讓封包可以從 n0 傳送到 n1
set cbr0 [new Application/Traffic/CBR] # cbr 會以固定速率傳送
$cbr0 set packetSize_ 500 # cbr0物件上packetSize_有500 bytes
$cbr0 set interval_ 0.005 # 每個封包 0.005秒就會被傳送
$cbr0 attach-agent $udp0 # 將封包設在udp上
$ns at 0.1 "$cbr0 start" # 0.1秒開始傳送
$ns at 2 "$cbr0 stop" # 2秒時結束傳送
$ns at 2.1 "finish" # 在5秒的時候呼叫finish function
$ns run # 執行模擬
=================================================================
再來將建置較複雜的TCP與UDP同時傳輸,節點也增加至四個
█ 網路概況:這網路包含兩個傳輸節點s1和s2,路由器r,和資料接收端d
s1到r之間與s2到r之間的網路頻寬都是2Mbps,傳遞延遲10秒
網路架構的瓶頸在r到d之間,頻寬為1.7Mbps,傳遞延遲20秒
全部佇列管理機制都採用DropTail,且r到d的最大佇列長度
(queue limit)為10個封包長度。
// TCP連線部分
在s1到d之間會有一條FTP連線
FTP應用程式是架構在TCP傳輸上,因此在來源端s1使用
TCP agent來產生TCP封包,目的端d使用TCPSink agent 來產生
sink來接受TCP封包,並產生ACK封包回傳。
// UDP連線部分
在s2到d之間有一條固定的傳輸速率的連線CBR(Constant Bit Rate)
CBR應用程式是架構在UDP傳輸上,因此來源端s2使用
UDP agent來產生UDP封包,目的端d使用Null agent 來產生
sink來接受UDP封包。
FTP的傳送速度1.0秒開始傳送,4.0結束。TCP封包大小為1Kbytes
CBR的傳送速度為1Mbps,每個封包大小是1Kbytes,0.1秒開始傳送
4.5結束傳輸。
*TCP/UDP網路拓樸
#TCP-UDP.tcl
# 產生一個模擬的物件
set ns [new Simulator]
# 針對不同的資料流定義不同的顏色,這是要給NAM用的
$ns color 1 Blue
$ns color 2 Red
# 建立一個NAM trace file(模擬過程記錄檔)
set 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 # nf為out.nam
close $nd # nd為out.tr
exec nam out.nam & # 將記錄檔用NAM顯示出來
exit 0
}
# 產生兩個網路節點, s1的id為0, s2的id為1
set s1 [$ns node]
set s2 [$ns node]
# 產生路由器節點, r的id為2
set r [$ns node]
# 產生資料接收節點, d的id為3
set d [$ns node]
# 把節點連接起來
# s1-r的鏈路具有2Mbps的頻寬, 10ms的傳遞延遲時間, DropTail 的佇列管理方式
# s2-r的鏈路具有2Mbps的頻寬, 10ms的傳遞延遲時間, DropTail 的佇列管理方式
# r-d的鏈路具有1.7Mbps的頻寬, 20ms的傳遞延遲時間, DropTail 的佇列管理方式
$ns duplex-link $s1 $r 2Mb 10ms DropTail #雙工
$ns duplex-link $s2 $r 2Mb 10ms DropTail
$ns duplex-link $r $d 1.7Mb 20ms DropTail
# 設定r到d之間的 Queue Limit size 為 10 個封包大小
$ns queue-limit $r $d 10
# 設定節點的位置,這是要給 NAM 用的
$ns duplex-link-op $s1 $r orient right-down
$ns duplex-link-op $s2 $r orient right-up
$ns duplex-link-op $r $d orient right
# 觀測 r 到 d 之間 Queue 的變化,這是要給 NAM 用的
$ns duplex-link-op $r $d queuePos 0.5
# 建立一條 TCP 的連線
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $s1 $tcp # TCP封包傳送 TCP 使用 sink
set sink [new Agent/TCPSink]
$ns attach-agent $d $sink # TCP封包接收
$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 $s2 $udp # UDP 使用 null
set null [new Agent/Null]
$ns attach-agent $d $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 $s1 $tcp ; $ns detach-agent $d $sink"
#以上等於:
#======================================|
#$ns at 4.5 "$ns detach-agent $s1 $tcp"|
#$ns at 4.5 "$ns detach-agent $d $sink"|
#======================================|
#在模擬環境中,5秒後去呼叫 finish fuction 來結束模擬
#(模擬環境中的5秒不等於實際環境的5秒)
$ns at 5.0 "finish"
#執行模擬
$ns run
呼~以上是TCL腳本設定的介紹,利用TCP與UDP來當作第一個實驗
接下來是AWK的數值分析撰寫,我們下期再見!!
留言列表