2008年8月29日 星期五

NS-2 - UDP Agent

############################################################
# set option value

# 設定參數
############################################################

#利用陣利設定參數
set opt(trace) out.nam                                        ;# 設定檔案參數
set opt(nodes) 10                                             ;# 節點個數
set opt(rtproto) DV                                           ;# 路由協定
set opt(src.packet.size) 800                                  ;# 來源端封包大小
set opt(src.packet.int) 0.5                                   ;# 來源端封包間隔
set opt(udp.MMS) 100                                          ;# Max Sefment Size for UDP afent
set opt(udp.dest.addr) 1                                      ;# 還不知道這個怎麼用?
set opt(udp.dest.port) 80
set opt(udp.ttl) 6                                            ;# Time-To-Live

############################################################
# main program
############################################################
set ns [new Simulator]                                        ;# 在檔案一開始會先建立一個的模擬環境
$ns rtproto $opt(rtproto)                                     ;# 設定路由協定

set nf [open $opt(trace) w]                                   ;# 開啟一個可寫入的檔案out.nam
$ns namtrace-all $nf                                          ;# 將所有模擬的資料都寫入$nf這個檔案中
$ns use-newtrace                                              ;# Use new trace format 使用新的trace format

proc finish {} {                                              ;# 新增一個procedure "finish"
  global ns nf opt                                            ;# 讓這個proc能讀取這個scrpit的其他變數,其中opt是陣列,只要global這一個opt,陣列其它元素就可以使用
  $ns flush-trace                                             ;# 將所有的trace object 寫入 buffer
  close $nf                                                   ;# 關掉out.nam檔
  exec nam $opt(trace) &                                      ;# 透過背景執行nam來開起out.nam檔
  exit 0                                                      ;# 離開
}

for {set i 0} {$i < $opt(nodes)} {incr i} {
  set n($i) [$ns node]                                        ;# 建立節點
}

for {set i 0} {$i < $opt(nodes)} {incr i} {                   ;# 建立一個環狀的topology
$ns duplex-link $n($i) $n([expr ($i+1)%$opt(nodes)]) 1Mb 10ms DropTail
}

set udp0 [new Agent/UDP]                                      ;# 新增一個udp,第一個node裝UDP Agent
$udp0 set packetSize_ $opt(udp.MMS)                           ;# Max Segment Size for UDP agent
$udp0 set dst_addr_ $opt(udp.dest.addr)                       ;# 目的地IP
$udp0 set dst_port_ $opt(udp.dest.port)                       ;# 目的地Port number
$udp0 set ttl_ $opt(udp.ttl)                                  ;# Time-To-Live

$ns attach-agent $n(0) $udp0                                  ;# 在$n(0)上裝上$udp0

set cbr0 [new Application/Traffic/CBR]                        ;# 先建立一個cbr,然後在udp上裝CBR
$cbr0 set packetSize_ $opt(src.packet.size)                   ;# 設定CBR封包大小
$cbr0 set interval_ $opt(src.packet.int)                      ;# 設定CBR發射封包的間隔時間
$cbr0 attach-agent $udp0                                      ;# 把cbr0架在udp0上,CBR應用程式是在UDP協定上運作的

set null0 [new Agent/Null]                                    ;# 先建立一個NULL特性,在第3個node上裝Null Agent,NULL Agent是用來drop packet的
$ns attach-agent $n(2) $null0                                 ;# 把null0建立在n(2)上

$ns connect $udp0 $null0                                      ;# 將來源端和目的端連結起來

$ns at 0.5 "$cbr0 start"                                      ;# 在第0.5秒開始送封包
$ns rtmodel-at 1.5 down $n(1)                                 ;# 在第1.5秒$n(1)停掉所有的interface
$ns rtmodel-at 3.5 up $n(0) $n(1)                             ;# 在第2.5秒,將$n(0)和$n(1)的介面up
$ns rtmodel-at 5.5 up $n(1) $n(2)                             ;# 在第2.5秒,將$n(1)和$n(2)的介面up
$ns at 9.5 "finish"                                           ;# 在第9.5秒,結束模擬

$ns run                                                       ;# 開始執行模擬

沒有留言: