【发布时间】: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 ####部分? -
通过“双重类型”,您的意思似乎是“浮点”。 :)
标签: regex bash parsing awk ns2