步骤:
1、ns XXX.tcl
2、gawk -f xxx.awk XXX.tr > xxx.txt(注意:这里的xxx分别为:ys\ttl\dbl)
3、gnuplot xxx.plot(xxx和步骤2一样)
AWK文件:
- 吞吐量:
BEGIN{
init=0;
i=0;
}
{
event = $1;
time = $2;
pkt_type = $7;
pkt_size = $8;
rount_type = $4;
if(event=="r" && pkt_type=="tcp" && rount_type=="RTR")
{
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 {
for(j=1;j<i;j++)
{
tm = end_time[j]-start_time;
if (tm != 0){
th = (pkt_byte_sum[j]/tm)*8/1000;
tm2=end_time[j];
printf("%.9f\t%.2f\n", tm2, th);
}
}
}
- 延时
BEGIN {
highest_uid=0;
spro_time=0;
rpro_time=0;
}
#下面大括号里面的内容会针对要进行处理的记录(也就是我们的trace文件)的每一行都重复执行一次
{
event = $1; #$1表示一行的第一栏,是事件的动作。每一栏默认是以空格分隔的。下同。
time = $2; #事件发生的时间
trace_type = $4; #trace文件跟踪事件的层次(指在路由层或mac层等等)
flag = $5; #分隔符
uid = $6; #包的uid号码(普通包头的uid)
pkt_type = $7; #包的类型(是信令或是数据)
pkt_size = $8; #包的大小(byte)
if (pkt_type=="tcp"&&uid>=highest_uid) {
highest_uid=uid;
}
if ( event=="s" && pkt_type=="tcp" && trace_type=="RTR" && time > spro_time){
start_time[uid] = time;
spro_time=time;
}
if ( event=="r" && pkt_type=="tcp" && trace_type=="RTR" && time > rpro_time ){
end_time[uid] = time;
rpro_time=time;
}
}
END {
tmp = 0;
printf("%f %f\n", 0, 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 ( packet_duration>0&& start > tmp) {
printf("%f %f\n", start, packet_duration);
tmp=start;
}
}
}
- 丢包率
BEGIN {
#程序初始化,设定变量记录传输以及被丢弃的包的数目
fsDrops = 0; #被丢弃的包的数目
numfs0 = 0; #0节点发送的CBR封包的数目
numfs2 = 0; #2节点接收的CBR封包的数目
i=0;
}
{
event = $1;
time = $2;
trace_type = $4;
uid = $6;
pkt_type = $7;
pkt_size = $8;
#统计发送的CBR封包
if (event== "s" && trace_type== "RTR" && pkt_type== "tcp"){
numfs0++;
send_pak[i]=numfs0;
}
#统计丢弃的CBR封包
if (event== "r" && trace_type== "RTR" && pkt_type== "tcp"){
numfs2++;
end_time[i]=time;
recv_pak[i]=numfs2;
i=i+1;
}
}
END {
tmp=0;
printf("%f %f\n", 0, 0); #打印发送封包数目和丢包率
for (j = 0; j < i; j++){
if(send_pak[j] != 0){
average=0; #average用于记录丢包率
fsDrops = recv_pak[j]-send_pak[j]; #丢包数目
average=fsDrops/send_pak[j]; #丢包率
tm=sprintf("%.2f",end_time[j]);
if(average>0 && tm > tmp){
printf("%f %f\n", tm, average); #打印发送封包数目和丢包率
tmp=tm;
}
}
}
}
plot文件
- 吞吐量
set terminal gif
set output "throughput.gif"
set title "ttl_fuzzy<thoughput>"
set xlabel "(time)"
set ylabel "(throughput)"
set xtics nomirror
unset x2tics
set ytics nomirror
unset y2tics
unset key
plot "ttl.txt" using 1:2 with lines
replot
- 延时
set terminal gif
set output "delay.gif"
set title "ys_fuzzy<delay>"
set xlabel "(stime)"
set ylabel "(delay)"
set xtics nomirror
unset x2tics
set ytics nomirror
unset y2tics
unset key
#plot "ys.txt" using 1:2 with impulses
plot "ys.txt" using 1:2 with lines
replot
- 丢包率
set terminal gif
set output "loss.gif"
set title "dbl_fuzzy<loss>"
set xlabel "(time)"
set ylabel "(loss)"
set xtics nomirror
unset x2tics
set ytics nomirror
unset y2tics
unset key
plot "dbl.txt" using 1:2 with lines
replot
本文详细介绍了使用NS2网络模拟器进行数据包处理的过程,包括吞吐量、延迟和丢包率的计算方法。通过AWK脚本解析NS2生成的trace文件,获取关键网络性能指标,并利用gnuplot进行数据可视化。
642

被折叠的 条评论
为什么被折叠?



