packetdat.awk 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. BEGIN {
  2. # we need to know (usual) packet size to convert byte numbers
  3. # to packet numbers
  4. if (packetsize <= 0)
  5. packetsize = 512
  6. }
  7. $5 !~ /[SR]/ {
  8. # print out per-packet data in the form:
  9. # <packet #>
  10. # <start sequence #>
  11. # <1st send time>
  12. # <last send time>
  13. # <1st ack time>
  14. # <last ack time>
  15. # <# sends>
  16. # <# acks>
  17. n = split ($1,t,":")
  18. tim = t[1]*3600 + t[2]*60 + t[3]
  19. if ($6 != "ack") {
  20. i = index($6,":")
  21. strtSeq = substr($6,1,i-1)
  22. id = 1.5 + (strtSeq - 1) / packetsize
  23. id -= id % 1
  24. if (maxId < id)
  25. maxId = id
  26. if (firstSend[id] == 0) {
  27. firstSend[id] = tim
  28. seqNo[id] = strtSeq
  29. }
  30. lastSend[id] = tim
  31. timesSent[id]++
  32. totalPackets++
  33. } else {
  34. id = 1 + ($7 - 2) / packetsize
  35. id -= id % 1
  36. timesAcked[id]++
  37. if (firstAck[id] == 0)
  38. firstAck[id] = tim
  39. lastAck[id] = tim
  40. totalAcks++
  41. }
  42. }
  43. END {
  44. print "# " maxId " chunks. " totalPackets " packets sent. " \
  45. totalAcks " acks."
  46. # for packets that were implicitly acked, make the ack time
  47. # be the ack time of next explicitly acked packet.
  48. for (i = maxId-1; i > 0; --i)
  49. while (i > 0 && firstAck[i] == 0) {
  50. lastAck[i] = firstAck[i] = firstAck[i+1]
  51. --i
  52. }
  53. tzero = firstSend[1]
  54. for (i = 1; i <= maxId; i++)
  55. printf "%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t%d\n",\
  56. i, seqNo[i], \
  57. firstSend[i] - tzero, lastSend[i] - tzero,\
  58. firstAck[i] - tzero, lastAck[i] - tzero,\
  59. timesSent[i], timesAcked[i]
  60. }