解析ns2跟踪文件

问题描述:

我使用NS 2.35并试图确定我的路由算法的端到端延迟。解析ns2跟踪文件

我认为任何有良好脚本经验的人都应该能够回答这个问题,可悲的是,那个人不是我。

我有一个跟踪文件,看起来像这样:

- -t 0.548 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1052 -a 0 -x {2.0 17.0 6 ------- null} 
h -t 0.548 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1052 -a 0 -x {2.0 17.0 -1 ------- null} 
+ -t 0.55 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1056 -a 0 -x {2.0 17.0 10 ------- null} 
+ -t 0.555 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1057 -a 0 -x {2.0 17.0 11 ------- null} 
r -t 0.556 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1047 -a 0 -x {2.0 17.0 1 ------- null} 
+ -t 0.556 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1047 -a 0 -x {2.0 17.0 1 ------- null} 
- -t 0.556 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1047 -a 0 -x {2.0 17.0 1 ------- null} 

但这里是我需要做的。

一条以+开头的行是当一个新数据包被添加到网络时。 以r开头的行是目的地收到数据包的时候。 -t之后的双重数字是事件发生的时间。最后,-i是数据包的标识。

对于我来计算平均端到端延迟,我需要在-i之后找到每个具有特定id的行。从那里我需要计算r的时间戳减去+的时间戳

所以我认为可能有一个正则表达式由空格分隔。我可以将每个分段放入自己的变量中。然后我会检查15号(包ID)。

但我不知道该从哪里走,或如何把它放在一起。

我知道网上有一些AWK脚本可以做到这一点,但它们都过时了,并且不符合当前格式(我不知道如何更改它们)。

任何帮助将不胜感激。

编辑:

这里就是我希望找到一个完整的数据包路由的实例。 我已经在这些之间取出了很多行,以便您可以看到单个数据包事件。

# a packet is enqueued from node 2 going to node 7. It's ID is 1636. this was at roughly 1.75sec 
+ -t 1.74499999999998 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# at 2.1s, it left node 2. 
- -t 2.134 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# at 2.134 it hopped from 2 to 7 (not important) 
h -t 2.134 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 -1 ------- null} 
# at 2.182 it was received by node 7 
r -t 2.182 -s 2 -d 7 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# it was the enqueued by node 7 to be sent to node 12 
+ -t 2.182 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# slightly later it left node 7 on its was to node 12 
- -t 2.1832 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# it hopped from 7 to 12 (not important) 
h -t 2.1832 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 -1 ------- null} 
# received by 12 
r -t 2.2312 -s 7 -d 12 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# added to queue, heading to node 17 
+ -t 2.2312 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# left for node 17 
- -t 2.232 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 
# hopped to 17 (not important) 
h -t 2.232 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 -1 ------- null} 
# received by 17 notice the time delay 
r -t 2.28 -s 12 -d 17 -p cbr -e 500 -c 0 -i 1636 -a 0 -x {2.0 17.0 249 ------- null} 

脚本将承认2.134为开始时间,并为2.28结束,然后给我的0.146sec延迟的理想输出。它会为所有数据包ID执行此操作,并只报告平均值。

有人要求我扩展一下文件的工作方式,以及我的期望。

该文件列出了约10,000个数据包的说明。每个数据包可以处于不同的状态。重要的状态是+,这意味着一个数据包已经在一个路由器入队,而r这意味着数据包已经被它的目的地接收。

有可能一个被入队的数据包(因此+入口)没有被实际接收,而是被丢弃。这意味着我们不能假定每个+条目都会有一个r条目。

我试图衡量的是平均端到端延迟。这意味着,如果你看一个单一的数据包,就会有一段时间它被排队,并且它会被接收。我需要做这个计算来找到它的端到端延迟。但我还需要为9,999个其他数据包来获得平均值。

我已经考虑过更多,并且总体来说我认为算法需要工作。

  • 删除不与+r开始,因为它们是不重要的所有行。
  • 检查所有数据包ID(即-i后面的数字,例如1052),并将它们放入某种组(也许是多个数组)。
  • 每个组现在应该包含有关特定数据包的所有信息。
  • 组内,检查是否有+,理想情况下我们想要第一个+。记录下它的时间。
  • 寻找更多+行。看看他们的时间。日志可能有点混乱。所以它可能会有一个+线,事实上在模拟的早些时候。
  • 如果这个新的+行有一个更早的时间,然后用它更新时间变量。
  • 假设没有更多+行,请查找r行。
  • 如果没有r行,数据包就被丢弃,所以不用担心。
  • ,每r线你会发现,我们需要做的是找到谁拥有最新的时间戳
  • 与最新的时间戳r线是在数据包终于收到了一个。
  • r时间中减去+时间,这给了我们分组传送所花费的时间。
  • 将此值添加到数组中,以便稍后对其进行平均。
  • 在每个数据包ID组上重复这个过程,然后最终平均所创建的延迟数组。

这就是很多打字,但我认为它的清晰,因为我可以在我想要的。我希望我是一个正则表达式大师,但我没有足够的时间去学习它来完成这个任务。

感谢您的帮助,如果您有任何问题,请告诉我。

+2

如果你不介意,你能展示你的最终结果应该是什么样子?这有点难以理解。例如 –

+0

以'-'和'h'开头的行是什么? –

+0

1)当你运行这个,它会是一个特定的身份,还是你想做这个匹配的文件中的所有身份? 2)您在工作文件中预计多大/多少行?我们在谈论多MB文件吗? –

没有太多在这里工作,因为伊恩在评论你的问题说,但如果我理解你想要正确地做什么,这样的事情应该工作:

awk '/^[+r]/{$1~/r/?r[$15]=$2:r[$15]?d[$15]=r[$15]-$2:1} END {for(p in d){sum+=r[p];num++}print sum/num}' trace.file 

它跳过所有行不以'+'或'r'开头。如果该行以'r'开始,则会向r数组添加时间。否则,它计算延迟并将其添加到d数组,如果在r数组中找到该元素。最后,它遍历d数组中的元素,将总延迟和元素数加起来,并从中计算平均值。在你的情况下,平均值为0.

:1在主块的末尾就在那里,所以我可以用三元表达式来代替明显更冗长的if语句。

编辑:新的表达与添加的条件下工作:

awk '/^[+r]/{$1~/r/?$3>r[$15]?r[$15]=$3:1:!a[$15]||$3<a[$15]?a[$15]=$3:1} END {for(i in r){sum+=r[i]-a[i];num++}print "Average delay", sum/num}' 

或作为一个awk文件

/^[+r]/ { 
    if ($1 ~ /r/) { 
    if ($3 > received[$15]) 
     received[$15] = $3; 
    } else { 
    if (!added[$15] || $3 < added[$15]) 
     added[$15] = $3; 
    } 
} END { 
    for (packet in received) { 
    sum += received[packet] - added[packet]; 
    num++ 
    } 
    print "Average delay", sum/num 
} 

根据你的算法好像1.745将是开始时间,而你写的是2.134。