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の後にパケットのIDがあります。

平均エンドツーエンド遅延を計算するには、-iの後に特定のIDを持つすべての行を見つける必要があります。rそこから、のタイムスタンプからマイナスのタイムスタンプを計算する必要があります。+

したがって、スペースで区切られた正規表現が存在する可能性があると思います。それぞれのセグメントを独自の変数に入れることができます。次に、15日(パケットID)を確認します。

しかし、そこからどこに行くのか、それをどのようにまとめるのかはわかりません。

これを行うためのAWKスクリプトがWeb上にいくつかあることは知っていますが、それらはすべて古く、現在の形式に適合していません(そして、それらを変更する方法がわかりません)。

どんな助けでも大歓迎です。

編集:

これが私が見つけようとしている完全なパケットルートの例です。これらの行の間にたくさんの行を取り出して、単一のパケットイベントを確認できるようにしました。

# 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(つまり、例の1052などの-iの後の番号)を調べて、それらをある種のグループ(おそらく複数の配列)に入れます。
  • これで、各グループに特定のパケットに関するすべての情報が含まれるはずです。
  • グループ内で、+があるかどうかを確認します。理想的には、最初の+が必要です。その時間を記録します。
  • +これ以上の行を探します。彼らの時間を見てください。ログが少し乱雑になっている可能性があります。したがって、+実際にはシミュレーションの早い段階にある行が後で存在する可能性があります。
  • この新しい+行の時刻が早い場合は、時刻変数をそれで更新します。
  • これ以上行がないと仮定して+、行を探します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 に答える