2007.08.06
隨機變數的應用。題目為兩個路由器,每個路由器下面各有三個節點,路由器之間的鏈路我的設定是 ( 1Mb 100ms DropTail ),路由器與節點間的鏈路我的設定是 ( 10Mb 10ms DropTail ),節點用 Tcp 通訊協定去傳輸資料,並利用隨機變數隨機去產生各個節點開始傳送資料的時間,每個節點傳送資料的時間都為五秒,開始時間限制為 0-1 秒之間。
程式碼如下:
set ns [new Simulator]
# 建立物件
set nd [open out.tr w]
$ns trace-all $nd
# 開啟一個 trace file,用來紀錄封包傳送的過程
set nf [open out.nam w]
$ns namtrace-all $nf
# 開啟一個 NAM trace file,用來觀察動態模擬過程
$ns color 1 Blue
$ns color 2 Red
$ns color 3 Green
# 設定三條 color
set nflow 3
# 設定 TCP Flow 數目
set r1 [$ns node]
set r2 [$ns node]
# r1.r2 用來當路由器
$ns duplex-link $r1 $r2 1Mb 100ms DropTail
$ns duplex-link-op $r1 $r2 orient right
# 建立實體鏈路以及位置
$ns queue-limit $r1 $r2 10
# 設定 queue limit 為 10 個 Packet
for {set i 1} {$i <= $nflow} {incr i} {
# 設定 TCP 來源節點 && TCP 目的節點
# 建立來源和目的節點與路由器的鏈路
set s($i) [$ns node]
# 來源端 s(0) s(1) s(2) s(3) 節點
set d($i) [$ns node]
# 目的端 d(0) d(1) d(2) d(3) 個節點
$ns duplex-link $s($i) $r1 10Mb 10ms DropTail
$ns duplex-link $r2 $d($i) 10Mb 10ms DropTail
# 建立實體鏈路
}
# =============== 設定節點位置 ===============
$ns duplex-link-op $s(1) $r1 orient right-down
$ns duplex-link-op $s(2) $r1 orient right
$ns duplex-link-op $s(3) $r1 orient right-up
# ============================================
$ns duplex-link-op $r2 $d(1) orient right-up
$ns duplex-link-op $r2 $d(2) orient right
$ns duplex-link-op $r2 $d(3) orient right-down
# =============== 設定節點位置 ===============
for {set i 1} {$i <= $nflow} {incr i} {
# 建立 TCP 的連線,並在 TCP 連線上建立 FTP 應用
set tcp($i) [new Agent/TCP]
set sink($i) [new Agent/TCPSink]
# 建立 TCP && TCPSink
$ns attach-agent $s($i) $tcp($i)
$ns attach-agent $d($i) $sink($i)
$ns connect $tcp($i) $sink($i)
# node 與通訊協定兩兩 attach 起來,最後通訊協定再做 connect
set ftp($i) [new Application/FTP]
$ftp($i) attach-agent $tcp($i)
$ftp($i) set type_ FTP
# 建立 FTP 應用,並且去跟 TCP 做 attach
$tcp($i) set class_ $i
# TCP 封包設定顏色,比較好區別
}
set rng [new RNG]
# 隨機變數應用,目的讓三個 Flow 在隨機的時間開始傳送封包 [ 0-1秒之間 ]
$rng seed 0
# 設定種子為 0 就像是每次執行都擷取不同種子
# ======== Uniform Distribution ========
set RVstart [new RandomVariable/Uniform]
$RVstart set min_ 0
$RVstart set max_ 1
$RVstart use-rng $rng
# ======== Uniform Distribution ========
for {set i 1} {$i <= $nflow} {incr i} {
# 由亂數產生器去決定每一條 Flow 的起始時間
set startT($i) [ expr [$RVstart value] ]
# 設定開始的時間
puts "startT($i) $startT($i) sec"
# 顯示在視窗上
set endT($i) [ expr $startT($i)+5 ]
# 設定結束時間為開始時間加五秒
puts "endT($i) $endT($i) sec\n"
# 顯示在視窗上
# 在指定時間內讓 ftp 開始傳輸,每條 flow 傳輸五秒 data
$ns at $startT($i) "$ftp($i) start"
$ns at $endT($i) "$ftp($i) stop"
}
# 注意,上面註解當執行程式時不能加在裡面,有 error
proc finish {} {
# 結束的副函式
global ns nf nd
$ns flush-trace
close $nf
close $nd
exec nam out.nam &
exit 0
}
$ns at 7.0 "finish"
# 結束
$ns run
# 執行
歡迎對於 NS2 有研究或見解的同學、朋友可以一起討論 by Yo PM 04:20
留言列表