計算機網路實驗ns2實驗
網路模擬器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丟包機制。
相關文章
- 計算機網路實驗計算機網路
- 計算機網路驗證性實驗計算機網路
- 《計算機網路實驗課程》——Wireshark實驗計算機網路
- 計算機網路實驗報告:【Wirshark 實驗】計算機網路
- 計算機網路實驗二計算機網路
- 計算機網路實驗三計算機網路
- 計算機網路實驗:【Cisco Packet Tracer 實驗】計算機網路
- 計算機網路實驗總結計算機網路
- 計算機網路實驗三—— Cisco Packet Tracer 實驗計算機網路
- 計算機網路實驗8&9計算機網路
- 關於計算機網路的 Wireshark 實驗計算機網路
- 計算機網路實驗六:無線接入計算機網路
- 計算機網路實驗3:網路裝置基本配置計算機網路
- HUST-計算機網路實驗-socket程式設計計算機網路程式設計
- 計算機網路實驗二——利用wireshark抓包計算機網路
- 計算機網路的 Cisco Packet Tracer 實驗計算機網路
- 計算機網路實驗二:動態路由配置計算機網路路由
- 計算機網路實驗4:鏈路層分析與組網計算機網路
- 《計算機網路微課堂》實驗9 劃分子網計算機網路
- 計算機網路實驗10:靜態路由協議計算機網路路由協議
- 計算機網路實驗12:FTP伺服器部署計算機網路FTP伺服器
- 計算機網路實驗2:PC互連與對等網路計算機網路
- 計算機網路實驗1 網線、配線架與機櫃計算機網路
- 計算機網路實驗五:虛擬區域網技術計算機網路
- 計算機網路實驗七:交換頻寬與埠密度計算機網路
- 計算機網路實驗一:vlan的建立與劃分計算機網路
- 計算機網路實驗課結課考試:子網劃分計算機網路
- 關於計算機網路第一章的wireshark實驗計算機網路
- 《計算機網路微課堂》實驗1 訪問WEB伺服器計算機網路Web伺服器
- 《計算機網路微課堂》實驗8 IPv4地址計算機網路
- 《計算機網路微課堂》實驗5 交換機的自學習演算法計算機網路演算法
- 網路實驗二
- 計算機作業系統實驗之_程式觀測_實驗報告計算機作業系統
- 計算機實驗室之樹莓派計算機樹莓派
- 《計算機網路微課堂》實驗6 生成樹協議STP的功能計算機網路協議
- 《計算機網路微課堂》實驗4 集線器和交換機的區別計算機網路
- 計算機網路實驗三 綜合性訓練(搭建中小企業園區網)計算機網路
- 《計算機網路微課堂》實驗10 構造超網(無分類編址)計算機網路