awk分析trace文件


前言

分享四种awk文件


一、端到端时延

#BEGIN表明这是程序开头执行的一段语句,且只执行一次。

BEGIN {

#程序初始化,设定一变量以记录目前处理的封包的最大ID号码。在awk环境下变量的使用不需要声明,直接赋值。

highest_uid = 0;

}

#下面大括号里面的内容会针对要进行处理的记录(也就是我们的trace文件)的每一行都重复执行一次

{

event = $1; #$1表示一行的第一栏,是事件的动作。每一栏默认是以空格分隔的。下同。

time = $2; #事件发生的时间

node_nb = $3; #发生事件的节点号(但是两边夹着“_”,下面一句代码将“_”处理掉)

node_nb=substr(node_nb,2,1); #第三栏的内容是形如_0_的节点号码,我只要得出中间的节点号码0,所以要对字符串_0_进行处理。

trace_type = $4; #trace文件跟踪事件的层次(指在路由层或mac层等等)

flag = $5; #

uid = $6; #包的uid号码(普通包头的uid)

pkt_type = $7; #包的类型(是信令或是数据)

pkt_size = $8; #包的大小(byte)

#下面的代码记录目前最高的CBR流的packet ID,本来的延迟分析是针对所有的包的(包括信令),这里作了简化,只针对CBR封包,以后大家做延时分析可以做相应的改动即可。

if ( event=="s" && node_nb==0 && pkt_type=="cbr" && uid > highest_uid )

{#if判断句的前三个判断条件就不说了,第四个是说每个包的记录次数不超过1

highest_uid = uid;

}

#记录封包的传送时间

if ( event=="s" && node_nb==0 && pkt_type=="cbr" && uid==highest_uid )

start_time[uid] = time; # start_time[]表明这是一个数组

#记录封包的接收时间

if ( event=="r" && node_nb ==2 && pkt_type=="cbr" && uid==highest_uid )

end_time[uid] = time;

}

#END表明这是程序结束前执行的语句,也只执行一次

END {

#当每行资料都读取完毕后,开始计算有效封包的端到端延迟时间。

for ( packet_id = 0; packet_id <= highest_uid; packet_id++ )

{

start = start_time[packet_id];

end = end_time[packet_id];

packet_duration = end - start;

#只把接收时间大于传送时间的记录打印出来

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

}

}

二、抖动率

BEGIN {

#程序初始化,设定一变量以记录目前处理过的最高封包序号。

highest_uid = 0;

}

{

event = $1;

time = $2;

node_nb = $3;

node_nb=substr(node_nb,2,1);

trace_type = $4;

flag = $5;

uid = $6

pkt_type = $7;

pkt_size = $8;

#记录目前最高的CBR封包的ID

if ( event=="s" && node_nb==0 && pkt_type=="cbr" && uid > highest_uid )

{

highest_uid = uid;

}

#记录CBR封包的发送时间

if ( event=="s" && node_nb==0 && pkt_type=="cbr" && uid==highest_uid )

start_time[uid] = time;

#记录CBR封包的接收时间

if ( event=="r" && node_nb ==2 && pkt_type=="cbr" && uid==highest_uid )

end_time[uid] = time;

}

END {

# 初始化抖动延时所需的变量

last_seqno = 0;

last_delay = 0;

seqno_diff = 0;

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

for ( packet_id = 0; packet_id <= highest_uid; packet_id++ )

{

start = start_time[packet_id];

end = end_time[packet_id];

packet_duration =end - start;

#只把接收时间大于发送时间的记录列出来

if ( start < end )

{

# 得到了delay值(packet_duration)后计算jitter

seqno_diff = packet_id - last_seqno;

delay_diff = packet_duration - last_delay;

if (seqno_diff == 0)

{

jitter =0;

}

else

{

jitter = delay_diff/seqno_diff;

}

#将有效封包序号以及延时抖动打印出来

printf("%d %f\n", packet_id, jitter);

last_seqno = packet_id;

last_delay = packet_duration;

}

}

}

三、丢包率

BEGIN {

#程序初始化,设定变量记录传输以及被丢弃的包的数目

fsDrops = 0; #被丢弃的包的数目

numfs0 = 0; #0节点发送的CBR封包的数目

numfs2 = 0; #2节点接收的CBR封包的数目

}

{

event = $1;

time = $2;

node_nb = $3;

trace_type = $4;

flag = $5;

uid = $6

pkt_type = $7;

pkt_size = $8;

node_nb=substr(node_nb,2,1);

#统计节点0发送的CBR封包

if (node_nb==0 && event== "s" && trace_type== "MAC" && pkt_type== "cbr")

numfs0++;

#统计节点2丢弃的CBR封包

if (node_nb==2 && event== "r" && trace_type== "MAC" && pkt_type== "cbr")

numfs2++;

}

END {

average=0; #average用于记录丢包率

fsDrops = numfs0-numfs2; #丢包数目

average=fsDrops/numfs0; #丢包率

printf("number of packets sent:%d lost_rate:%d\n", numfs0, average); #打印发送封包数目和丢包率

}


四、吞吐量

BEGIN {

    init=0;
    i=0;

}

{

event = $1;

time = $2;

node_nb = $3;

node_nb=substr(node_nb,2,1);

trace_type = $4;

flag = $5;

uid = $6

pkt_type = $7;

pkt_size = $8;

if(event=="r" && node_nb==2 && pkt_type=="cbr" )

{

    pkt_byte_sum[i+1]=pkt_byte_sum[i]+ pkt_size;   //计算一个累计量

if(init==0)

{

    start_time = time;

    init = 1;

}

    end_time[ i ] = time;

    i = i+1;

    }

}

END {

#为了画图方便,把第一笔记录的throughput设为零,以表示传输开始

printf("%.2f\t%.2f\n", end_time[0], 0);

for(j=1 ; j<i ; j++)

{

th = pkt_byte_sum[j] / (end_time[j] - start_time)*8/1000;

printf("%.2f\t%.2f\n", end_time[j], th);

}

#看图方便,把最后一笔记录的throughput设置为零,以表示传输

printf("%.2f\t%.2f\n", end_time[i-1], 0);

}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NS2是一个广泛使用的网络仿真工具,可以用于模拟各种网络协议和拓扑结构。在NS2中,仿真过程中所有的事件、数据包传输和节点状态等信息都会被记录在trace文件中。因此,分析trace文件是了解仿真过程中发生的事情的关键。 下面是NS2 trace文件分析过程: 1. 打开trace文件:在开始分析之前,需要打开trace文件Trace文件通常位于NS2工作目录下的.tr文件夹中。 2. 选择分析工具:NS2的trace文件可以使用多种工具进行分析,如AWK、Perl、Tcl等。选择一种你熟悉的工具,并根据需要编写相应的脚本。 3. 确定分析的目标:在分析trace文件之前,需要明确你想要了解的内容。例如,你可能想要了解数据包的路由、传输时延、丢包率等信息。 4. 读取trace文件:使用选择的分析工具读取trace文件,并将其存储在内存中以便分析。 5. 解析trace文件:使用编写的脚本解析trace文件,并提取你想要了解的信息。例如,你可以使用AWK命令来查找数据包传输的时间和路由信息。 6. 数据可视化:将提取出的信息可视化,以便更好地理解仿真过程中发生的事件。例如,你可以使用GNUplot来绘制数据包传输时延的折线图。 总之,分析NS2 trace文件是了解仿真过程中发生的事件的关键。通过选择合适的工具和编写脚本,可以提取出有用的信息并进行可视化,从而更好地理解仿真结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值