計算機網路實驗ns2實驗

SpadgerZ發表於2017-06-26

網路模擬器NS2的配置與應用


這個實驗環境配置很麻煩,但是實驗內容很簡單......

配置環境一上午,實驗只要十分鐘...... 


1.        實驗要求

安裝並執行網路模擬器NS2,瞭解其功能模組及配套工具的使用,掌握利用NS2進行網路模擬的方法,為進一步的網路系統效能分析設計創造良好的條件。

 

2.        實驗條件

硬體:一臺計算機

軟體:Ubuntu作業系統、NS2工具包

 

3.        實驗指導

1)        NS2模擬流程

採用NS2進行模擬實驗之前,必須先掌握本書7.2.1節中的相關內容。一般來說,採用NS2進行模擬大致可分為3個步驟:

●建立Networkmodel:描述整個網路的拓撲、頻寬等資訊。

●建立traffic model:描述所有的網路流量或錯誤情況的時間、型別、或呈何種數學分佈。

●追蹤分析結果:模擬完成後,可呼叫nam觀察整個模擬流程,或是將namfile中的資訊抽取出來加以分析。

 

下面是一些具體的實現語句,其中#後的說明為該語句的相關注釋。(根據本人測試執行,最好檔案中不要加註釋,否則會報錯)

a)        建立Networkmodel

●建立ns物件

 set ns[new Simulator]

 

●建立節點

 set n0[$ns node]

 

●建立連線

 $ns duplex-link $n0 $n1 <bandwidth><delay><queue_type>

佇列(queue)是保持(held)或丟棄(drop)資料包的地方,目前NS2所支援的佇列緩衝管理機制有drop-tail(FIFO)佇列、RED緩衝管理、公平佇列(Fair Queueing,FQ)、隨機公平佇列(StochasticFair Queueing,SFQ)、DRR(Deficit Round-Robin)和基於類的佇列(class-based queuein,CBQ)。

 

●建立區域網

 $ns make-lan <node_list><bandwidth><delay>LLQueue/DropTail MAC/802.3 Channel

若只想建立點對點的網路,則無需建立區域網這個步驟。

 

b)        建立Trafficmodel

建立連線

根據不同的流量型別,可分為

TCP連線

set tcp[new Agent/TCP]          #建立TCP代理,用以產生流量

set tcpslink[new Agent/TCPSink]   #建立TCPSink代理,用以接收流量

$ns attach-agent $n0 $tcp        #將所建立的tcp配置給節點n0

$ns attach-agent $n1 $tcpsink     #將所建立的tcpsink配置給節點n1

$ns connect $tcp $tcpsink        #連線

 

UDP連線

set udp[new Agent/UDP]          #建立UDP代理,用以產生流量

set null[new Agent/NULL]         #建立NULL代理,用以接收流量

$ns attach-agent $n0 $udp        #將所建立的udp配置給節點n0

$ns attach-agent $n1 $null        #將所建立的null配置給節點n1

$ns connect $udp $null           #連線

 

●產生流量

對應TCP連線,產生FTP(or Telnet)流量:

set ftp[new Application/FTP]

$ftp attach-agent $udp

 

●建立排程

$ns at<time><event>             #<event>為任何合法的ns/tcl命令

$ns run

 

c)        追蹤分析結果

$ns namtrace-all[open test.nam w]

其中test.nam為記錄模擬過程的輸出檔案,內容包含網路的拓撲(node、link、queues、…),以及所有資料包的資訊。使用者可以使用該檔案中的有關資料包的資訊來作一些追蹤分析。

 

 

2)        NS2模擬示例—nam方式

下面給出一個具體的NS2模擬示例,一遍可以更快更清楚地瞭解網路模擬的實際操作流程。例如,在文字編輯器中寫入OTcl指令碼。

指令碼內容如下:

set ns [new Simulator]    #建立一個ns物件

#設定第一條資料流在nam中用藍色表示,第二條資料流用紅色表示,主要是為了便於觀察被傳送和丟棄的資料包是屬於哪個資料流,其中引數1、2為資料流所對應的flowid(流量識別符號)

$ns color 1 Blue

$ns color 2 Red

set nf [open out.nam w]   #開啟跟蹤檔案out.nam,其中nf為檔案控制程式碼

$ns namtrace-all $nf 

proc finish {} {           #定義結束過程 

global ns nf 

$ns flush-trace

close $nf                 #關閉跟蹤檔案

    exec nam out.nam &    #呼叫nam

exit 0

 

set ns0 [$ns node]           #建立四個節點:n0、n1、n2、n3

set ns1 [$ns node]

set ns2 [$ns node]

set ns3 [$ns node] 

 

#建立節點間的鏈路Link、設定頻寬1Mbit/s,時延10ms,佇列DropTail,即先進先出(FIFO)

$ns duplex-link $ns0 $ns2 1Mb 10ms DropTail      

$ns duplex-link $ns1 $ns2 1Mb 10ms DropTail

$ns duplex-link $ns3 $ns2 1Mb 10ms DropTail 

 

#設定節點在拓撲圖中的位置,使得整個圖看起來佈局更為合理

$ns duplex-link-op $ns0 $ns2 orient right-down   

$ns duplex-link-op $ns1 $ns2 orient right-up

$ns duplex-link-op $ns2 $ns3 orient right

 

#設定nam中queue的位置,便於檢測節點n2和n3之間鏈路的佇列

$ns duplex-link-op $ns2 $ns3 queuePos 0.5 

 

#為節點n0建立一個UDP代理udp0,用於產生流量,並設定flowid(流量識別符號)為1

set udp0 [new Agent/UDP]          

$udp0 set class_ 1

$ns attach-agent $ns0 $udp0 

 

#設定udp0產生CBR流量,每隔0.005s傳送大小為500B的資料包

set cbr0 [new Application/Traffic/CBR]           

$cbr0 set packetSize_ 500

$cbr0 set interval_ 0.005

$cbr0 attach-agent $udp0

 

 

 

 

 

#為節點n1建立一個UDP代理udp1,用於產生流量,並設定flowid(流量識別符號)為2

set udp1 [new Agent/UDP]

$udp1 set class_ 2

$ns attach-agent $ns1 $udp1 

 

#設定udp1產生CBR(Constant BitRate,固定位元率)流量,每隔0.005s傳送大小為500B的資料包

set cbr1 [new Application/Traffic/CBR]

$cbr1 set packetSize_ 500

$cbr1 set interval_ 0.005

$cbr1 attach-agent $udp1 

 

#為節點n3建立一個Null代理null0,用以接收流量

set null0 [new Agent/Null]                       

$ns attach-agent $ns3 $null0 

 

#分別連線流量產生代理udp0、udp1和流量接收代理null0

$ns connect $udp0 $null0

$ns connect $udp1 $null0 

 

#排程,設定cbr0在模擬0.5s後開始傳輸資料,4.5s後停止傳輸資料;設定cbr1在模擬1.0s後開始傳送資料,4.0s後停止傳送資料

$ns at 0.5 "$cbr0 start"                     

$ns at 1.0 "$cbr1 start"

$ns at 4.0 "$cbr1 stop"

$ns at 4.5 "$cbr0 stop"

 

#模擬5.0s後,呼叫結束過程

$ns at 5.0 "finish" 

 

#執行模擬                              

$ns run    

 

儲存指令碼檔案為example1.tcl,執行命令:ns example1.tcl

 

 

 

 

 

 

 

 

 

執行結果如下圖所示:

 

                                    

點選視窗上的“PLAY”按鈕,將動態顯示模擬過程:

 

模擬0.5s後,結點n0開始向結點n2傳送資料包,該資料流以藍色動態顯示,此時可以拖動視窗右上方的“Step”滑尺以減緩nam的速度:

 

 

 

 

 

 

 

模擬1.0s後,節點n1開始向節點n2傳送資料包,以紅色動態顯示:

 

 

 

 

 

 

 

 

 

 

 

 

 

經過一段時間後,可觀察到鏈路佇列上的資料包如何被丟棄,因為指令碼採用的是FIFO佇列機制,所以兩種顏色的資料包並沒有被“公平”地丟棄,所丟棄的都是藍色的資料包,這可以通過修改鏈路配置的佇列機制來提高公平性。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3)        NS2模擬示例—Xgraph方式

由上面的模擬示例可以看出,採用nam方式顯示的是整個模擬的動態過程,如資料包的傳輸、鏈路的斷開、丟包等;若想顯示模擬過程中的內部狀態,如傳輸速率、各種峰值等,可採用NS2提供的另外一種方式—Xgraph方式。

下面給出另一個採用Xgraph顯示方式的NS2模擬示例。其網路拓撲結構如下圖所示,鏈路Link都是頻寬1Mbit/s、時延100ms、採用FIFO佇列,udp連線從節點n0、n1、n2到節點n4,對應的OTcl指令碼如後面所示。

 

在文字編輯器中寫入OTcl指令碼,指令碼內容如下:

 

#建立一個ns物件

set ns [new Simulator]      

 

        #開啟輸出檔案

set f0 [open out0.tr w]     

set f1 [open out1.tr w]

set f2 [open out2.tr w]

 

        #for迴圈,建立n0~n4共5個節點

for { set i 0 } { $i<5 } {incr i}{         

    setn$i [$ns node]  

}

 

        #建立鏈路Link

$ns duplex-link $n0 $n3 1Mb 100msDropTail   

$ns duplex-link $n1 $n3 1Mb 100msDropTail

$ns duplex-link $n2 $n3 1Mb 100msDropTail

$ns duplex-link $n3 $n4 1Mb 100msDropTail

 

 

 

 

 

 

        #定義結束過程

proc finish {} {                           

    globalf0 f1 f2

    close$f0

    close$f1

    close$f2

    

         #呼叫Xgraph顯示模擬結果

    execxgraph out0.tr out1.tr out2.tr -geometry 800x400 &

    exit0

}

 

 

        #定義過程,為節點node和流量接收代理sink建立UDP連線,產生Expoo流量,並設定流量的size(packetSize,資料包大小)、burst(burst_time,突發事件)、idle(idle_time,空閒時間)和rate(burst peakrate,峰率)等

proc attach-expoo-traffic { node sinksize burst idle rate } {

set ns [Simulator instance]

 

        #為節點node建立一個UDP代理source,用於產生流量

set source [new Agent/UDP]

$ns attach-agent $node $source

 

        #產生Expoo流量

set traffic [newApplication/Traffic/Exponential]  

 

        #設定Expoo流量的packetSize(資料包大小)、burst_time(突發時間)、idle_time(空閒時間)和rate(burst peakrate,峰率)等

$traffic set packetSize_ $size

$traffic set burst_time_ $burst

$traffic set idle_time_ $idle

$traffic set rate_ $rate

$traffic attach-agent $source

 

        #連線流量產生代理source和流量接收代理sink

$ns connect $source $sink

return $traffic

}

 

 

 

 

 

 

 

        #定義記錄過程,週期性地記錄3個流量接收代理sink0、sink1、sink2所接受到的資料流頻寬,並分別寫入3個檔案f0、f1、f2中

proc record {} {                      

    globalsink0 sink1 sink2 f0 f1 f2

    setns [Simulator instance]

 

          #定義過程再次被呼叫的時間,即呼叫週期

    settime 0.5   

 

          #獲取代理已接收的位元組數,即變數bytes的值                  

    setbw0 [$sink0 set bytes_]

    setbw1 [$sink1 set bytes_]       

    setbw2 [$sink2 set bytes_]

 

          #獲取當前時間

    setnow [$ns now]

 

          #計算頻寬(單位:Mbit/s),將結果寫入檔案                

    puts$f0 "$now [expr $bw0/$time*8/1000000]"      

    puts$f1 "$now [expr $bw1/$time*8/1000000]"

    puts$f2 "$now [expr $bw2/$time*8/1000000]"

 

          #重置接收代理中的變數bytes的值

    $sink0set bytes_ 0              

    $sink1set bytes_ 0

    $sink2set bytes_ 0

 

          #重新排程

    $nsat [expr $now+$time] "record" 

}

 

        #為節點n4建立3個流量接收代理sink0、sink1、sink2

set sink0 [new Agent/LossMonitor]    

set sink1 [new Agent/LossMonitor]

set sink2 [new Agent/LossMonitor]

$ns attach-agent $n4 $sink0

$ns attach-agent $n4 $sink1

$ns attach-agent $n4 $sink2

 

 

 

 

 

        #呼叫attach-expoo-traffic過程,分別建立節點n0、n1、n2與流量接收代理sink0、sink1、sink2的UDP連線,產生並設定Expoo流量

set source0 [attach-expoo-traffic $n0$sink0 200 2s 1s 100k] 

set source1 [attach-expoo-traffic $n1$sink1 200 2s 1s 200k]

set source2 [attach-expoo-traffic $n2$sink2 200 2s 1s 300k]

 

        #排程

$ns at 0.0 "record"              

$ns at 10.0 "$source0 start"

$ns at 10.0 "$source1 start"

$ns at 10.0 "$source2 start"

$ns at 50.0 "$source0 stop"

$ns at 50.0 "$source1 stop"

$ns at 50.0 "$source2 stop"

$ns at 60.0 "finish"

 

        #執行模擬

$ns run

 

         儲存檔案為example2.tcl,執行命令:nsexample2.tcl

         執行結果如下所示:

 

Xgraph顯示模擬過程中的內部狀態,從圖中可以看出,三條資料流的峰值依次為0.1Mbit/s、0.2Mbit/s和0.3Mbit/s

 

 

 

 

4.        實驗總結

 

在nam輔助分析工具中發現ftp1在零秒開始啟動,ftp2在第三秒時刻開始啟動,都在第十秒停止,這符合設計目標。在傳送端收到新一輪的確認包時傳送包的數量也加一,傳輸的過程中佇列的長度超過一定值時開始丟包。這由設定的佇列最小的門限值和佇列最大門限值決定。當佇列長度小於最小門限值時一定不會丟包,只有超過最小門限值時才會發生丟包,且超過的越多丟棄的概率越大。當佇列長度超過最大門限值時佇列一定丟包。丟包後的確認包不再讓傳送視窗增大,反而從零開始增加。傳送過程中,丟包不再決定於佇列的長度了,而是根據平均佇列長度隨機丟棄,因為採用的是RED丟包機制。

相關文章