BEGIN { # we need the number of bytes in a packet to do the output # in packet numbers rather than byte numbers. if (packetsize <= 0) packetsize = 512 expectNext = 1 lastwin = -1 } { # convert tcp trace to send/ack form. n = split ($1,t,":") tim = t[1]*3600 + t[2]*60 + t[3] if (NR <= 1) { tzero = tim ltim = tim OFS = "\t" } if ($6 != "ack") { # we have a data packet record: # ignore guys with syn, fin or reset 'cause we # can't handle their sequence numbers. Try to # detect and add a flag character for 'anomalies': # * -> re-sent packet # - -> packet after hole (missing packet(s)) # # -> odd size packet if ($5 !~ /[SFR]/) { i = index($6,":") j = index($6,"(") strtSeq = substr($6,1,i-1) endSeq = substr($6,i+1,j-i-1) len = endSeq - strtSeq id = endSeq if (! timeOf[id]) timeOf[id] = tim if (endSeq - expectNext < 0) flag = "*" else { if (strtSeq - expectNext > 0) flag = "-" else if (len != packetsize) flag = "#" else flag = " " expectNext = endSeq } printf "%7.2f\t%7.2f\t%s send %s %d", tim-tzero, tim-ltim,\ flag, $5, strtSeq if (++timesSent[id] > 1) printf " (%.2f) [%d]", tim - timeOf[id], timesSent[id] if (len != packetsize) printf " <%d>", len } } else { id = $7 printf "%7.2f\t%7.2f\t%s ack %s %d", tim-tzero, tim-ltim,\ flag, $5, id if ($9 != lastwin) { printf " win %d", $9 lastwin = $9 } printf " (%.2f)", tim - timeOf[id] if (++timesAcked[id] > 1) printf " [%d]", timesAcked[id] } printf "\n" ltim = tim }