解析ns2跟踪文件[关闭]

Posted

技术标签:

【中文标题】解析ns2跟踪文件[关闭]【英文标题】:parsing ns2 trace file [closed] 【发布时间】:2012-01-10 07:34:14 【问题描述】:

我正在使用 NS 2.35 并试图确定我的路由算法的端到端延迟。

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

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

- -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.146 秒的延迟。它将对所有数据包 ID 执行此操作,并且只报告平均值。

有人要求我稍微扩展一下文件的工作原理以及我的预期。

该文件列出了大约 10,000 个数据包的描述。每个数据包可以处于不同的状态。重要的状态是+,表示数据包已在路由器排队,r,表示数据包已被其目的地接收。

一个入队的数据包(所以一个+ 条目)可能实际上并没有被接收到,而是被丢弃了。这意味着我们不能假设每个+ 条目都会有一个r 条目。

我要衡量的是平均端到端延迟。这意味着,如果您查看单个数据包,它将有一个入队时间和一个接收时间。我需要进行此计算以找到其端到端延迟。但我还需要对其他 9,999 个数据包进行此操作以获得平均值。

我已经考虑了更多,这就是我认为算法需要如何工作的一般情况。

删除所有不以+r 开头的行,因为它们不重要。 遍历所有数据包ID(即-i 后面的数字,例如示例中的1052),并将它们放入某种组(可能是多个数组)。 现在每个组都应该包含有关特定数据包的所有信息。 在组内,检查是否有 +,理想情况下我们想要第一个 +。记录它的时间。 寻找更多+ 行。看看他们的时间。日志可能有点混乱。因此,后面可能有一条+ 行,实际上是在模拟的早期。 如果这个新的+ 行有一个更早的时间,那么用它更新时间变量。 假设没有更多的+ 行,查找r 行。 如果没有r 行,数据包被丢弃,所以不用担心。 对于您找到的每一行 r,我们需要做的就是找到具有最新时间戳的那一行 带有最新时间戳的r 行是最终收到数据包的位置。 从r 时间中减去+ 时间,这就是数据包传输所用的时间。 将此值添加到数组中,以便稍后对其进行平均。 对每个数据包 ID 组重复此过程,然后最终平均创建的延迟数组。

这是很多打字,但我认为它尽可能清楚地表达我想要的。我希望我是一个正则表达式大师,但我只是没有时间好好学习它来完成它。

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

【问题讨论】:

如果您不介意,您能展示一下您的最终结果应该是什么样子吗?这有点难以理解。 例如以-h开头的行是什么? 1) 当你运行这个时,它是针对一个特定的身份,还是你想对文件中的所有身份进行匹配? 2) 您希望工作文件中有多大/多少行?我们是在谈论多 MB 文件吗? 你需要什么?将每个项目放入匹配组的正则表达式,还是仅匹配 -i #### 部分? 通过“双重类型”,您的意思似乎是“浮点”。 :) 【参考方案1】:

正如 Iain 在 cmets 中对您的问题所说的那样,这里没有什么可做的,但是如果我理解您想要正确执行的操作,那么这样的事情应该可以工作:

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 数组添加时间。否则,如果在 r 数组中找到元素,它会计算延迟并将其添加到 d 数组中。最后,它遍历 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。

【讨论】:

以上是关于解析ns2跟踪文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何创建跟踪 (SQL Server Profiler)

Android 逆向Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

GIT找出update-index --assume-unchanged关闭跟踪的文件

如何使现有分支跟踪远程分支[关闭]

我如何跟踪 ionic 2 中 app.component.ts 中的每个错误 [关闭]

捕获svclog文件的第二个E2ETraceEvent