Skip to content
Snippets Groups Projects
tcp.sh 1.21 KiB
Newer Older
Peter Cai's avatar
Peter Cai committed
#!/bin/bash

function error() {
	echo $*
	echo "usage $9 <device> [clear]"
	exit 1
}

if [ $# -lt 1 ] || [ ! ip link show dev $1 >/dev/null 2>&1 ]; then
	error "device $1 not found"
fi

cntfile=$HOME/.tcp.sh.count
[ -f $cntfile ] || touch $cntfile

[ "$2" = "clear" ] && {
	sentprev=0
	retransprev=0
	timeoutprev=0
} || {
	sentprev=$((grep -F sent: $cntfile || echo ":0")|cut -f2 -d:)
	retransprev=$((grep -F retrans: $cntfile || echo ":0")|cut -f2 -d:)
	timeoutprev=$((grep -F timeout: $cntfile || echo ":0")|cut -f2 -d:)
}

sentnow=$((netstat -s|grep -F "segments sent out" || echo 0)|awk '{print $1}')
retransnow=$((netstat -s|grep -F "segments retransmitted" || echo 0)|awk '{print $1}')
timeoutnow=$((netstat -s|grep -F "TCPTimeout" || echo 0 0 0)|awk '{print $2}')

echo "sent:$sentnow" > $cntfile
echo "retrans:$retransnow" >> $cntfile
echo "timeout:$timeoutnow" >> $cntfile

sent=$(expr $sentnow - $sentprev)
retrans=$(expr $retransnow - $retransprev)
timeout=$(expr $timeoutnow - $timeoutprev)

[ $sent -gt 0 ] && loss=$(printf "scale=6\n$timeout / $sent\n"|bc) || loss=0

[ $(expr $sent + $retrans + $timeout) -gt 0 ] && printf "sent %10d | retrans %10d | timeout %10d | loss rate %3.4f%%\n" $sent $retrans $timeout $loss

exit 0