NS2脚本trace可视化分析

2017年5月26日

通过NS2进行网络模拟,得到相应的科学结论,对于trace的分析是必不可少的过程。下面我简单的介绍对于trace的分析。

1、首先先准备好我们的NS2脚本

 

2、运行我们的tcl脚本

ns sample22.tcl得到nam文件和trace文件

 

 

其中trace文件的数据为:

 

分别表示:

事件 / 时间 / 节点 / 层次 / --- / 分组UID / 分组类型 /分组大小 / [MAC层信息] / ------- / [IP层信息]

1、事件

有4种类型:s,r,d,f,分别表示分组的发送,接收,丢弃,转发事件。

2、节点

表示事件发生的节点。

3、层次

表示事件发生的层次:有

AGT  业务层
RTR  路由层
MAC MAC层

4、MAC层信息

包含四项:a、发送节点在无线信道上发送该分组所期望的时间,16进制表示,单位为秒。

b、接收节点的MAC地址

c、发送节点的MAC地址

d、MAC层封装的分组类型,0x800表示IP分组,0x806表示ARP分组

5、IP层信息

包含四项:a、分送分组的源节点地址,格式为“节点号:端口号”

b、接收分组的目的节点地址,格式为“节点号:端口号”

c、分组的TTL值

d、源节点到目的节点的跳数

 

3、接下来创建delay.awk文件:

# 使用的是无线trace的旧格式

BEGIN {

     highest_packet_id = 0;

}

{

   action = $1;

   time = $2;

   packet_id = $6;

   type = $7;

   

# 不考虑路由包,可以保证序号为0的cbr被统计到

   if ( type != "AODV" ) {

   

   if ( packet_id > highest_packet_id )

 highest_packet_id = packet_id;

 

#记录封包的传送时间

       if ( start_time[packet_id] == 0 )  

start_time[packet_id] = time;

 

#记录CBR 的接收时间

   if ( type == "cbr" && action != "d" ) {

      if ( action == "r" )

         end_time[packet_id] = time;

   } else {

#把不符合条件的数据包的时间设为-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);

   }

}
delay.awk

 

4、执行.awk文件

awk -f delay.awk out.tr

以上脚本的运行为:awk -f [脚本文件名].awk [trace文件]  > [输出文件]

输出:将输出内容保存为delay.tr

5、运行gnuplot

 

 

得到数据图表:

 

 

 

附加脚本:

1.End-to-End Delay

 

    BEGIN {  
        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;  
        if ( packet_id > highest_packet_id )  
            highest_packet_id = packet_id;  
        if ( start_time[packet_id] == 0 )    
                start_time[packet_id] = time;  
        if ( flow_id == 2 && action != "d" ) {  
                if ( action == "r" ) {  
                    end_time[packet_id] = time;  
                }  
        }else{  
                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);  
        }  
    }  
View Code

2.Jitter

    BEGIN {  
        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;  
        if ( packet_id > highest_packet_id ) {  
                highest_packet_id = packet_id;  
            }  
        if ( start_time[packet_id] == 0 )  {  
                pkt_seqno[packet_id] = seq_no;  
                start_time[packet_id] = time;  
        }  
        if ( flow_id == 2 && action != "d" ) {  
                if ( action == "r" ) {  
                    end_time[packet_id] = time;  
                }  
        } else {  
                end_time[packet_id] = -1;  
        }  
    }                                                         
    END {  
            last_seqno = 0;  
            last_delay = 0;  
            seqno_diff = 0;  
            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 ) {  
                        seqno_diff = pkt_seqno[packet_id] - last_seqno;  
                        delay_diff = packet_duration - last_delay;  
                        if (seqno_diff == 0) {  
                                jitter =0;  
                        } else {  
                                jitter = delay_diff/seqno_diff;  
                        }  
                        printf("%f %f\n", start, jitter);  
                        last_seqno = pkt_seqno[packet_id];  
                        last_delay = packet_duration;  
                }  
            }  
    }  
View Code

3.Loss

    BEGIN {  
        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;  
            if (node_1==1 && node_2==2 && action == "+")  
                numFs++;  
            if (flow_id==2 && action == "d")  
                    fsDrops++;  
    }  
    END {  
            printf("number of packets sent:%d lost:%d\n", numFs, fsDrops);  
    }  
View Code

4.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;  
        }  
    }  
    END {  
        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);  
        }  
        printf("%.2f\t%.2f\n", end_time[i-1], 0);  
    }  
View Code

 

                                                                                             (网上摘录如有异议可联系)

posted @ 2017-05-26 19:34  1ey  阅读(1206)  评论(0)    收藏  举报