NS2 – TCP/IP Simulation How-Wei Wu
網際網路所提供的傳輸服務 目前網際網路所提供的傳輸服務,就服務的性質而言可分成兩種 : (1) 連接導向的可靠性傳輸服務 (Connection oriented reliable service),這個服務主要由TCP (Transmission Control Protocol) 來提供。 (2) 非連接的不可靠性傳輸服務 (Connection-less, unreliable data transfer),這部份則是由UDP (User Datagram Protocol)來提供。
TCP提供的服務 1. 可靠的資料傳送(Reliable data transfer)服務:TCP藉由回應 (Acknowledge) 和重送的機制提供可靠性的服務。可靠的資料傳送意味著應用程式可依賴此服務,該服務可確保資料能依照順序地被傳送接收,不會有錯誤發生。 2. 流量控制(Flow control):確保連線的兩端不會因為太快傳送過量的封包而淹沒了另一端。 3. 擁塞控制(Congestion control):當路由器發生擁塞時,封包容易因為緩衝區溢滿而被丟棄,擁塞控制可以避免傳送端傳送太多資料到網路上造成網路擁塞。
UDP提供的服務 TCP與UDP都是透過IP封包來傳輸資料,在開始傳送資料之前,TCP的Client行程會與Server行程執行建立連線的動作,而UDP則不需進行此一動作。就如前面所述,目前網際網路提供給應用程式的服務只有連接導向的可靠性服務與非連接的不可靠性服務,而不管是TCP或UDP,基本上都沒有提供對與頻寛與時間延遲的最低保證。
網路協定和分層的概念 在瞭解了網路可能提供的服務後,接著我們就來看看目前網路所使用的分層方式,一般稱之為「網路通訊協定分層堆疊」(Internet protocol stack)。目前網際網路所使用的分層架構由上而下分別是:應用層、傳輸層、網路層、連結層以及實體層,每一層都有其各自使用的通訊協定。
Internet protocol stack
傳輸層的主要功能 對於應用層而言,傳輸層主要的功能就是在應用程式之間提供邏輯的連線。所謂的邏輯連線是指在應用程式的傳送端與接收端之間其實並沒有一條實際的連線,但是透過傳輸層所提供的功能,應用程式可以假設傳送端與接收端之間有一條連線存在,應用程式可以透過傳輸層協定將資料送出。
End-to-End的服務模型 目前傳輸層所使用的協定主要有兩種-TCP和UDP,應用程式的通訊過程可用下面簡單的圖例來表示:
Ns-2的參數預設值 Ns-2的參數預設值存放在ns-default.tcl這個檔案中。這個檔案的存放位置是在ns-allinone-2.XX/ns-2.XX/tcl/lib/這個目錄下,欲知Ns-2的預設值設定,可以將這個檔案叫出來看看: $ cd ns-allinone-2.31/ns-2.31/tcl/lib/ $ cat ns-default.tcl | more
模擬參數設定 在Ns-2中,Node可以用來表示一個主機(Host)、路由器(Router)或交換器(Switch)。Node產生的方法如下($ns為Ns-2產生的模擬物件): set router [$ns node] Node產生後,接下來就可以開始產生網路的拓撲,有關Node之間的Link、Bandwidth、Propagation Delay以及Queue-Type設定方法,指令格式如下: $ns duplex-link <node1> <node2> <bandwidth> <delay> <queue-type> 網路的拓撲建好後,接下來就是指定要使用的Agent,並告訴這個Agent在產生Traffic的時候,要使用那一種Traffic generator,指令格式如下:: set Agent_name [new Agent/<Agent-type>]
簡單的例子 接下來我們用一個簡單的例子來介紹如何在Node與Node之間建一個TCP Connection (如Figure 3所示),以下的TCL Script是根據Figure 3的設定所撰寫的:
Example 1: set ns [new Simulator] ;#Create a simulator object set nf [open out.nam w] ;#Open the Nam trace file $ns namtrace-all $nf #Define a 'finish' procedure proc finish {} { global ns nf $ns flush-trace close $nf ;#Close the trace file exec nam out.nam & exit 0 }
Example 1: set node1 [$ns node] ;#Create two nodes, then create a duplex link between the nodes set node2 [$ns node] $ns duplex-link $node1 $node2 10Mb 2ms DropTail #Connect the TCP source with the TCP sink set tcp [$ns create-connection TCP $node1 TCPSink $node2 1] $tcp set window_ 128 ;# Configure the TCP agent set ftp [new Application/FTP] $ftp attach-agent $tcp $ns at 0.5 "$ftp start" ;# Schedule events for the FTP agent $ns at 4.5 "$ftp stop" $ns at 5.0 "finish" #Run the simulation $ns run
Example 2: 接著要模擬的環境包含了四個網路節點(n0,n1,n2,n3),網路節點n0到節點n2之間,和節點n1到節點n2之間的網路頻寬(bandwidth)是2Mbps,延遲時間(propagation delay)是10ms。 網路拓樸中的頻寬瓶頸是在節點n2到節點n3之間,頻寬為1.7Mbps,延遲的時間為20ms。每個網路節都是採用 DropTail queue的方式,且在節點n2到節點n3之間的最大佇列長度是10個封包的長度。
Example 2: 在節點n0到n3之間會有一條FTP的連線,FTP應用程式是架構在 TCP之上,所以在寫模擬環境的描述語言的時候,必需先建立一條TCP的連線,在來源端n0上使用TCP agent產生”tcp”來發送TCP的封包;在目的地端n3使用TCPsink agent產生”sink”來接受TCP的資料、並產生回覆封包(ACK)回傳送端、最後把接收的TCP封包釋放。最後要把這兩個agent連起來 (connect),連線才能建立。若是沒有額外的參數設定,TCP封包的長度為1Kbytes。
Example 2: 另外,在節點n1到n3之間有一條固定的傳輸速率的連線(Constant Bit Rate,CBR),CBR應用程式是架構在UDP之上,因此必需在n1使用UDP agent來產生”udp”用來發送UDP封包,在n3上使用Null agent來產生”sink”以接收由n1傳送過來的UDP封包,然後把接收的封包釋放。CBR的傳送速度為1Mbps,每一個封包大小為1Kbytes。CBR是在0.1秒開始傳送,在4.5秒結束傳輸;FTP是在1.0秒開始傳送,4.0秒結束傳輸。
Example 2:
[Tcl Script] # 產生一個模擬的物件 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
[Tcl Script] #定義一個結束的程序 proc finish {} { global ns nf nd $ns flush-trace close $nf close $nd #以背景執行的方式去執行NAM exec nam out.nam & exit 0 } #產生四個網路節點 set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node]
[Tcl Script] #把節點連接起來 $ns duplex-link $n0 $n2 2Mb 10ms DropTail #設定ns2到n3之間的Queue Size為10個封包大小 $ns queue-limit $n2 $n3 10 #設定節點的位置,這是要給NAM用的 $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
[Tcl Script] #觀測n2到n3之間queue的變化,這是要給NAM用的 $ns duplex-link-op $n2 $n3 queuePos 0.5 #建立一條TCP的連線 set tcp [new Agent/TCP] $tcp set class_ 2 $ns attach-agent $n0 $tcp set sink [new Agent/TCPSink] $ns attach-agent $n3 $sink $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
[Tcl Script] #建立一條UDP的連線 set udp [new Agent/UDP] $ns attach-agent $n1 $udp set null [new Agent/Null] $ns attach-agent $n3 $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
[Tcl Script] #設定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 $n0 $tcp ; $ns detach-agent $n3 $sink" #在模擬環境中,5秒後去呼叫finish來結束模擬(這樣要注意模擬環境中 #的5秒並不一定等於實際模擬的時間 $ns at 5.0 "finish" #執行模擬 $ns run
Example 2模擬結果
Example 2模擬結果 模擬結束後,會產生兩個檔案,一個是out.nam, 這是給NAM用的,用來把模擬的過程用視覺化的方式呈現出來,這可以讓使用者用”看”的方式去瞭解封包傳送是如何從來源端送到接收端。另一個檔案是 out.tr,這個檔案記錄了模擬過程中封包傳送中所有的事件,例如第一筆記錄是一個CBR的封包,長度為1000bytes,在時間0.1秒的時候,從 n1傳送到n2。這個檔案對我們做效能分析很重要,所以要先對這個檔案的格式做仔細的介紹。
out.tr
out.tr 每一筆記錄的開始都是封包事件發生的原因,若是r則表示封包被某個節點所接收,若是+則表示進入了佇列,若是-則表示離開佇列,若是d則表示封包被佇列所丟棄。接著的第二個欄位表示的是事件發生的時間;欄位三和欄位四表示事件發生的地點(從from node到to node);欄位五表示封包的型態;欄位六是封包的大小,欄位七是封包的旗標標註;欄位八表示封包是屬於那一個資料流;欄位九和欄位十是表示封包的來源端和目的端,這兩個欄位的格式是a.b,a代表節點編號,b表示埠號(port number);欄位十一表示封包的序號;最後欄位十二表示封包的id。以前面trace file的第一筆為例,意思就是說有一個封包pakcet id為0,資料流id為2,序號為0,長度為1000 bytes,型態為CBR,它是從來源端1.0要到目的地3.1,在時間0.1秒的時候,從節點1進入了節點2的佇列中。
一些常用的網站 http://140.116.72.80/~smallko/ns2/ns2.htm http://nsda.ee.ncku.edu.tw/chengrs/ns/index.htm 以上兩個都整理的相當詳細