Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14781
  • 博文数量: 8
  • 博客积分: 1460
  • 博客等级: 上尉
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-25 16:20
文章分类
文章存档

2010年(6)

2009年(2)

我的朋友
最近访客

分类: 系统运维

2010-04-09 20:36:57


 

实验记录

时间:2007-3-15

地点:主教2607

实验内容:awkgnuplotns模 拟之后.tr文件的处理实验

1、实验用网络拓扑图为

这个网络的环境包含了四个网络节点(n0n1n2n3)如 下图所示。网络节点n0到节点n2之间,和节点n1到节点n2之间的网络频宽(bandwidth)2Mbps,延迟時间(propagation delay)10ms。网络拓朴中的频宽瓶颈是在节点n2到节点n3之间,频宽为1.7Mbps,延迟的時间为20ms。每个网络节都是采用DropTail queue的方式,且在节点n2到节点n3之间的最大队列长度是10个封包的长度。在节点n0n3之间会有一条FTP的连线,FTP应用程式是架架在TCP之上,所以在写模拟环境的描述语言的時候,必需先建立一条TCP的连线,在來源端n0上使用TCP agent产生”tcp”來发送TCP的封包;在目的地端n3使用TCPsink agent产生”sink”來接受TCP的资料、並产生回覆封包(ACK)回传送端、最后把接收的TCP封包释放。最后要把这两个agent连起來(connect),连线才能建立。若是沒有額外的參数设定,TCP封包的长度为1Kbytes。在这里顺便补充說明一下,对于ns2模拟參数內定值设定是在ns-allinone-2.27\ns-2.27\tcl\lib目錄下的ns-default.tcl,有想要进一步了解的人,可以去查看此档。另外,在节点n1n3之 间有一条固定的传输速率的连线(Constant Bit RateCBR)CBR应 用程式是架架在UDP之上,因此必需在n1使用UDP agent來产生”udp”用來发送UDP封包,在n3上使用Null agent來产生”sink”以接收由n1传送过來的UDP封包,然后 把接收的封包释放。CBR的传送速度为1Mbps,每一个封包大小为1KbytesCBR是 在0.1秒开始传送,在4.5秒結束传输;FTP是在1.0秒 开始传送,4.0秒結束传输。

2、程序源代码

编辑一个四个结点的网络源文件,保存名为tool.tcl

# 产生一个模拟的物件

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

 

#定义一个結束的程序

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]

 

#把节点连接起來

$ns duplex-link $n0 $n2 2Mb 10ms DropTail

$ns duplex-link $n1 $n2 2Mb 10ms DropTail

$ns duplex-link $n2 $n3 1.7Mb 20ms DropTail

 

#设定ns2n3之间的Queue Size10个封包大小

$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

 

#观测n2n3之间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

 

#建立一条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

 

#设定FTPCBR资料传送开始和結束時间

 

$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

3、运行ns tool.tcl得到下图

 

4、对trafic trace文件的分 析

运行ns之后,得到out.trout.nam文件,我们重点分析.tr文件。

局部trace数据

+ 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0

- 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0

+ 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1

- 0.108 1 2 cbr 1000 ------- 2 1.0 3.1 1 1

r 0.114 1 2 cbr 1000 ------- 2 1.0 3.1 0 0

+ 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0

- 0.114 2 3 cbr 1000 ------- 2 1.0 3.1 0 0

+ 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2

- 0.116 1 2 cbr 1000 ------- 2 1.0 3.1 2 2

r 0.122 1 2 cbr 1000 ------- 2 1.0 3.1 1 1

+ 0.122 2 3 cbr 1000 ------- 2 1.0 3.1 1 1

- 0.122 2 3 cbr 1000 ------- 2 1.0 3.1 1 1

+ 0.124 1 2 cbr 1000 ------- 2 1.0 3.1 3 3

- 0.124 1 2 cbr 1000 ------- 2 1.0 3.1 3 3

r 0.13 1 2 cbr 1000 ------- 2 1.0 3.1 2 2

+ 0.13 2 3 cbr 1000 ------- 2 1.0 3.1 2 2

- 0.13 2 3 cbr 1000 ------- 2 1.0 3.1 2 2

+ 0.132 1 2 cbr 1000 ------- 2 1.0 3.1 4 4

每一笔记录的开始都是封包事件发生的原因,若是r则表 示封包被某个节点所接收,若是+则表示进入了队列,若是-则表示 离开队列,若是d则表示封包被队列所丟棄。接著的第二个栏位表示的是事件发生的時间;栏位三和栏位四表示事件发生的 地点(from nodeto node);栏位五表示封包的形态;栏位六是封包的大小,栏位七是封包的旗标标註;栏位八表示封包是属于那一个 资料流;栏位九和栏位十是表示封包的來源端和目的端,这两个栏位的格式是a.ba代表节点編号,b表示端 口号(port number);栏位十一表示封包的序号;最后栏位十二表示封包的id。以前面trace file的第一笔为 例,意思就是說有一个封包pakcet id0,资料流id2,序号为0,长度为1000 bytes,形态为CBR, 它是從來源端1.0要到目的地3.1, 在時间0.1秒的時候,從节点1进入了 节点2的队列中。

4、如何用awk分析tarace file,以得到ThroughputDelayJitter、和Loss Rate

awk的工作流程

工作流程: 执行awk, 它会反複进行下列四步驟。

1. 自動從指定的资料档中读取一笔资料列。

2. 自動更新(Update)相關的內建变数之值。

3. 逐次执行程式中 所有 的 Pattern { Actions } 指令。

4. 当执行完程式中所有 Pattern { Actions }時,若资料档中还有未读取的料,则反覆执行步驟1到步驟4

awk会自動重覆进行上述的四个步驟,所以使用者不須在程式中写这个迴圈。

[End-to-End Delay]

笔者把量测CBR封 包端点到端点间延迟時间的awk程式,写在档案measure-delay.awk档案中,读者可以參考此范例,修改成符合读者需求的程式。

 

BEGIN {

#程式初始化,设定一变数以记录目前最高处理封包的ID

     highest_packet_id = 0;

}

{

   action = $1;

   time = $2;

   node_1 = $3;

   node_2 = $4;

   type = $5;

   flow_id = $8;

   node_1_address = $9;

   node_2_address = $10;

   seq_no = $11;

   packet_id = $12;

 

#记录目前最高的packet ID

   if ( packet_id > highest_packet_id )

        highest_packet_id = packet_id;

 

#记录封包的传送時间

   if ( start_time[packet_id] == 0 ) 

       start_time[packet_id] = time;

 

#记录CBR (flow_id=2) 的 接收時间

   if ( flow_id == 2 && action != "d" ) {

      if ( action == "r" ) {

         end_time[packet_id] = time;

      }

   } else {

#把不是flow_id=2的封包或者是flow_id=2但此封包被drop的 時间设为-1

      end_time[packet_id] = -1;

   }

}                                                

END {

#当资料列全部读取完后,开始计算有效封包的端点到端点延迟時间

    for ( packet_id = 0; packet_id <= highest_packet_id; packet_id++ ) {

       start = start_time[packet_id];

       end = end_time[packet_id];

       packet_duration = end - start;

 

#只把接收時间大于传送時间的记录列出來

       if ( start < end ) printf("%f %f\n", start, packet_duration);

   }

}

 

执行方法: ($shell的提示符号)

$awk -f measure-delay.awk out.tr

 

若是要把結果存到档案,可使用导向的方式。(把結 果存到cbr_delay档案中)

$awk -f measure-delay.awk out.tr > cbr_delay

得到的结果是:

0.100000 0.038706

0.108000 0.038706

0.116000 0.038706

0.124000 0.038706

0.132000 0.038706

0.140000 0.038706

0.148000 0.038706

0.156000 0.038706

0.164000 0.038706

0.172000 0.038706

0.180000 0.038706

0.188000 0.038706

0.196000 0.038706

0.204000 0.038706

0.212000 0.038706

0.220000 0.038706

0.228000 0.038706

0.236000 0.038706

[Jitter]

延迟变量。Jitter越大,则表示网络越不穩定。笔者把量测CBR flowJitterawk写在档案measure-jitter.awk內。

BEGIN {

#程式初始化

   old_time=0;

   old_seq_no=0;

   i=0;

}

{

   action = $1;

   time = $2;

   node_1 = $3;

   node_2 = $4;

   type = $5;

   flow_id = $8;

   node_1_address = $9;

   node_2_address = $10;

   seq_no = $11;

   packet_id = $12;

 

#判断是否为n2传送 到n3,且封包形态为cbr, 動作为接受封包

   if(node_1==2 && node_2==3 && type=="cbr" && action=="r") {

#求出目前封包的序号和上次成功接收的序号差值

       dif=seq_no-old_seq_no;

 

#处理第一个接收封包

        if(dif==0) 

          dif=1;

 

#求出jitter

          jitter[i]=(time-old_time)/dif;

          seq[i]=seq_no;

              i=i+1;

          old_seq_no=seq_no;

          old_time=time;

   }    

}

END {

   for (j=1; j

    printf("%d\t%f\n",seq[j],jitter[j]);

}

运行

$awk -f measure-jitter.awk out.tr > cbr_jitter

cbr_jitter结果为

 

1     0.008000

2     0.008000

3     0.008000

4     0.008000

5     0.008000

6     0.008000

7     0.008000

8     0.008000

9     0.008000

[Loss]

笔者把量测CBR Packet Loss的情況写在档案measure-drop.awk內。

BEGIN {

#程式初始化,设定一 变数记录packetdrop的数目

       fsDrops = 0;

       numFs = 0;

}

{

   action = $1;

   time = $2;

   node_1 = $3;

   node_2 = $4;

   src = $5;

   flow_id = $8;

   node_1_address = $9;

   node_2_address = $10;

   seq_no = $11;

   packet_id = $12;

 

#统计從n1送出多少packets

       if (node_1==1 && node_2==2 && action == "+")

              numFs++;

      

#统计flow_id2,且被drop的封包

       if (flow_id==2 && action == "d")

              fsDrops++;

}

END {

       printf("number of packets sent:%d lost:%d\n", numFs, fsDrops);

}

 

执行方法: ($shell的提示符号)

$awk -f measure-drop.awk out.tr >cbr_lose

运行得到的结果是:

number of packets sent:550 lost:8

[Throughput]

笔者把量测CBR Throughput的情況写在档案measure-throughput.awk內。在这里的Throughput是指average throughput

BEGIN {

       init=0;

       i=0;

}

{

       action = $1;

     time = $2;

     node_1 = $3;

     node_2 = $4;

     src = $5;

     pktsize = $6;

     flow_id = $8;

     node_1_address = $9;

     node_2_address = $10;

     seq_no = $11;

     packet_id = $12;

  

      if(action=="r" && node_1==2 && node_2==3 && flow_id==2) {

             pkt_byte_sum[i+1]=pkt_byte_sum[i]+ pktsize;

             

              if(init==0) {

                     start_time = time;

                     init = 1;

              }

             

              end_time[i] = time;

              i = i+1;

阅读(444) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~