2007.07.22

這是我這次報告部分,這個其實之前峰峰就有貼過了,不過既然是負責這部份,所以我盡量把註解更『搞話』了一點,盡可能的說得詳細一點。這個模擬可以看到的是 tcp-udp 傳送封包的過程,並且使用 DropTail 佇列方式時產生的封包遺失的過程;當 cbr 封包流動一段時間後, ftp 封包開始流出來跟 cbr 搶頻寬,所以會發生部份封包停在佇列等待傳送,然後又限定了佇列封包減小,所以導致累積比較快滿,累積滿了後就會開始丟棄一些封包。

以下就是程式碼分析,不過有些地方不是很懂...。

  set ns [new Simulator]
# 產生一個模擬的物件
# 之後會以 ns 這個變數去產生節點以及做許多設定,[new Simulator] 這算是固定寫法吧!

  $ns color 1 Blue
  $ns color 2 Red
# 告訴 ns 物件去定義兩個顏色 1 是藍色、 2 是紅色
# 針對不同的封包定義不同的顏色,這是之後 NAM 產生的圖示時會用到
# 一方面也是為了好可以區分兩個節點的封包

  set nf [open out.nam w]
# 設定一個 nf 物件來當作這個事件的變數
# open 是開啟一個檔,在這裡是開啟一個 NAM trace file
# .nam 檔就是要模擬出圖示用的
# w 是寫入的意思,在這是要寫入到 "out.nam" 此檔案

  $ns namtrace-all $nf
# 此指令是要使用 nam 來觀察動態模擬過程,假如沒有要觀察的話就可以不用寫

  set nd [open out.tr w]
# 設定一個 nd 物件來當作這個事件的變數
# open 是開啟一個檔,在這裡是開啟一個 trace file,用來記錄封包傳送的過程
# .tr 檔就是之後產生的數據要給 awk 做分析用
# w 是寫入的意思,在這是要寫入到 "out.tr" 此檔案

  $ns trace-all $nd
# 此指令是要使用 trace file 來做效能分析,假如沒有要分析就可以不用寫

  proc finish {} {
# 定義一個結束的程序,結束程式模擬的一個副函式

          global ns nf nd
        # golbal 是要宣告全域變數 ns nf nd 這三個來裡面使用
        # 像是 ns nf nd 這些物件是在外面宣告的,如今要拿到這個副函式使用
        # 就要像這樣子去宣告才可以使用吧!?
       
          $ns flush-trace
        # 不知道作用
       
          close $nf
          close $nd
        # 關閉檔案,有開檔就要有關檔,就跟 c 語言一樣,不過似乎也可以不用關閉
       
          exec nam out.nam &
        # 以背景執行的方式去執行 NAM
       
          exit 0
        # 離開模擬程式
}
# 注意! 經過本人測試程式碼的結果,上面的 finish 副函式會出問題,至於詳細問題原因不曉得,解決方法是把註解都弄掉....囧 !?
# 似乎是註解的關係吧,我猜應該是限制什麼指令後面不能再撰寫了,可是我測試不出來,差不多都要全部註解刪掉才有辦法跑出模擬。

  set n0 [$ns node]
  set n1 [$ns node]
  set n2 [$ns node]
  set n3 [$ns node]
# 產生網路節點,利用 ns 物件下去宣告節點

  $ns duplex-link $n0 $n2 2Mb 10ms DropTail
  $ns duplex-link $n1 $n2 2Mb 10ms DropTail
  $ns duplex-link $n2 $n3 1.7Mb 20ms DropTail
# 利用 duplex-link 指令來讓兩個節點兩兩連接,因為節點是利用 ns 物件去設定的
# 所以前面要有 $ns 開頭,接著 duplex-link 後面接的就是所要連接的兩節點
# 再來是可以設定兩兩的網路頻寬(ex→ 2Mb)
# 接著是設定延遲時間(ex→ 10ms)
# 最後是設定佇列管理機制,在這裡是使用 DropTail
# 還要探討 SFQ
 
  $ns queue-limit $n2 $n3 10
# 設定 n2 到 n3 之間的 Queue Size 為 10 個封包大小
# 此設定是為了讓這個模擬在 N2-N3 的地方有阻礙,這樣 DropTail 才看的出效果
# 假如沒有設定,則會使用 ns2本身程式的 default 值 50
 
  $ns duplex-link-op $n0 $n2 orient right-down
  $ns duplex-link-op $n1 $n2 orient right-up
  $ns duplex-link-op $n2 $n3 orient right
# 設定兩兩節點的位置,這是為了在 NAM 裡排定節點位置
# 第一行就是要 n0 跟 n2 以西北-東南方向連結 (\)
# 第二行就是要 n1 跟 n2 以東北-西南方向連結 (/)
# 第三行就是要 n2 跟 n3 以左右方向連結 (-)

  $ns duplex-link-op $n2 $n3 queuePos 0.5
# 觀測 n2 到 n3 之間 queue 的變化,這是要給 NAM 用的
# 此指令還不太懂作用
 
  set tcp [new Agent/TCP]
# 創造一個 TCP 的 agent,每個 node 本身預設的 agent 是 null
# 可以利用這個物件去跟 node 做連接,也就是此 node 將要使用的通訊協定

  $tcp set class_ 2
# 不知道作用

  $ns attach-agent $n0 $tcp
# attach-agent 就是要讓節點去跟通訊協定連結,所以是 n0-node 使用 Tcp 的通訊協定

  set sink [new Agent/TCPSink]
# 設定一個 sink 變數,這是要來當 Tcp 的接收端,用來接收傳送端的資料
# 並且會做回應 Ack

  $ns attach-agent $n3 $sink
# 在這裡是要讓 n3 當接收端,所以 n3 才要連結 sink

  $ns connect $tcp $sink
# 這裡是要讓 Tcp 還有 Sink 連接起來
# 也就是連接 sink 的 node 以及連接 tcp 的 node 的兩節點連接起來
# 在這跟 attach-agent 有點不太一樣
# connect 連接的兩個點不一定只有兩個,說不定中間會有夾雜很多 node

  $tcp set fid_ 1
# 當使用 NAM 顯示時,設定 TCP 的連線封包會以藍色表示
# "1" 就是之前設定 color 的 1

  set ftp [new Application/FTP]
# 建立一個 ftp 連線,因為 FTP 連線是以 Tcp 協定下去 run
# 因為只有建立 Tcp 協定沒有用,還要有在 Tcp 協定上的運用(ex→ ftp)

  $ftp attach-agent $tcp
# 設定 ftp 為 Tcp 通訊協定

  $ftp set type_ FTP
# 不知道作用

  set udp [new Agent/UDP]
# 創造一個 Udp 的 agent,每個 node 本身預設的 agent 是 null
# 可以利用這個物件去跟 node 做連接,也就是此 node 將要使用的通訊協定

  $ns attach-agent $n1 $udp
# n1-node 使用 Udp 的通訊協定

  set null [new Agent/Null]
# 一樣要設定一個接收端,就像之前的 sink
# Tcp - TcpSink 、 Udp - Null
# 有傳送端就要有接收端,至於是不是一定要這樣設定我不確定

  $ns attach-agent $n3 $null
# 在這裡也是一樣要讓 n3 當接收端,所以也要連結 null

  $ns connect $udp $null
# 這裡是要讓 Udp 還有 null 連接起來
# 也就是連接 null 的 node 以及連接 Udp 的 node 的兩節點連接起來

  $udp set fid_ 2
# 當使用 NAM 顯示時,設定 UDP 的連線封包會以紅色表示
 
  set cbr [new Application/Traffic/CBR]
# 建立一個 cbr 連線,因為 cbr 連線會是以 Udp 通訊協定下去 run
# 因為只有建立 Udp 連線沒有用,還要有在 Udp 通訊協定上的運用(ex→ cbr)

  $cbr attach-agent $udp
# 設定 cbr 為 Udp 通訊協定

  $cbr set type_ CBR
# 不知道作用

  $cbr set packet_size_ 1000
# cbr 資料的封包大小為 1000

  $cbr set rate_ 1mb
# cbr 傳送速率 1mb

  $cbr set random_ false
# 隨機關掉 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"
# 設定 FTP 和 CBR 封包傳送的開始和結束時間

  $ns at 4.5 "$ns detach-agent $n0 $tcp ; $ns detach-agent $n3 $sink"
# 結束 TCP 的連線
# 還不太懂為什麼要這樣撰寫

  $ns at 5.0 "finish"
# 在模擬環境中的 5 秒時去呼叫 finish 副函式來結束模擬

  $ns run
#執行模擬

參考資料:
http://140.116.72.80/~smallko/ns2/question0526.htm
http://vaplab.ee.ncu.edu.tw/chinese/pcchang/course2004b/comsp/network/3.3.htm
 

歡迎對於 NS2 有研究或見解的同學、朋友可以一起討論  by Yo PM 3:28

arrow
arrow
    全站熱搜

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