在measure-delay.awk的代码中,发现如下语句有变量没有定义:
if ( start_time[packet_id] == 0 )
start_time[packet_id] = time;
对于start_time[packet_id],代码前后都没有对start_time进行定义,那么如何对它的值进行判断。查阅网上资料得知:
在awk类型的代码文件中,数组称为关联数组,它的序号标记可以是数字也可以是字符串。awk中的数组可以不用提前对它进行声明,也不用声明大小。数组元素用 0 或空字符串来初始化。
因此,所有start_time[packet_id]都初始化为0,对于每个packet_id都可以赋给它初始时间。
另外这里用了pkt id这个字段,它和seq num字段有什么区别呢?查阅网上资料得知:
pkt id是每个数据包的唯一识别,仔细看可以发现cbr,tcp,ack都按照自己的规则进行id的增减,seq num 是物理传输层对于不同包的区分,在整个网络仿真过程中是顺序累计的,不论是何种协议。换句话说,如果你的数据包进行重发,pkt id是不变的,因为对上层协议这个数据没有变,但是物理传输层会认为是一次新的发送,于是增加seq num。
但是,seq num对于不同的传输层协议是分开计算的,而pkt id则不是,比如对于一个trace文件,之前的数据都是cbr的,两个序号一直都一样,当出现一个tcp的数据包时,seq num是从零开始计算的,而pkt id则在之前的基础上累加,当再次出现cbr数据包时,从上一个cbr的seq num进行累加。