s 2.35 柯志亨书-实验3笔记-TCP UDP模拟 ——计算CBR不同参数:抖动、吞吐率、丢包率awk代码

时间:2022-12-28 23:59:11

计算CBR抖动的awk代码:

# Measure the end to end delay jitter by the trace file
# 计算方法:抖动率由相邻数据包延迟时间差除以数据包序号差得到;
# jitter = ( (trecvj-tsndj) - (trecvi-tsndi) ) / (j-i), j>i

BEGIN{
	# program initialize
	highest_packet_id = 0;
}

{

action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $10;
seq_no = $11;
packet_id = $12;

# Record the current max packet ID
if ( packet_id > highest_packet_id )
	highest_packet_id = packet_id;

# Record the tx time of packet
if ( start_time[packet_id] == 0 )
{	
	pkt_seqno[packet_id] = seq_no;
	start_time[packet_id] = time;
}

# Record CBR flow_id=2 rx time
if ( flow_id == 2 && action != "d" )
{
	if (action == "r")
	{
		end_time[packet_id] = time;
	}
}
else
	end_time[packet_id] = -1;
}

END {
# When read over, start to calculate
	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];
		duration = start-end;
		if (start<end)
		{	
			# calc jitter
			seqno_diff = pkt_seqno[packet_id]-last_seqno;
			delay_diff = 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 = duration;
		}
	}
}

s 2.35 柯志亨书-实验3笔记-TCP UDP模拟 ——计算CBR不同参数:抖动、吞吐率、丢包率awk代码

计算吞吐率的代码:

# Measure the CBR average throughput by the trace file
# throughput = byte cnt / time interval
# time interval = cur_time - start_time

BEGIN{
	# program initialize
	init = 0;
	i = 0;
}

{
action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $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;
	if(init==0)
	{
		start_time=time;
		init=1;
	}
	end_time[i]=time;
	i=i+1;
}

}

END {
# When read over, start to calculate
	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);
	}
# 书中说,为了画图好看,一开始和最后都设为0,最后的0似乎有点不妥
	#printf("%.2f\t%.2f\n", end_time[0], 0);
}
s 2.35 柯志亨书-实验3笔记-TCP UDP模拟 ——计算CBR不同参数:抖动、吞吐率、丢包率awk代码

计算丢包率:

# Measure the CBR packet loss rate by the trace file

BEGIN{
	# program initialize
	fsDrops = 0;
	numFs = 0;
}

{
action = $1;
time = $2;
from = $3;
to = $4;
type = $5;
pktsize = $6;
flow_id = $8;
src = $9;
dst = $10;
seq_no = $11;
packet_id = $12;

# Record how many packets sent from n1
if ( from==1 && to==2 && action=="+" )
	numFs++;

# Record flow_id is 2 and dropped
if ( flow_id==2 && action=="d" )
	fsDrops++;
}

END {
# When read over, start to calculate
	printf("number of pkts sent:%d, lost:%d, loss rate:%f\n", numFs,fsDrops,fsDrops/numFs);
}

number of pkts sent:550, lost:8, loss rate:0.014545