常用工具以及结果分析 画图, gnuplot,xgraph 分析trace文件 文本处理工具gawk 命令格式 丢包/吞吐量/延迟 命令格式 gawk –f delay.awk output.tr 画图, gnuplot,xgraph 命令格式如下,示例演示 % gnuplot delay.plot
Trace文件片断: r 1.497941 2 3 cbr 210 ------- 2 1.0 3.1 764 828 d 1.49852 2 3 cbr 210 ------- 2 1.0 3.1 826 916 r 1.498929 2 3 cbr 210 ------- 2 1.0 3.1 765 829 + 1.49944 1 2 cbr 210 ------- 2 1.0 3.1 833 927 - 1.49944 1 2 cbr 210 ------- 2 1.0 3.1 833 927 r 1.499918 2 3 cbr 210 ------- 2 1.0 3.1 766 830 r 1.5002 1 2 cbr 210 ------- 2 1.0 3.1 827 917 + 1.5002 2 3 cbr 210 ------- 2 1.0 3.1 827 917 d 1.5002 2 3 cbr 210 ------- 2 1.0 3.1 827 917 - 1.500529 2 3 cbr 210 ------- 2 1.0 3.1 773 841 + 1.50112 1 2 cbr 210 ------- 2 1.0 3.1 834 928 - 1.50112 1 2 cbr 210 ------- 2 1.0 3.1 834 928 - 1.501518 2 3 cbr 210 ------- 2 1.0 3.1 774 842
TRACE文件 Trace文件分析: r 1.497941 2 3 cbr 210 ----- 2 1.0 3.1 764 828 包类型 发生时间 分组ID 起始节点 包大小 包所属应用的fid 接收方 事件类型: r: 到达节点 d: 丢弃 +:入队 -:出队 发送源 达到节点 分组 序号 第8列 IPV6定义的流标识符 (flow id) 10列和11列分别表示了分组的源地址和目标地址。 3.2表示3号节点的2号端口 最后一列是分组的唯一标识符。模拟中任何一个新创建的分组都会被指定一个新的唯一的标识符
awk工具 文本处理工具,可直接在命令行中进行处理; 程序语言编程,可将多条命令写成脚本文件; 语法与C语言类似; 自身语法特点: 变量不需定义; 从指定文件中自动循环读取每一行数据,直到文件结束; 自动将每一行数据分割成多个域(字段),自动更新内建参数的值($n), 特别的,“$i”(i>=0)表示当前读取行中第i+1个域,$0表示整行数据;
比如:自动读取trace文件每一行数据,并将各个字段值分配给变量(12个字段) r 1.497941 2 3 cbr 210 ------- 2 1.0 3.1 764 828 比如:自动读取trace文件每一行数据,并将各个字段值分配给变量(12个字段) { action=$1; time=$2; from=$3; to=$4; type = $5; pktsize=$6; flow_id=$8; node_1_address=$9; node_2_address=$10; seq_no=$11; packet_id=$12; }
Gawk程序的框架 脚本文件结构: BEGIN{处理前准备语句在此} {处理中语句在此} END{处理后语句在此} BEGIN 和 END模块可省 SeaSon 计算机学院-数据库中心
Gawk程序的框架 BEGIN{…}模块:初始化,通常用来给变量赋初值;如 BEGIN { pktDrops = 0; numPkt=0;} #分号可省略 用来在处理开始前给两个变量赋初始值. END{…}模块:扫尾工作,通常在文本文件读取完以后所作的工作,如 END{ if(number==1000) { print number}; # printf(“number=%d”,number) }
Gawk程序的框架 BEGIN { AgtNum = 0; } { if ($1 == "s" && $5 == "AGT") END{ printf(" Num of AGT pkts: %d \n", AgtNum); 最后保存文agtnum.awk文件 r 1.497941 2 3 cbr 210 ------- 2 1.0 3.1 764 828 SeaSon 计算机学院-数据库中心
awk工具 例:[Loss] 统计CBR从节点n1发出的包总数和丢包总数,计算丢包率; 发包总数: if(from==1 && to==2 && action==“+”) numPkt++; 丢包总数: if(flow_id==2 && action==“d”) pktDrops++; 丢包率:pktDrops / numpkt;
if(from==1 && to==2 && action==“+”) numPkt++; #丢包总数: BEGIN {pktDrops=0;numPkt=0;} { action=$1; time=$2; from=$3; to=$4; type = $5; pktsize=$6; flow_id=$8; node_1_address=$9; node_2_address=$10; seq_no=$11; packet_id=$12; #发包总数: if(from==1 && to==2 && action==“+”) numPkt++; #丢包总数: if(flow_id==2 && action==“d”) pktDrops++; } END{ printf(“loss rate=%.2f\n”, pktDrops/ numPkt);
awk工具 例 [throughput] 统计节点n3处收到的所有包的大小之和,除以所用时间长度。 if(action==“r” && from==2 && to==3) { pkt_byte_sum[i+1]=pkt_byte_sum[i]+pktsize; end_time[i] = time; i++; }
if(action==“r” && from==2 && to==3 &&flow_id==2) { BEGIN {flag=0;i=0;} { action=$1; time=$2; from=$3; to=$4; type = $5; pktsize=$6; flow_id=$8; node_1_address=$9; node_2_address=$10; seq_no=$11; packet_id=$12; if(action==“r” && from==2 && to==3 &&flow_id==2) { pkt_byte_sum[i+1]=pkt_byte_sum[i]+ pktsize; end_time[i] = time; i++; if(flag==0) { start_time=time; flag=1; } END{ 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) }
awk工具 例 [delay] 统计每个包的发送时间和接收时间。 发送时间: if ((action == “s”)&&(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; }
awk工具 例 [delay] 计算延迟: for(packet_id=0;packet_id<=highest_packet_id;packet_id++) { start= start_time[packet_id]; end= end_time[packet_id]; packet_delay=end-start; if(start<end) printf(“%f %f\n”,start,packet_delay); }
if(packet_id>highest_packet_id) highest_packet_id=packet_id; if ((action == “s”)&&(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_delay=end-start; if(start<end) printf(“%f %f\n”,start,packet_delay); BEGIN{ highest_packet_id=0; } { action=$1; time=$2; from=$3; to=$4; type = $5; pktsize=$6; flow_id=$8; node_1_address=$9; node_2_address=$10; seq_no=$11; packet_id=$12;
awk工具 执行 若是要把结果存到档案,可使用导向的方式。 awk –f loss.awk out.tr awk–f throughput.awk out.tr > throughput.tr awk–f delay.awk out.tr > delay.tr
画图工具gnuplot 命令驱动的交互式画图软件 把数据资料和数学函数转换成容易观察的平面或立体图形——》数据分析 从数据文件中读入数据并绘制图形 读取数据文件的前两列, 将第一列的值作为x轴数据,第二列作为y轴数据;
画图工具 gnuplot>plot “throughput.tr” with lines/points/linespoints gnuplot>set title “cbr_throughput” #设置title gnuplot>set xlabel “time” #设置横轴名称 gnuplot>set ylabel “delay”#设置纵轴名称 gnuplot>set grid #设置显示网格 gnuplot>? #显示帮助 gnuplot>help set #显示set的帮助 线/点/点和线都画
画图工具 图形输出到文件: gnuplot>set terminal jpeg #定义输出格式 gnuplot>set output “throughput.jpg” #定义输出文件名称 gnuplot>replot #输出(前面已经运行过plot) 在gnuplot中,输出文件的格式是由terminal来控制的。默认的情况下,都是输出到屏幕,即终端模式为X11。如果想输出到文件,则必须对terminal进行设置。要了解有那些终端类型,可以输入 set terminal后回车,所有支持的终端模式(或文件格式)都列出来了 但是请注意,运行完这条命令后,还仅仅是定义了输出文件的名字,实际上,图还没画到这个文件里去。因此运行这两条命令还只是进行了必须的设置。然后运行如下命令 gnuplot>replot(假如前面已经运行过plot或replot命令的话) 这时,图形就在上面指定的文件中了。 要输出为其它格式,同样要进行这样的设置,比如要输出为jpg格式,则在运行画图命令前先运行如下命令: gnuplot>set terminal jpeg gnuplot>set output ‘a.jpg’
delay
throughput
分析trace文件,要求对延时进行分析,并使用gawk提炼数据,用gnuplot绘图 有三条数据流: DSR ARP TCP(如何区分) 发送 代表性的数据行(可选择第9秒开始的) 接收 代表性的数据行
New Trace r -t 23.497055139 -Hs 5 -Hd 5 -Ni 5 -Nx 1000.00 -Ny 400.00 -Nz 0.00 -Ne 6.730575 -Nl AGT -Nw --- [0.01 5 12] -Is 0.0 -Id 5.0 -It cbr -Il 50 -If 0 -Ii 215 -Iv 28 -Pn cbr -Pi 22 -Pf 0 -Po 0 § N: Node Property § I: IP Level Packet Information § H: Next Hop Information § M: MAC Level Packet Information § P: Packet Specific Information Wireless event + IP trace + CBR trace NI: Network trace Level (AGT, RTR, MAC, etc.) Is: Source Address And Port Id: Destination Address And Port Il: Packet Size lt: Packet Type Pi: Sequence Number Hs Hd 逐跳的信息 hop source, hop destination