http://www.pixnet.net/NS2lab

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的數值分析撰寫,我們下期再見!!

創作者介紹
創作者 NS2lab 的頭像
NS2lab

『網路節點模擬』 研究日誌

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


留言列表 (2)

發表留言
  • fengying
  • 在今天我又發現了一個TCL的限制
    就是註解不能與指令同一行
    我已經受夠了
    TCL!
  • Ruei
  • 註解和TCL可以是同一行只要在程式和註解之間加個 ; 就可以了