send-ack.awk 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. BEGIN {
  2. # we need the number of bytes in a packet to do the output
  3. # in packet numbers rather than byte numbers.
  4. if (packetsize <= 0)
  5. packetsize = 512
  6. expectNext = 1
  7. lastwin = -1
  8. }
  9. {
  10. # convert tcp trace to send/ack form.
  11. n = split ($1,t,":")
  12. tim = t[1]*3600 + t[2]*60 + t[3]
  13. if (NR <= 1) {
  14. tzero = tim
  15. ltim = tim
  16. OFS = "\t"
  17. }
  18. if ($6 != "ack") {
  19. # we have a data packet record:
  20. # ignore guys with syn, fin or reset 'cause we
  21. # can't handle their sequence numbers. Try to
  22. # detect and add a flag character for 'anomalies':
  23. # * -> re-sent packet
  24. # - -> packet after hole (missing packet(s))
  25. # # -> odd size packet
  26. if ($5 !~ /[SFR]/) {
  27. i = index($6,":")
  28. j = index($6,"(")
  29. strtSeq = substr($6,1,i-1)
  30. endSeq = substr($6,i+1,j-i-1)
  31. len = endSeq - strtSeq
  32. id = endSeq
  33. if (! timeOf[id])
  34. timeOf[id] = tim
  35. if (endSeq - expectNext < 0)
  36. flag = "*"
  37. else {
  38. if (strtSeq - expectNext > 0)
  39. flag = "-"
  40. else if (len != packetsize)
  41. flag = "#"
  42. else
  43. flag = " "
  44. expectNext = endSeq
  45. }
  46. printf "%7.2f\t%7.2f\t%s send %s %d", tim-tzero, tim-ltim,\
  47. flag, $5, strtSeq
  48. if (++timesSent[id] > 1)
  49. printf " (%.2f) [%d]", tim - timeOf[id], timesSent[id]
  50. if (len != packetsize)
  51. printf " <%d>", len
  52. }
  53. } else {
  54. id = $7
  55. printf "%7.2f\t%7.2f\t%s ack %s %d", tim-tzero, tim-ltim,\
  56. flag, $5, id
  57. if ($9 != lastwin) {
  58. printf " win %d", $9
  59. lastwin = $9
  60. }
  61. printf " (%.2f)", tim - timeOf[id]
  62. if (++timesAcked[id] > 1)
  63. printf " [%d]", timesAcked[id]
  64. }
  65. printf "\n"
  66. ltim = tim
  67. }