ping(8)

名称
ping - 向网络主机发送 ICMP 回显请求（ECHO_REQUEST）分组

概要
ping [-aAbBdDfhLnOqrRUvV46] [-c count] [-F flowlabel] [-i interval] [-I interface] [-l preload] [-m mark] [-M pmtudisc_option] [-N nodeinfo_option] [-w deadline] [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp option] [hop ...] destination

描述

ping 使用 ICMP 协议规定的 ECHO_REQUEST 数据报引发一个来自主机或网管的 ICMP ECHO_RESPONSE 回应。 ECHO_REQUEST 数据报（“ping”信息）有一个 IP 和 ICMP 头部， 其后跟随了一个结构，包含一个时间相关的值以及一个任意的“pad” 字节的随机数用以填充数据包。

ping可以同时在 IPv4 和 IPv6 下工作。 如需明确强制指定使用其中某个，可以使用 -4 或者 -6。

ping 还可以发送 IPv6 节点信息查询（Node Information Quries, RFC4620）。 中间节点（hop）可能不被允许，因为 IPv6 源路由已不赞成使用（RFC5095）。

选项

-4  仅使用 IPv4。

-6  仅使用 IPv6。

-a  Audible ping.

-A  自适应 ping。

-b  允许对一个广播地址进行 ping。

-t ttl
    仅进行ping。 设置 IP 的 TTL（Time to Live）。

-T timestamp option
    设置特殊的 IP 时间戳选项。 timestamp option 可以是 tsonly（仅时间戳）、 tsandaddr（时间戳和地址）或者 tsprespec host1 [host2 [host3 [host4]]]（预先指定跳数的时间戳）。

-U  打印完整的用户到用户的延迟（旧行为）。通常情况下 ping 打印网络往返延时，它们可能不同，例如在 DNS 解析出现失败时。

-v  输出详细信息。

-V  显示版本并退出。

-c  count 在发送(和接收)了正好数量为 count 的回显应答分组后停止操作。在发送了 count 个分组后没有收到任何分组的特别情况是发送导致了终止(选程主机或网关不可达)。

-d  在所用的套接字上使用 SO_DEBUG 选项。 实际上，这个套接字选项没有被 Linux 内核所使用。

-D  在每行之前打印时间戳（UNIX 时间 + gettimeofday 中的毫秒）。

-f  以高速（洪水）方式进行 ping。 以分组返回的速度来输出其它分组或每秒输出百次。当收到每个回显应答并打印一个退格符时，对每个回显请求都打印一个句点``.''。这可以快速显示出丢弃了多少个分组，只有超级用户可以用这个选项。这（操作）对网络要求非常苛刻，应该慎重使用。

-i  wait 在发送每个分组时等待 wait 个秒数。缺省值为每个分组等待一秒。此选项与-f选项不能同时使用。

-l  preload 如果指定 preload ，那么 ping 程序在开始正常运行模式前尽可能快地发送分组。同样只有超级用户可以用这个选项。

-n  只以数字形式输出信息。这样就不尝试去查找主机名了。

-p  pattern 可以指定最多16个填充字节用于保持分组长度为16的整数倍。在网络上诊断与数据相关问题时此选项很有用。例如``-p ff''将使发出的分组都用全1填充数据区。

-q  静态输出。在程序启动和结束时只显示摘要行。

-R  记录路由。在回显请求分组中包含记录路由选项并在相应的分组返回时显示路由缓冲区。注意IP首部的容量只能存放9条这样的路由。很多主机 忽略或禁用此选项。

-r  在所连接的网络上旁路正常的选路表，直接向主机发送分组。如果主机未处于直接相连的网络上，那么返回一个错误。此选项可用来通过无路由接口对一台主机进行检测(例如当接口已被 routed 程序丢弃后)。

-s  packetsize 指定要发送数据的字节量。缺省值为 56 ，这正好在添加了 8 字节的 ICMP 首部后组装成 64 字节的 ICMP 数据报。

-w  waitsecs 在 waitsecs 秒后停止 ping 程序的执行。当试图检测不可达主机时此选项很有用。

当用ping来隔离故障时，应首先在本地主机上运行，以检查本地网络接口有效 运行。然后，应该进一步检查主机和网关。计算出往返时间和分组丢失率。如 果收到重复的分组，虽然这些分组的往返时间要用于计算往返时间的最小/平均 /最大值，但是它们不应该算在刚才计算的丢失的分组中。当指定数量的分组已 经发送(和接收)时或如果程序被SIGINT信号终止，会显示一份简短的摘要。

如果ping程序根本没有收到任何返回分组，那它将以返回码1退出。出错时返回 2。否则返回0。这些值可能用于查看主机存在与否。

此程序专用于网络测试，度量和管理。因为它会使用网络的流量，在正常操作或 自动的脚本中使用它并不明智。

  ICMP分组细节
一个无选项的IP首部长为20字节。一个ICMP回显请求分组包含了额外的8个字节 用于任意数量的数据。当给出分组长度时，就同时指出了额外数据的长度(缺省为 56)。因此接收到的ICMP回显应答这样的一个IP分组内部所含的数据量总是8个字 节从而超过了请求数据空间(ICMP首部)。

如果数据空间至少有8个字节大小，ping程序使用此空间的头8个字节来包含一个 用于计算往返时间的时间戳。如果指定了填充字节小于8个字节，就不给定往返 时间了。

  重复和受损的分组

ping程序会报告重复和受损的分组。分组重复不应该发生，不适当的链路层传输 可能会导致这样问题。分组重复在很多情况下可能会发生，虽然存在少量重复并 不总会导致警告，但并不是个好信号。

分组受损很显然会引起严重警告，并通常会在检测分组的路径上某处指出受损的 硬件(在网络中或主机中)。

  尝试不同的数据结构

互联网络并不会因为分组数据部分的内容不同而区别看待分组。不幸的是，与数据相关的问题都已知潜存于网络中，并在一个较长时期内无法检测到。在很多情况下，引起问题的特殊结构是些未完全转换的内容如全1或全0，接近临界的结构如几乎全0。在命令行上没有足够的必要去指定如全0这样的一个数据结构，因为有影响的结构位于数据链路层，并且与指定的和控制器传输的复杂程度有关。

这说明如果你有一个与数据相关的问题，可能必须用很多测试来找出它。如果幸运的话，可以设法查找一个不能在网上发送或发送时要花比同长度的文件更多时间的文件。然后检查此文件中用ping程序的-p选项来指定的重复结构。

  有效时间细节

一个IP分组的TTL值表示分组在被丢弃前穿越IP路由器的最大数据。在现有的实际中， 你可以认为互联网上每个路由器都对TTL字段减1。

TCP/IP规定TCP分组的TTL字段应该设为60，但很多系统用较小的值(4.3 BSD 用30, 4.2用15)。

此字段可能的最大值为255，多数UNIX系统把ICMP回显请求分组的TTL字段设 为255。这就是为什么你可以``ping''一些主机而不能用telnet(1)和ftp(1)到达。

在正常操作时ping打印它收到分组的TTL值。当选程系统收到一份ping的分组时， 在作出响应时可以用TTL字段完成三件事：

不变； 4.3BSD-Tahoe release之前的Berkeley Unix系统是这样做的。 在此情况下，收到的分组的TTL值为255减往返路径中的路由器数。

把它设为255；
    当前的Berkeley Unix系统是这样做的。在此情况下，收到的 分组的TTL值为为255减选程系统与执行ping主机之间的路由器数。

把它设为其它值。
    有些主机对ICMP分组使用与TCP分组相同的值，例如30或 60。其它系统使用原始值。(校对者请指教此句之确切含义：meaculpa@21cn.com)

缺陷

•   很多主机和网关忽略记录路由（RECORD_ROUTE）选项。

•   最大 IP 头部长度对如记录路由（RECORD_ROUTE)这样非常有用的选项来说长度太小。 但对这个问题也没什么可做的了。

•   通常情况并不推荐以高速方式作 ping， 而且只应当在非常受限的条件下才可对广播地址这样做。

另见

netstat(1), ifconfig(8).

历史

ping 命令出现于 4.3BSD。

当前文档描述的版本是它在 Linux 平台上的后续版本。

从版本 s20160815 开始，ping6 二进制程序不再存在。 它已经被合并进了 ping 程序中。 创建一个名为 ping6 指向 ping 的符号链接可以提供原有的功能。

安全性
ping 在下述条件下运行时需要 CAP_NET_RAW 能力： 1) 如果程序被用于进行 non-echo 查询（请见 -N 选项），或 2) 如果内核不支持 non-raw ICMP 套接字，或 3) 如果用户不被允许创建 ICMP echo 套接字。 本程序设计可以用于在设置用户ID为 root 的情况下运行。

获取

ping 是 iputils 软件包的一部分。 其最新版本源代码可以从下述地址获取到： http://www.skbuff.net/iputils/iputils-current.tar.bz2.