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 56 printf "%7.2f\t%7.2f\t%s ack %s %d", tim-tzero, tim-ltim,\ 57 flag, $5, id 58 if ($9 != lastwin) { 59 printf " win %d", $9 60 lastwin = $9 61 } 62 printf " (%.2f)", tim - timeOf[id] 63 if (++timesAcked[id] > 1) 64 printf " [%d]", timesAcked[id] 65 } 66 printf "\n" 67 ltim = tim 68 } 69