ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。
ping 是工作在 TCP/IP 网络体系结构中应用层的一个服务命令,主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。
ping 用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断 TCP/IP 参数是否设置正确,以及运行是否正常、网络是否通畅等。
向目标主机发送 ICMP 信息报文,目标主机(有时是路由器)回应 ICMP 信息报文或差错报文,Ping 程序根据这些收到的 ICMP 报文,以知道目标主机的可达性。
注意:如果在目标主机的网络网关过滤了ICMP Ping包,ICMPPing的结果就不准确了。
在 TCP 协议中,SYN 包用来表示建立连接请求。
如果对方端口处在 Listening 状态,就会回送 ACK 包,并附上自己的 ISN。如果对方端口是关闭的,它会发回一个 RST 包,表示应该马上断开连接。
如果向一个端口发送 ACK 包,而事先没有与此端口建立连接;那么,无论端口是否打开,它都会回送一个RST包。
所以可以看出,无论这个端口是否打开,总会有某一种数据包返回,以此可以判定目标主机可达。
如果目标主机不可达,路由器就会向扫描主机发送目的地不可达的 ICMP 报文。
这样,通过向目标主机发送 TCPSYN 包或 TCPACK 包就可以准确判断目标主机是否可达,而且根据 RFC793 (TCP),目标主机 (或路由器) 都无法屏蔽TCPSYN 包和 TCPACK 包。
因此,TCPPing 的准确性比 ICMPPing 的准确性要高。
在实现的时候,需要利用 RAW Socket,定制 TCP 包并封装在 IP 包中。
UDPPing 与 TCPPing 的原理类似,通过 RAWSocket 定制 UDP 包,主要是格式化 UDP 包中的目的端口号,一般指定一个数量值很大的目的端口号。
首先构建好 UDP 报文,然后递交给 IP 实体发送。
如果目标主机不可达 (网络不通或主机未打开),则路由器将发送一个目的不可达 ICMP 报文。
如果目标主机可达,在其接收数据时,其 UDP 实体首先判断接收到的目的端口号是否与当前使用的某端口号匹配,如果匹配,则将数据报放入到对应的接收队列,否则如果目的端口号对应的端口关闭则丢弃该数据报,并回送一个 “端口不可达” 的 ICMP 报文。
因此,只要目标主机可达,UDPPing 程序将收到一个 UDP 回应包 (也可能没有) 或者 “端口不可达” 的 ICMP 报文而目标主机不可达,将收到 “目的不可达’’ 的 ICMP 报文。
下面将介绍怎样在 Windows 下面使用 ping 命令。
ping 指定的主机,直到我们手动停止,如:按 ctrl + c 终止 ping 的执行。例如:
C:\Users\Administrator> ping www.hxstrive.com -t
将地址解析为主机名。如下:
C:\Users\Administrator> ping HUANGXIN-PC -a
上面命令将字符串 “HUANGXIN-PC” 解析成主机名称。
指定 ping 命令发送几次请求,例如:
C:\Users\Administrator> ping www.hxstrive.com -n 2
上面命令将对 www.hxstrive.com 发起 2 次 ping 请求。
手动指定每一个 ping 命令每次请求发送包的大小,例如:
C:\Users\Administrator> ping www.hxstrive.com -l 64 正在 Ping www.hxstrive.com [120.78.81.7] 具有 64 字节的数据: 来自 120.78.81.7 的回复: 字节=64 时间=56ms TTL=51 来自 120.78.81.7 的回复: 字节=64 时间=48ms TTL=51
上面命令指定每个 ping 包大小为 64 个字节。
上面介绍了 ping 命令最常用的几个参数,如果想学习更多关于 ping 命令的功能,可以通过如下命令查看帮助信息:
C:\Users\Administrator> ping /?
我们在写 bat 脚本时,有时某个命令可能需要在一个命令执行完成后等待一段时间才执行下一个命令。
例如:使用 ping 命令延迟 5 秒打开 http://www.hxstrive.com 网站。如下:
@echo off ping localhost -n 5 > nul start http://www.hxstrive.com
上面脚本中,ping 通过对本地回路 localhost 发起 5 次请求,来模拟 5 秒时间,将 ping 的输出信息重定向输出。