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

arrow
arrow
    全站熱搜

    NS2lab 發表在 痞客邦 留言(0) 人氣()