什么是Ping
Ping是一种计算机网络工具,用来测试数据包能否透过IP协议到达特定主机。Ping的运作原理是向目标主机传出一个ICMP的请求回显数据包,并等待接收回显回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延)。
.png)
在1983年12月,Mike Muuss编写了首个这样的程序,用于在IP网络出现问题时方便探查其根源。因为这个程序的运作原理与潜水艇的主动声纳相似,他便用声纳的声音来为程序取名。
网络管理员之间也常将Ping用作动词,如“Ping一下路由器的IP,看通不通?”。
哪些场景下使用Ping
场景一:设备直连
当互相发起Ping的两台设备是采用直连连接时,不论是否经过二层交换机,都是直接通过二层链路进行通信。
因此,直连的设备只需要确保两者的IP地址在同一个子网内即可,无需配置网关地址,也能够Ping通。
直连.png)
上图实验场景中,包含两个小的实验,区别在于中间有无二层交换机。下面先看下4台终端PC的IP地址配置:
上面4台终端PC分配按照拓扑图配置了私网IP地址和子网掩码,以确保与对端设备在同一个子网内。可以看到,4台PC都没有配置网关地址和DNS地址。下面看一下测试结果:
上图是分别从PC1对PC2发起Ping、PC3对PC4发起Ping,都是可以Ping通的。
以PC1对PC2发起Ping的回显信息为例,图中
From 192.168.12.2: bytes=32 seq=5 ttl=128 time=15 ms
表示这是从PC2(192.168.12.2)返回的第5个(seq=5)回显应答Echo Reply,生存时间值(ttl)为128(ttl=128,实际意义是0跳,即128-128=0),网络时延为15毫秒(time=15 ms)。
扩展阅读:
TTL的主要作用是避免IP包在网络中的无限循环和收发,节省了网络资源,并能使IP包的发送者能收到告警消息。TTL是IP数据包在计算机网络中可以转发的最大跳数。TTL字段由IP数据包的发送者设置,在IP数据包从源到目的的整个转发路径上,每经过一个路由器,路由器都会修改这个TTL字段值。具体的做法是把该TTL的值减1,然后再将IP包转发出去。如果在IP包到达目的IP之前TTL减少为0,路由器将会丢弃收到的TTL=0的IP包,并向IP包的发送者发送ICMP Time Exceeded消息。TTL值是可以手动定义的,常见操作系统的默认TTL值如下:
UNIX及类UNIX操作系统:255
Windows NT4/2000/XP/8/10:128
Linux系列操作系统:64
Windows 95/98/98SE/ME:32
场景二:经路由转发
当互相发起Ping的两台设备中间存在路由(三层)转发时,只要确保两者之间有能够到达对端的正确路由路径,两台设备就可以Ping通。
当网络中存在路由(三层)转发时,终端设备务必配置网关IP地址,DNS地址可以不配置。

上图实验场景中,包含两个小的实验,区别在于中间有无公网IP地址(R2与R3之间采用公网IP地址互联)。下面先看下4台终端PC的IP地址配置:
上面4台终端PC分配按照拓扑图配置了私网IP地址、子网掩码和网关地址,没有配置DNS地址。下面看一下测试结果:
上图是分别从PC1对PC2发起Ping、PC3对PC4发起Ping,都是可以Ping通的。
Ping工具的常用参数
在不同设备上使用Ping命令的可选参数是不一样的,例如PC机(不同操作系统)、路由器(不同厂家)等的可选参数是不同的。
Windows操作系统
下面以Microsoft Windows 10 64位操作系统为例,介绍Windows系列操作系统中Ping的可选参数和用法。打开Cmd命令窗口,输入ping /?即可查看Ping相关的可选参数及用法介绍。

参数 | 参数说明 |
-t | Ping 指定的主机,直到停止。 若要查看统计信息并继续操作,请键入 Ctrl+Break; 若要停止,请键入 Ctrl+C。 |
-a | 将地址解析为主机名。 |
-n count | 要发送的回显请求数。 |
-l size | 发送缓冲区大小。 |
-f | 在数据包中设置“不分段”标记(仅适用于 IPv4)。 |
-i TTL | 生存时间。 |
-v TOS | 服务类型(仅适用于 IPv4。该设置已被弃用, 对 IP 标头中的服务类型字段没有任何 影响)。 |
-r count | 记录计数跃点的路由(仅适用于 IPv4)。 |
-s count | 计数跃点的时间戳(仅适用于 IPv4)。 |
-j host-list | 与主机列表一起使用的松散源路由(仅适用于 IPv4)。 |
-k host-list | 与主机列表一起使用的严格源路由(仅适用于 IPv4)。 |
-w timeout | 等待每次回复的超时时间(毫秒)。 |
-R | 同样使用路由标头测试反向路由(仅适用于 IPv6)。 根据 RFC 5095,已弃用此路由标头。 如果使用此标头,某些系统可能丢弃 回显请求。 |
-S srcaddr | 要使用的源地址。 |
-c compartment | 路由隔离舱标识符。 |
-p | Ping Hyper-V 网络虚拟化提供程序地址。 |
-4 | 强制使用 IPv4。 |
-6 | 强制使用 IPv6。 |
下面介绍Windows操作系统中Ping的几种常见附带参数。
使用参数-n count:ping 8.8.8.8 -n 2,只Ping 2次就自动结束。
同理,ping 8.8.8.8 -n 987,表示连续Ping 987次后自动结束。

使用参数-l size:ping 8.8.8.8 -l 64,发送64字节的数据包。这个参数可以测试对端的接收窗口大小,例如8.8.8.8的窗口大小为≤1472字节。

使用参数-i TTL能够确到达目标的最大跳数。

Linux操作系统
下面以Redhat CentOS 8 64位操作系统为例,介绍Linux系列操作系统中Ping的可选参数和用法。打开Terminal终端窗口(或使用SSH连接Linux HOST):
输入hostnamectl即可查看系统内核;
输入ping –help即可查看Ping的附带选项(简要帮助);
输入man ping即可查看关于Ping的详细使用手册。
参数 | 参数说明 |
-b | 允许Ping网关地址。 |
-c count | 发送count次ECHO_REQUEST(回传请求)数据包。当有deadline选项(最后期限,-w选项),在超时之前,Ping等待ECHO_REPLY(回传响应)直到count次。 |
-d | 在正在使用的socket(套接字)上设置SO_DEBUG选项。本质上,Linux内核不使用此套接字选项。 |
-f | 大量Ping,极限Ping。每个ECHO_REQUEST(回传请求)打印一个点,每有一个ECHO_REPLY(回传响应)打印一个退格符(Backspace)。这样可以快速显示丢弃的数据包数量。如果没有给出间隔,它会将间隔设置为0,并按照它们返回或每秒百次的速度输出数据包,以多者为准。只有超级用户才可以0间隔使用此选项。 |
-i interval | 发送每个数据包之间等待的间隔(单位秒)。默认设置是等待一秒,极限模式下不等待。只有超级用户可以设置间隔值小于0.2秒。 |
-I interface address | 将源地址设置为指定的接口地址。参数可以是数字IP地址或设备名称。在Ping IPv6 linklocal地址时,此选项是必需的。 |
-l preload | 如果指定了preload,则Ping发送许多不等待回复的数据包。只有超级用户可以选择超过3的预加载。 |
-n | 仅限数字输出。不会尝试查找主机地址的符号名称。 |
-p pattern | 你可以指定最多16个“pad”字节来填充你发送的数据包。这对于诊断网络中的数据以来问题是有用的。例如-p ff将导致充满整个被发送包。 |
-q | 静默输出。除启动和完成时的摘要行外,不显示任何内容。 |
-r | 绕过正常的路由表并直接发送到连接接口上的主机。如果主机不在直接连接的网络上,则返回错误。如果还是用了-I选项,则此选项可用于通过没有路由的接口Ping本地主机。 |
-R | 记录线路。包含ECHO_REQUEST数据包中的RECORD_ROUTE选项,并在返回的数据包上显示路由缓冲区。请注意,IP报头只能容纳9个这样的路由。许多主机忽略或放弃此选项。 |
-s packetsize | 指定要发送的数据字节数。默认56,当与8字节的ICMP头数据组合时,转换为64个ICMP数据字节。 |
-t ttl | 设置IP生存时间值(TTL)。 |
-v | 详细输出。 |
-w deadline | 指定一个以秒为单位的退出时间,不管Ping退出之前发送或接收了多少数据包。在这种情况下,Ping将一直发送数据包,直到deadline过期或count探针结束或一些来自网络的错误通知。 |
下面介绍Linux操作系统中Ping的几种常见附带参数。
使用参数-c count:ping -c 3 8.8.8.8,只Ping 3次就自动结束。
同理,ping -c 99 8.8.8.8,表示连续Ping 99次后自动结束。

使用参数-i interval,将以指定的时间间隔对目标发起Ping,默认间隔是1秒。如下就是以2秒为间隔,对目标发起5次Ping。

使用参数-f对目标发起快速极限Ping,过程不同步回显,只显示最终结果,如果没有附带-c参数,则需要手动终止(Ctrl+C)才会结束。如下就是对www.baidu.com发起55次极限快速Ping,最短30.381毫秒,平均30.435毫秒,最长30.565毫秒,偏离值0.141毫秒(mdev表示这些ICMP包的RTT偏离平均值的程度,这个值越小说明你的网络越稳定),丢包率为0%

使用参数-q,Ping的过程不回显,只显示最终结果。如下就是对8.8.8.8发起9次Ping,并附带参数-q,最终显示最短35.913毫秒,平均36.126毫秒,最长36.383毫秒,偏离值0.168毫秒。为什么要一直附带这个-c参数呢?由于Linux系统中直接使用命令ping x.x.x.x将一直不停的Ping下去,直到手动终止(Ctrl+C)才会结束,所以习惯附带-c参数。

UNIX操作系统
苹果公司的macOS属于UNIX系列操作系统,在macOS上使用Ping命令与在Linux中使用Ping大致类似,这里就不展开赘述了。
前面铺垫了那么多,主要介绍了Ping的原理,以及在不同操作系统中使用Ping的方法和技巧,下面才是今天的主题:批量Ping。
批量Ping多个连续的IP地址
如果你是公司的管理员,现在你想知道192.168.56.0/24这个网段有多少主机在线(被分配),有两种方法:第一,登录DHCP服务器(例如核心交换机)查看实时的IP地址分配情况;第二,使用批量Ping快速确认多少IP在线。而第一种方法需要你能登录核心设备的后台。
使用命令for /L %d in (1,1,255) do ping 192.168.56.%d
对192.168.56.0/24这个网段,从1开始连续逐个Ping测试。其中%d表示变量,(1,1,255)中第一个1表示起始值,第二个1表示递增量,255表示结束的最后一个值。

下面将起始值修改成22、递增量修改成10,使用命令for /L %d in (22,10,255) do ping 192.168.56.%d试一下。

添加参数>>textname.txt,使用命令for /L %d in (5,3,255) do ping 192.168.56.%d >>textname.txt将结果输出到名为textname的TXT文件中,输出的文件默认存储在C:\Windows\System32\textname.txt 。


再优化一下,将textname.txt文件输出到指定位置(如桌面上),使用命令for /L %d in (33,5,255) do ping 192.168.56.%d >>C:\Users\tongliyang\Desktop\textname.txt,这将会把textname文件输出到桌面上。

继续优化:将Ping通的IP结果保存到yes.txt,将不能Ping通的IP保存到no.txt,使用命令for /L %d in (1,1,255) do (ping 192.168.56.%d -n 1 && echo 192.168.56.1.%d >>C:\Users\tongliyang\Desktop\yes.txt || echo 192.168.56.%d >>C:\Users\tongliyang\Desktop\no.txt)


批量Ping多个无规律的IP地址
上面演示的是Ping多个连续的IP地址段,那么如果是一组没有规律的地址呢?例如下面这个list.txt中这些IP地址/网址,肯定也是可以实现的。

使用命令for /F %d in (C:\Users\tongliyang\Desktop\list.txt) do (ping %d -n 1 && echo %d >> C:\Users\tongliyang\Desktop\pass.txt || echo %d >> C:\Users\tongliyang\Desktop\nopass.txt)


哪些原因会导致Ping不通
在互联网中,理论上接入Internet的两台机器都可以通信。但是由于安全策略的原因、防火墙的限制,将导致一些流量被过滤。下面介绍几种Ping不通的现象,以及相应的原因分析。
错误的目标IP地址/网址:
对www.qdfdfdf345454.com发起Ping,回显Ping 请求找不到主机 www.qdfdfdf345454.com。请检查该名称,然后重试。

使用nslooup命令查找解析,提示UnKnown 找不到 www.qdfdfdf345454.com: Non-existent domain

访问违禁目标网站被拒绝:
以在中国大陆访问特靠谱最爱的Twitter为例,DNS将对www.twitter.com的访问指向104.244.42.193,你的请求流量被GFW防火墙Drop。

再次提醒各位网民:合法使用互联网,互联网不是法外之地!
目标IP/网站设置了禁Ping:
这种场景是由于目标IP/网站在服务器之前使用了防火墙/CDN过滤技术,将来自于ICMP的请求一律回显拒绝消息。
例如有着韩国百度之称的“Naver”,就是能访问网页,但是Ping不通。

扩展阅读:
如何设置防火墙禁Ping,以下图拓扑为例,介绍一下设置禁Ping的步骤,其中PC和路由器只配置了IP地址,关键配置做在核心交换机(华为S5700)上。

交换机上的配置如下:
acl number 3100
rule deny icmp
quit
traffic classifier 1 operator and
if-match acl 3100
quit
traffic behavior deny
permit
quit
traffic policy icmp
classifier 1 behavior deny
quit
interface GigabitEthernet 0/0/1
traffic-policy icmp inbound
quit

最后,再补充一个Troubleshooting的逻辑:当你发现断网时,可以从内到外逐层Ping测试,先Ping你自己的最外层网络设备,再Ping运营商光猫,最后Ping公网地址。这是最快速度、准确定位局点的标准流程。