3

我正在使用 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 组重复此过程,然后最后平均创建的延迟数组。

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

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

4

1 回答 1

3

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

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。

于 2011-12-01T13:41:17.330 回答