如何对NS2仿真结果进行分析Word格式文档下载.docx
- 文档编号:20173740
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:64
- 大小:506.68KB
如何对NS2仿真结果进行分析Word格式文档下载.docx
《如何对NS2仿真结果进行分析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《如何对NS2仿真结果进行分析Word格式文档下载.docx(64页珍藏版)》请在冰豆网上搜索。
#定义一个结束的程序
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的联机(不一定需要写下面的程序代码来实际结束联机)
$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
-------
1.0
3.1
一般而言是以空格符来分隔相邻的字段。
当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<
end)printf("
%f%f\n"
start,packet_duration);
执行方法:
($为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内。
#程序初始化
old_time=0;
old_seq_no=0;
i=0;
#判断是否为n2传送到n3,且封包型态为cbr,动作为接受封包
if(node_1==2&
node_2==3&
type=="
cbr"
&
action=="
){
#求出目前封包的序号和上次成功接收的序号差值
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;
}
for(j=1;
j<
i;
j++)
printf("
%d\t%f\n"
seq[j],jitter[j]);
$awk-fmeasure-jitter.awkout.tr
(把结果存到cbr_jitter档案中)
$awk-fmeasure-jitter.awkout.tr>
cbr_jitter
10.008000
20.008000
30.008000
40.008000
……………………
[另一种计算Jitter的方法---更精确的方式]
#==Usage==
#awk-fNormalJitter.awkout.tr
#==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模拟例子中是正确的,但是对于不同的例子需要根
#据情况进行一定的修改,并可能需要加入某些鲁棒性处理代码(例如对于第一个包的处理,对于丢包的处
#理等)。
highest_packet_id){
if(start_time[packet_id]==0){
#记录下包的seq_no--ZHA
pkt_seqno[packet_id]=seq_no;
start_time[packet_id]=time;
end_time[packet_id]=time;
}
#初始化jitter计算所需变量--ZHA
last_seqno=0;
last_delay=0;
seqno_diff=0;
end){
#得到了delay值(packet_duration)后计算jitter--ZHA
seqno_diff=pkt_seqno[packet_id]-last_seqno;
delay_diff=packet_duration-last_dela
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 NS2 仿真 结果 进行 分析