NS2使用1.docx

上传人:b****8 文档编号:9099968 上传时间:2023-02-03 格式:DOCX 页数:37 大小:402.59KB
下载 相关 举报
NS2使用1.docx_第1页
第1页 / 共37页
NS2使用1.docx_第2页
第2页 / 共37页
NS2使用1.docx_第3页
第3页 / 共37页
NS2使用1.docx_第4页
第4页 / 共37页
NS2使用1.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

NS2使用1.docx

《NS2使用1.docx》由会员分享,可在线阅读,更多相关《NS2使用1.docx(37页珍藏版)》请在冰豆网上搜索。

NS2使用1.docx

NS2使用1

对于使用网络仿真软件来做网络效能分析的人而言,步骤通常是先设计出符合自己需要的网络仿真环境,设定其不同的参数,执行仿真,收集结果数据,最后把数据使用图片或表格把结果呈现出来以方便分析实验。

一般而言,对于ns2的初学者而言,总是会遇到一个问题,就是网络仿真程序跑完后,接下来该如何分析。

这是非常重要的一个过程,所以希望ns2的初学者能好好的研究此章节的内容,相信一定会对大家的研究有相当的帮助。

本节打算以一个简单的网络环境为范例,介绍如何使用一些工具来分析和呈现模拟结果,这包含了如何去量测End-to-EndDelay、Jitter、PacketLoss、和Throughput。

而采用的方法是去分析traffictrace档案的方式,这种方法的优点是简单且不需要去修改到ns2核心的部份,但缺点是若是仿真数据若是太多,traffictrace的档案会太大,这样会增加分析所需要的时间。

另外一种方法,是去更改ns2核心,增加或修改一些档案,把所需要量测的参数直接记录下来,这种方法的优点是模拟结束后,所需要量测的数据已经完全记录下来,但缺点是要动到ns2核心的部分,对于初学者而言,这是一个很大的门坎,这个方法笔者留到后面的章节在做介绍。

笔者先对要模拟的环境做一个简单的介绍。

这个网络的环境包含了四个网络节点(n0,n1,n2,n3),如下图所示。

网络节点n0到节点n2之间,和节点n1到节点n2之间的网络频宽(bandwidth)是2Mbps,延迟时间(propagationdelay)是10ms。

网络拓朴中的频宽瓶颈是在节点n2到节点n3之间,频宽为1.7Mbps,延迟的时间为20ms。

每个网络节都是采用DropTailqueue的方式,且在节点n2到节点n3之间的最大队列长度是10个封包的长度。

在节点n0到n3之间会有一条FTP的联机,FTP应用程序是架构在TCP之上,所以在写仿真环境的描述语言的时候,必需先建立一条TCP的联机,在来源端n0上使用TCPagent产生”tcp”来发送TCP的封包;在目的地端n3使用TCPsinkagent产生”sink”来接受TCP的数据、并产生回复封包(ACK)回传送端、最后把接收的TCP封包释放。

最后要把这两个agent连起来(connect),联机才能建立。

若是没有额外的参数设定,TCP封包的长度为1Kbytes。

在这里顺便补充说明一下,对于ns2模拟参数内定值设定是在ns-allinone-2.27\ns-2.27\tcl\lib目录下的ns-default.tcl,有想要进一步了解的人,可以去查看此档。

另外,在节点n1到n3之间有一条固定的传输速率的联机(ConstantBitRate,CBR),CBR应用程序是架构在UDP之上,因此必需在n1使用UDPagent来产生”udp”用来发送UDP封包,在n3上使用Nullagent来产生”sink”以接收由n1传送过来的UDP封包,然后把接收的封包释放。

CBR的传送速度为1Mbps,每一个封包大小为1Kbytes。

CBR是在0.1秒开始传送,在4.5秒结束传输;FTP是在1.0秒开始传送,4.0秒结束传输。

[SimulationTopology]

[TclScript]

#产生一个仿真的对象

setns[newSimulator]

#针对不同的数据流定义不同的颜色,这是要给NAM用的

$nscolor1Blue

$nscolor2Red

#开启一个NAMtracefile

setnf[openout.namw]

$nsnamtrace-all$nf

#开启一个tracefile,用来记录封包传送的过程

setnd[openout.trw]

$nstrace-all$nd

#定义一个结束的程序

procfinish{}{

globalnsnfnd

$nsflush-trace

close$nf

close$nd

#以背景执行的方式去执行NAM

execnamout.nam&

exit0

}

#产生四个网络节点

setn0[$nsnode]

setn1[$nsnode]

setn2[$nsnode]

setn3[$nsnode]

#把节点连接起来

$nsduplex-link$n0$n22Mb10msDropTail

$nsduplex-link$n1$n22Mb10msDropTail

$nsduplex-link$n2$n31.7Mb20msDropTail

#设定ns2到n3之间的QueueSize为10个封包大小

$nsqueue-limit$n2$n310

#设定节点的位置,这是要给NAM用的

$nsduplex-link-op$n0$n2orientright-down

$nsduplex-link-op$n1$n2orientright-up

$nsduplex-link-op$n2$n3orientright

#观测n2到n3之间queue的变化,这是要给NAM用的

$nsduplex-link-op$n2$n3queuePos0.5

#建立一条TCP的联机

settcp[newAgent/TCP]

$tcpsetclass_2

$nsattach-agent$n0$tcp

setsink[newAgent/TCPSink]

$nsattach-agent$n3$sink

$nsconnect$tcp$sink

#在NAM中,TCP的联机会以蓝色表示

$tcpsetfid_1

#在TCP联机之上建立FTP应用程序

setftp[newApplication/FTP]

$ftpattach-agent$tcp

$ftpsettype_FTP

#建立一条UDP的联机

setudp[newAgent/UDP]

$nsattach-agent$n1$udp

setnull[newAgent/Null]

$nsattach-agent$n3$null

$nsconnect$udp$null

#在NAM中,UDP的联机会以红色表示

$udpsetfid_2

#在UDP联机之上建立CBR应用程序

setcbr[newApplication/Traffic/CBR]

$cbrattach-agent$udp

$cbrsettype_CBR

$cbrsetpacket_size_1000

$cbrsetrate_1mb

$cbrsetrandom_false

#设定FTP和CBR数据传送开始和结束时间

$nsat0.1"$cbrstart"

$nsat1.0"$ftpstart"

$nsat4.0"$ftpstop"

$nsat4.5"$cbrstop"

#结束TCP的联机(不一定需要写下面的程序代码来实际结束联机)

$nsat4.5"$nsdetach-agent$n0$tcp;$nsdetach-agent$n3$sink"

#在模拟环境中,5秒后去呼叫finish来结束模拟(这样要注意模拟环境中

#的5秒并不一定等于实际模拟的时间

$nsat5.0"finish"

#执行模拟

$nsrun

模拟结束后,会产生两个档案,一个是out.nam,这是给NAM用的,用来把模拟的过程用可视化的方式呈现出来,这可以让使用者用”看”的方式去了解封包传送是如何从来源端送到接收端。

另一个档案是out.tr,这个档案记录了仿真过程中封包传送中所有的事件,例如第一笔记录是一个CBR的封包,长度为1000bytes,在时间0.1秒的时候,从n1传送到n2。

这个档案对我们做效能分析很重要,所以要先对这个档案的格式做仔细的介绍。

+0.112cbr1000-------21.03.100

-0.112cbr1000-------21.03.100

+0.10812cbr1000-------21.03.111

-0.10812cbr1000-------21.03.111

r0.11412cbr1000-------21.03.100

+0.11423cbr1000-------21.03.100

-0.11423cbr1000-------21.03.100

+0.11612cbr1000-------21.03.122

-0.11612cbr1000-------21.03.122

r0.12212cbr1000-------21.03.111

+0.12223cbr1000-------21.03.111

.................................................................

每一笔记录的开始都是封包事件发生的原因,若是r则表示封包被某个节点所接收,若是+则表示进入了队列,若是-则表示离开队列,若是d则表示封包被队列所丢弃。

接着的第二个字段表示的是事件发生的时间;字段三和字段四表示事件发生的地点(从fromnode到tonode);字段五表示封包的型态;字段六是封包的大小,字段七是封包的旗标标注;字段八表示封包是属于那一个资料流;字段九和字段十是表示封包的来源端和目的端,这两个字段的格式是a.b,a代表节点编号,b表示埠号(portnumber);字段十一表示封包的序号;最后字段十二表示封包的id。

以前面tracefile的第一笔为例,意思就是说有一个封包pakcetid为0,资料流id为2,序号为0,长度为1000bytes,型态为CBR,它是从来源端1.0要到目的地3.1,在时间0.1秒的时候,从节点1进入了节点2的队列中。

接下来,笔者先简单介绍awk,然后如何使用awk去分析tracefile,以得到Throughput、Delay、Jitter、和LossRate。

[awk]

A.简介

awk是一种程序语言。

它具有一般程序语言常见的功能。

因awk语言具有某些特点,如:

使用直译器(Interpreter)不需先行编译;变量无型别之分(Typeless),可使用文字当数组的注标(AssociativeArray)等特色。

因此,使用awk撰写程序比起使用其它语言更简洁便利且节省时间。

awk还具有一些内建功能,使得awk擅于处理具数据列(Record),字段(Field)型态的数据;此外,awk内建有pipe的功能,可将处理中的数据传送给外部的Shell命令加以处理,再将Shell命令处理后的数据传回awk程序,这个特点也使得awk程序很容易使用系统资源。

B.awk是如何运作的

为便于解释awk程序架构,以及相关的术语,笔者就以上面tracefile为例,来加以介绍。

a.名词定义:

1.资料列:

awk从数据文件上读取的基本单位,以tracefile为例,awk读入的

第一笔资料列为”+0.112cbr1000-------21.03.100”

第二笔资料列为“-0.112cbr1000-------21.03.100”

一般而言,一笔数据列相当于数据文件上的一行资料。

2.字段(Field):

为数据列上被分隔开的子字符串。

以资料列”+0.112cbr1000-------21.03.100”为例,

十一

十二

0.1

1

2

cbr

1000

-------

2

1.0

3.1

0

0

一般而言是以空格符来分隔相邻的字段。

当awk读入数据列后,会把每个字段的值存入字段变量。

字段变量

意义

$0

为一字符串,其内容为目前awk所读入的资料列.

$1

代表$0上第一个字段的数据.

$2

代表$0上第二栏个位的资料.

……

……

b.程序主要节构:

Pattern1{Actions1}

Pattern2{Actions2}

……………………………

Pattern3{Actions3}

一般常用”关系判断式”来当成Pattern。

例如:

x>3用来判断变量x是否大于3

x==5用来判断变量x是否等于5

awk提供c语言常见的关系操作数,如:

>、<、>=、<=、==、!

=等等

Actions是由许多awk指令所构成,而awk的指令与c语言中的指令非常类似。

IO指令:

print、printf()、getline......

流程控制指令 :

if(...){...}else{…}、while(…){…}……

在awk程序的流程为先判断Pattern的结果,若为真True则执行相对应的Actions,若为假False则不执行相对的Actions。

若是处理的过程中没有Pattern,awk会无条件的去执行Actions。

c.工作流程:

执行awk时,它会反复进行下列四步骤。

1.自动从指定的数据文件中读取一笔数据列。

2.自动更新(Update)相关的内建变量之值。

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

4.当执行完程序中所有Pattern{Actions}时,若数据文件中还有未读取的料,则反复执行步骤1到步骤4。

awk会自动重复进行上述的四个步骤,所以使用者不须在程序中写这个循环。

[End-to-EndDelay]

笔者把量测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;

#记录目前最高的packetID

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

}

}

执行方法:

($为shell的提示符号)

$awk-fmeasure-delay.awkout.tr

若是要把结果存到档案,可使用导向的方式。

(把结果存到cbr_delay档案中)

$awk-fmeasure-delay.awkout.tr>cbr_delay

执行结果:

0.1000000.038706

0.1080000.038706

0.1160000.038706

0.1240000.038706

0.1320000.038706

………………………

[Jitter]

Jitter就是延迟时间变化量delayvariance,由于网络的状态随时都在变化,有时候流量大,有时候流量小,当流量大的时候,许多封包就必需在节点的队列中等待被传送,因此每个封包从传送端到目的地端的时间不一定会相同,而这个不同的差异就是所谓的Jitter。

Jitter越大,则表示网络越不稳定。

笔者把量测CBRflow的Jitter的awk写在档案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]);

}

执行方法:

($为shell的提示符号)

$awk-fmeasure-jitter.awkout.tr

若是要把结果存到档案,可使用导向的方式。

(把结果存到cbr_jitter档案中)

$awk-fmeasure-jitter.awkout.tr>cbr_jitter

执行结果:

10.008000

20.008000

30.008000

40.008000

……………………

[另一种计算Jitter的方法---更精确的方式]

#================================================================================

#NormalJitter.awk

#Versionnow:

0.1

#LastModifiedDate:

2004-10-23,19:

39:

54

#==Usage==

#awk-fNormalJitter.awkout.tr

#==ProgramedBy==

#查辉(ZHAHUI),Wuhan,China,Email:

zhahuiAT

#==Description==

#本awk程序给出了另外一种jitter的计算方法,这种方法中jitter的计算是基于以下公式:

#jitter=((recvtime(j)-sendtime(j))-(recvtime(i)-sendtime(i)))/(j-i),其中j>i。

#==Attention==

#NormalJitter.awk中关于jitter的计算完全基于柯志亨博士的measure-delay.awk程序中delay的

#计算。

而measure-delay.awk在柯博士网页中的ns2模拟例子中是正确的,但是对于不同的例子需要根

#据情况进行一定的修改,并可能需要加入某些鲁棒性处理代码(例如对于第一个包的处理,对于丢包的处

#理等)。

#==Reference==

#http:

//140.116.72.80/~smallko/ns2/ns2.htm

#==Feedback==

#如有任何关于本程序jitter计算的问题,请致信

#柯志亨(ChihHeng,Ke)博士smallko2001AT.tw或者与本人联系。

#==Acknowledgements==

#Dr.ChihHeng,Keprovidedvaluabledocumentsandawkfilesuponmyrequests.

#================================================================================

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;

#记录目前最高的packetID

if(packet_id>highest_packet_id){

highest_packet_id=packet_id;

}

#记录封包的传送时间

if(start_time[packet_id]==0){

#记录下包的seq_no--ZHA

pkt_seqno[packet_id]=seq_no;

start_time[packet_id]=time;

}

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

if(flow_id==2&&action!

="d"){

if(action=="r"){

end_time[packet_id]=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1