2008年3月27日 星期四

實驗四 網路效能量測

這個實驗要如何量測傳輸協定的應用程式之Throughput

Packet delayPacket jitterPacket 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

一個是mTcpSinkmUDPmUdpSink

加這三個Agent的用意是因為這三個延伸是有紀錄封包資訊的功能

然後再加一個設定n2n3之間的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

#觀測n2n3之間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

#mTcpSinkTCPSink的延伸,除了具有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

#mUDPUDP的延伸,除了具有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_sinksd_udprd_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_udprd_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

執行結果:

沒有留言: