2011-12-01 115 views
4

我使用NS 2.35並試圖確定我的路由算法的端到端延遲。解析ns2跟蹤文件

我認爲任何有良好腳本經驗的人都應該能夠回答這個問題,可悲的是,那個人不是我。

我有一個跟蹤文件,看起來像這樣:

- -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.146sec延遲的理想輸出。它會爲所有數據包ID執行此操作,並只報告平均值。

有人要求我擴展一下文件的工作方式,以及我的期望。

該文件列出了約10,000個數據包的說明。每個數據包可以處於不同的狀態。重要的狀態是+,這意味着一個數據包已經在一個路由器入隊,而r這意味着數據包已經被它的目的地接收。

有可能一個被入隊的數據包(因此+入口)沒有被實際接收,而是被丟棄。這意味着我們不能假定每個+條目都會有一個r條目。

我試圖衡量的是平均端到端延遲。這意味着,如果你看一個單一的數據包,就會有一段時間它被排隊,並且它會被接收。我需要做這個計算來找到它的端到端延遲。但我還需要爲9,999個其他數據包來獲得平均值。

我已經考慮過更多,並且總體來說我認爲算法需要工作。

  • 刪除不與+r開始,因爲它們是不重要的所有行。
  • 檢查所有數據包ID(即-i後面的數字,例如1052),並將它們放入某種組(也許是多個數組)。
  • 每個組現在應該包含有關特定數據包的所有信息。
  • 組內,檢查是否有+,理想情況下我們想要第一個+。記錄下它的時間。
  • 尋找更多+行。看看他們的時間。日誌可能有點混亂。所以它可能會有一個+線,事實上在模擬的早些時候。
  • 如果這個新的+行有一個更早的時間,然後用它更新時間變量。
  • 假設沒有更多+行,請查找r行。
  • 如果沒有r行,數據包就被丟棄,所以不用擔心。
  • ,每r線你會發現,我們需要做的是找到誰擁有最新的時間戳
  • 與最新的時間戳r線是在數據包終於收到了一個。
  • r時間中減去+時間,這給了我們分組傳送所花費的時間。
  • 將此值添加到數組中,以便稍後對其進行平均。
  • 在每個數據包ID組上重複這個過程,然後最終平均所創建的延遲數組。

這就是很多打字,但我認爲它的清晰,因爲我可以在我想要的。我希望我是一個正則表達式大師,但我沒有足夠的時間去學習它來完成這個任務。

感謝您的幫助,如果您有任何問題,請告訴我。

+2

如果你不介意,你能展示你的最終結果應該是什麼樣子?這有點難以理解。例如 –

+0

以'-'和'h'開頭的行是什麼? –

+0

1)當你運行這個,它會是一個特定的身份,還是你想做這個匹配的文件中的所有身份? 2)您在工作文件中預計多大/多少行?我們在談論多MB文件嗎? –

回答

3

沒有太多在這裏工作,因爲伊恩在評論你的問題說,但如果我理解你想要正確地做什麼,這樣的事情應該工作:

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數組添加時間。否則,它計算延遲並將其添加到d數組,如果在r數組中找到該元素。最後,它遍歷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。