這個實驗要如何量測傳輸協定的應用程式之Throughput
、Packet delay、Packet jitter和Packet loss rate。
Throughput(吞吐量):單位時間內所接收的封包大小
Packet delay(封包延遲):
Packet jitter(抖動率):
Packet loss rate(封包遺失率):
使用NSG2來產生TCL
用實驗二有線網路的環境
模擬環境示意圖
Link設定:
(n0,n2)、(n1,n2)這兩個連線的參數設定
Link type : duplex-link
Queue type : DropTail
Capacity : 2 Mbps
Propagation Delay : 10 ms
Queue Size : 50
(n2,n3)這條連線的參數設定
Link type : duplex-link
Queue type : DropTail
Capacity : 1.7 Mbps
Propagation Delay : 10 ms
Queue Size : 50
Agent設定:
TCP/Tahoe
Packet size : 1500 bytes
TCPSink
Packet size : 1500 bytes
UDP
Packet size : 1500 bytes
Null
Packet size : 1500 bytes
Application設定:
FTP
Start time : 1
Stop time : 4
CBR
Start time : 0.1
Stop time : 4.5
Packet size : 1500 bytes
Rate : 1 Mbps
Interval : -1(代表TCL會忽略這個設定)
Parameter設定:
Simulation time : 5.0
Trace File : wiredout.tcl
Nam File : wiredout.nam
TCL儲存在ns-allinone-2.29/ns-2.29/book2/lab4/
名稱是wiredroan.tcl
※接下來我要修改一些設定進去原始的TCL
一個是mTcpSink、mUDP和mUdpSink
加這三個Agent的用意是因為這三個延伸是有紀錄封包資訊的功能
然後再加一個設定n2和n3之間的queue封包大小限制10
最後設定模擬時資料流的顏色(NAM用)
TCL碼
# This script is created by NSG2 beta1
# <http://wushoupong.googlepages.com/nsg>
#===================================
# 模擬參數設定
#===================================
set val(stop) 5.0 ;# 設定模擬結束時間
#===================================
# 初始化
#===================================
#產生一個新的模擬
set ns [new Simulator]
#針對不同的資料流定義不同的顏色(NAM用)
$ns color 1 Blue
$ns color 2 Red
#開啟一個模擬過程紀錄檔
set tracefile [open wiredout.tr w]
$ns trace-all $tracefile
#開啟一個NAM紀錄檔
set namfile [open wiredout.nam w]
$ns namtrace-all $namfile
#===================================
# 定義節點
#===================================
#產生四個節點
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
#===================================
# 連結設定
#===================================
#建立節點間的連結
$ns duplex-link $n0 $n2 2.0Mb 10ms DropTail
$ns queue-limit $n0 $n2 50
$ns duplex-link $n1 $n2 2.0Mb 10ms DropTail
$ns queue-limit $n1 $n2 50
$ns duplex-link $n2 $n3 1.7Mb 10ms DropTail
$ns queue-limit $n2 $n3 10
#設定節點位置 (for 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
#觀測n2和n3之間queue的變化(for NAM)
$ns duplex-link-op $n2 $n3 queuePos 0.5
#===================================
# Agents Definition
#===================================
#Setup a TCP/Reno connection
set tcp0 [new Agent/TCP/Reno]
$ns attach-agent $n0 $tcp0
#mTcpSink是TCPSink的延伸,除了具有TCPSink的功能外
#也能記錄所送出的封包資訊
set sink1 [new Agent/TCPSink/mTcpSink]
設定tcp接收記錄檔的檔名為tcp_sink
$sink1 set_filename tcp_sink
$ns attach-agent $n3 $sink1
$ns connect $tcp0 $sink1
$tcp0 set packetSize_ 1500
#在NAM中,TCP的連線會以藍色表示
$tcp0 set fid_ 1
#Setup a UDP connection
#mUDP是UDP的延伸,除了具有UDP的功能外
#也能記錄所送出的封包資訊
set udp2 [new Agent/mUDP]
#設定傳送紀錄檔檔名為sd_udp
$udp2 set_filename sd_udp
$ns attach-agent $n1 $udp2
#新增的接收Agent,可以把接收封包資訊記錄到檔案中
set null3 [new Agent/mUdpSink]
#設定接收檔紀錄檔檔名為rd_udp
$null3 set_filename rd_udp
$ns attach-agent $n3 $null3
$ns connect $udp2 $null3
$udp2 set packetSize_ 1500
#在NAM中,UDP的連線會以紅色表示
$udp2 set fid_ 2
#===================================
# Applications Definition
#===================================
#Setup a FTP Application over TCP/Reno connection
set ftp0 [new Application/FTP]
$ftp0 attach-agent $tcp0
$ns at 1.0 "$ftp0 start"
$ns at 4.0 "$ftp0 stop"
#Setup a CBR Application over UDP connection
set cbr1 [new Application/Traffic/CBR]
$cbr1 attach-agent $udp2
$cbr1 set packetSize_ 1500
$cbr1 set rate_ 1.0Mb
$cbr1 set random_ null
$ns at 0.1 "$cbr1 start"
$ns at 4.5 "$cbr1 stop"
#===================================
# Termination
#===================================
#Define a 'finish' procedure
proc finish {} {
global ns tracefile namfile
$ns flush-trace
close $tracefile
close $namfile
exec nam wiredout.nam &
exit 0
}
$ns at $val(stop) "$ns nam-end-wireless $val(stop)"
$ns at $val(stop) "finish"
$ns at $val(stop) "puts "done" ; $ns halt"
$ns run
跑完模擬會有紀錄檔,存在lab4的資料夾裡面
這份紀錄檔的格式如下:
記錄檔長的就像下面這個樣子
在模擬結束之後就會產生tcp_sink、sd_udp和rd_udp三個紀錄檔
計算此次的CBR的封包遺失率
從sd_udp檔案中可以看到共有366筆資料
從rd_udp檔案中可以得知共有366筆資料
因此此次的CBR封包遺失率是0 %
求得封包延遲時間
鍵入「$awk ‘{print $1 , $4}’ rd_udp > cbr_delay」
※Note:使用awk,把rd_udp檔案中的第一(封包序號)
和第四欄(封包延遲時間),列印到cbr_delay的檔案中
使用gnuplot畫出cbr_delay
先開啟視窗化圖形介面(指令:$startxwin.bat)
然後進到ns-allinone-2.29/ns-2.29/book2/lab4/底下
輸入指令:$gnuplot
進到畫圖的程式
輸入下圖我所輸入的部分
Xlabel是指X座標的文字label
ylabel是指Y座標的文字label
set terminal gif 設定圖的大小
set output設定輸出名字和格式
plot畫圖
下圖就是我們所得到的封包延遲時間的圖
求得抖動率
Awk分析程式(measure-jitter.awk)
執行方式:$awk –f measure-jitter.awk rd_udp > cbr_jitter
下面是得到的圖
求得吞吐量
Perl分析UDP吞吐量程式(measure-throughput.pl)
#使用方法: perl measure-throughput.pl <trace file> <granlarity>
#記錄檔檔名
$infile=$ARGV[0];
#多少時間計算一次(單位為秒)
$granularity=$ARGV[1];
$sum=0;
$sum_total=0;
$clock=0;
$maxrate=0;
$init=0;
#打開記錄檔
open (DATA,"<$infile")
die "Can't open $infile $!";
#讀取記錄檔中的每行資料,資料是以空白分成眾多欄位
while (<DATA>) {
@x = split(' ');
if($init==0){
$start=$x[2];
$init=1;
}
#讀取的第零個欄位是pkt_id
#讀取的第一個欄位是封包傳送時間
#讀取的第二個欄位是封包接收時間
#讀取的第三個欄位是封包end to end delay
#讀取的第四個欄位是封包大小
#判斷所讀到的時間,是否已經達到要統計吞吐量的時候
if ($x[2]-$clock <= $granularity)
{
#計算單位時間內累積的封包大小
$sum=$sum+$x[4];
#計算累積的總封包大小
$sum_total=$sum_total+$x[4];
}
else
{
#計算吞吐量
$throughput=$sum*8.0/$granularity;
if ($throughput > $maxrate){
$maxrate=$throughput;
}
#輸出結果: 時間 吞吐量(bps)
print STDOUT "$x[2]: $throughput bpsn";
#設定下次要計算吞吐量的時間
$clock=$clock+$granularity;
$sum_total=$sum_total+$x[4];
$sum=$x[4];
}
}
$endtime=$x[2];
#計算最後一次的吞吐量大小
$throughput=$sum*8.0/$granularity;
print STDOUT "$x[2]: $throughput bpsn";
$clock=$clock+$granularity;
$sum=0;
#print STDOUT "$sum_total $start $endtimen";
$avgrate=$sum_total*8.0/($endtime-$start);
print STDOUT "Average rate: $avgrate bpsn";
print STDOUT "Peak rate: $maxrate bpsn";
#關閉檔案
close DATA;
exit(0);
執行方式:$perl measure-throughput.pl rd_udp 0.5
執行結果:
※0.5是指每0.5秒統計這段時間的平均吞吐量
第一欄是時間,第二欄是這段時間內的吞吐量
最後會把全部平均吞吐量的值和最高的吞吐量顯示出來
計算TCP的吞吐量
Perl分析TCP吞吐量程式(measure-TCP.pl)
#使用方法: perl measure-TCP.pl <trace file> <granlarity>
#記錄檔檔名
$infile=$ARGV[0];
#多少時間計算一次(單位為秒)
$granularity=$ARGV[1];
$sum=0;
$sum_total=0;
$clock=0;
$init=0;
#打開記錄檔
open (DATA,"<$infile")
die "Can't open $infile $!";
#讀取記錄檔中的每行資料,資料是以空白分成眾多欄位
while (<DATA>) {
@x = split(' ');
if($init==0){
$start=$x[1];
$init=1;
}
#讀取的第零個欄位是pkt_id
#讀取的第一個欄位是封包接收時間
#讀取的第二個欄位是封包大小
#判斷所讀到的時間,是否已經達到要統計吞吐量的時候
if ($x[1]-$clock <= $granularity)
{
#計算單位時間內累積的封包大小
$sum=$sum+$x[2];
#計算累積的總封包大小
$sum_total=$sum_total+$x[2];
}
else
{
#計算吞吐量
$throughput=$sum*8.0/$granularity;
#輸出結果: 時間 吞吐量(bps)
print STDOUT "$x[1] $throughputn";
#設定下次要計算吞吐量的時間
$clock=$clock+$granularity;
$sum_total=$sum_total+$x[2];
$sum=$x[2];
}
}
$endtime=$x[1];
#計算最後一次的吞吐量大小
$throughput=$sum*8.0/$granularity;
print STDOUT "$x[1] $throughputn";
$clock=$clock+$granularity;
$sum=0;
print STDOUT "$sum_total $start $endtimen";
$avgrate=$sum_total*8.0/($endtime-$start);
print STDOUT "Average rate: $avgrate bpsn";
#關閉檔案
close DATA;
exit(0);
執行方式:$perl measure-TCP tcp_sink 0.5
執行結果:
無線網路環境模擬與網路效能檢測
這是模擬的環境,模擬範圍區域是1000m × 1000m,共有三個Mobile Nodes。在節點0前和節點2之間有一條CBR/UDP的連線。在模擬時間200秒的時候,節點1開始從位置(500,500)移動到(500,900)速度是2.0m/sec,然後在500秒的時候,再從位置(500,900)移動到(500,100),全部模擬時間為1000秒。
這個環境我們可以輕易的使用NSG2模擬出來
模擬完之後輸出TCL檔
執行方式:$ns wireless-measure.tcl
模擬結束之後就會產生sd_udp和rd_udp兩個紀錄檔(這兩個紀錄檔的產生在前面的有線網路已提過)
計算封包遺失
從sd_udp的檔案中可以得知共有452筆記錄;從rd_udp的檔案中得知共有350筆記錄,所以共有102的封包遺失,因此封包遺失率為102/452=22.57%。
求封包延遲時間
執行方式:$awk ‘{print $1, $4}’ rd_udp > cbr+delay
執行完之後使用gnuplot畫出cbr_delay,如下圖所示
計算抖動率
執行方式:$awk –f measure-jitter.awk rd_udp > cbr_jitter
執行完一樣使用gnuplot畫出cbr_jitter,如下圖所示
計算吞吐量
執行方式:$perl measure-throughput.pl rd_udp 1
執行結果:
沒有留言:
張貼留言