使用TCP协议的Ping测试

by Web全栈工程师 on 2015 年 12 月 03 日

PING是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。ping的运作原理是向目标主机传出一个ICMP [email protected]要求数据包,并等待接收echo回应数据包。程序会按时间和成功响应的次数估算丢失数据包率和数据包往返时间。

但是PING使用的是ICMP协议,如果遇到TCP阻断的时候不能测试出TCP协议是否被阻断,所以需要用到第三方PING工具:TCPING和PSPING测试,

TCPPING

  1. 从 https://www.elifulkerson.com/projects/tcping.php 下载tcpping.exe
  2. 将 tcpping.exe 下载到C:\WINDOWS\system32 目录下,就可以在命令提示符下使用tcpping命令了
  3. 使用 tcping /? 查看帮助

PSPING

  1. 从微软官网下载:https://technet.microsoft.com/en-us/sysinternals/psping.aspx
  2. 将 psping.exe 下载到C:\WINDOWS\system32 目录下,就可以在命令提示符下使用psping命令了
  3. psping的几个用法:
    Usage: psping -? [i|t|l|b]
    
    Parameter	Description	
    -? I	Usage for ICMP ping.	
    -? T	Usage for TCP ping.	
    -? L	Usage for latency test.	
    -? B	Usage for bandwidth test.
    

Linux中使用tcping

vim /usr/bin/tcping
chmod +x tcping

tcping的Shell脚本如下

#!/bin/sh
#
# tcpping: test response times using TCP SYN packets
#          URL: http://www.vdberg.org/~richard/tcpping.html
#
# uses tcptraceroute from http://michael.toren.net/code/tcptraceroute/
#
# (c) 2002-2005 Richard van den Berg  under the GPL
#               http://www.gnu.org/copyleft/gpl.html
#
# 2002/12/20 v1.0 initial version
# 2003/01/25 v1.1 added -c and -r options
#                 now accepting all other tcptraceroute options
# 2003/01/30 v1.2 removed double quotes around backquotes
# 2003/03/25 v1.3 added -x option, courtesy of Alvin Austin 
# 2005/03/31 v1.4 added -C option, courtesy of Norman Rasmussen 
# 2007/01/11 v1.5 catch bad destination addresses
# 2007/01/19 v1.6 catch non-root tcptraceroute
# 2008/02/10 v1.7 make -C work when reverse lookup fails, courtesy of Fabrice Le Dorze 


ver="v1.7"
format="%Y%m%d%H%M%S"
d="no"
c="no"
C="no"
ttl=255
seq=0
q=1
r=1
w=3
topts=""

usage () {
	name=`basename $0`
	echo "tcpping $ver Richard van den Berg "
	echo
	echo "Usage: $name [-d] [-c] [-C] [-w sec] [-q num] [-x count] ipaddress [port]"
	echo
	echo "        -d   print timestamp before every result"
	echo "        -c   print a columned result line"
	echo "        -C   print in the same format as fping's -C option"
	echo "        -w   wait time in seconds (defaults to 3)"
	echo "        -r   repeat every n seconds (defaults to 1)"
	echo "        -x   repeat n times (defaults to unlimited)"
	echo
	echo "See also: man tcptraceroute"
	echo
}

_checksite() {
	ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>&1`
	if echo "${ttr}" | egrep -i "(bad destination|got roo)" >/dev/null 2>&1; then
		echo "${ttr}"
		exit
	fi
}
	
_testsite() {
	myseq="${1}"
	shift
	[ "${c}" = "yes" ] && nows=`date +${format}`
	[ "${d}" = "yes" ] && nowd=`date`
	ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>/dev/null`
	host=`echo "${ttr}" | awk '{print $2 " " $3}'`
	rtt=`echo "${ttr}" | sed 's/.*] //' | awk '{print $1}'`
	not=`echo "${rtt}" | tr -d ".0123456789"`
	[ "${d}" = "yes" ] && echo "$nowd"
	if [ "${c}" = "yes" ]; then
		if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then
			echo "$myseq $nows $rtt $host"
		else
			echo "$myseq $nows $max $host"
		fi
	elif [ "${C}" = "yes" ]; then
		if [ "$myseq" = "0" ]; then
			echo -n "$1 :"
		fi
		if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then
			echo -n " $rtt"
		else
			echo -n " -"
		fi
		if [ "$x" = "1" ]; then
			echo
		fi
	else
		echo "${ttr}" | sed -e "s/^.*\*.*$/seq $myseq: no response (timeout)/" -e "s/^$ttl /seq $myseq: tcp response from/"
	fi
#       echo "${ttr}"
}

while getopts dhq:w:cr:nNFSAEi:f:l:m:p:s:x:C opt ; do
	case "$opt" in
		d|c|C) eval $opt="yes" ;;
		q|w|r|x) eval $opt="$OPTARG" ;;
		n|N|F|S|A|E) topt="$topt -$opt" ;;
		i|l|p|s) topt="$topt -$opt $OPTARG" ;;
		f|m) ttl="$OPTARG" ;;
		?) usage; exit ;;
	esac
done

shift `expr $OPTIND - 1`

if [ "x$1" = "x" ]; then
	usage
	exit
fi

max=`echo "${w} * 1000" | bc`

if [ `date +%s` != "%s" ]; then
	format="%s"
fi

_checksite ${topt} $*

if [ "$x" = "" ]; then
	while [ 1 ] ; do
		_testsite ${seq} ${topt} $* &
		pid=$!
		if [ "${C}" = "yes" ]; then
			wait $pid
		fi
		seq=`expr $seq + 1`
		sleep ${r}
	done
else
	while [ "$x" -gt 0 ] ; do
		_testsite ${seq} ${topt} $* &
		pid=$!
		if [ "${C}" = "yes" ]; then
			wait $pid
		fi
		seq=`expr $seq + 1`
		x=`expr $x - 1`
		if [ "$x" -gt 0 ]; then
			sleep ${r}
		fi
	done
fi

exit

原创文章,转载请注明:转载自Web开发笔记 | 使用TCP协议的Ping测试

本文链接地址:https://www.magentonotes.com/psping-and-tcpping.html

Comments on this entry are closed.

Previous post:

Next post: