我正在使用 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 个数据包进行此操作以获得平均值。
我已经考虑了更多,这通常是我认为算法需要工作的方式。
+
删除所有不以 a或 an开头的行,r
因为它们不重要。- 遍历所有数据包 ID(即 -i 之后的数字,例如示例中的 1052),并将它们放入某种组(可能是多个数组)。
- 每个组现在应该包含有关特定数据包的所有信息。
- 在组内,检查是否有 +,理想情况下我们想要第一个 +。记录它的时间。
- 寻找更多的
+
行。看看他们的时间。日志可能有点混乱。+
因此,后面可能有一条线实际上在模拟中更早。 - 如果这个新
+
行有一个更早的时间,那么用那个更新时间变量。 - 假设没有更多
+
的线,寻找一条r
线。 - 如果没有
r
线路,则数据包被丢弃,所以不要担心。 - 对于您找到的每一
r
行,我们需要做的就是找到具有最新时间戳的行 - 具有最新时间戳的
r
行是最终收到数据包的位置。 +
从时间中减去r
时间,这给了我们数据包传输所花费的时间。- 将此值添加到数组中,以便稍后对其进行平均。
- 对每个数据包 ID 组重复此过程,然后最后平均创建的延迟数组。
那是很多打字,但我认为它尽可能清楚地表达我想要的。我希望我是一个正则表达式大师,但我只是没有时间好好学习它来完成它。
感谢您的所有帮助,如果您有任何问题,请告诉我。