ping - 向网络主机发送 ICMP ECHO_REQUEST
概要
ping [-aAbBdCDfhHLnOqrRUvV346] [-c count] [-e identifier] [-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 标头,后跟一个 struct timeval,然后是任意数量的“填充”字节,用于填充数据包。
ping 同时支持 IPv4 和 IPv6。通过明确指定 -4 或 -6,可以强制仅使用其中之一。
ping 还可以发送 IPv6 节点信息查询 (RFC4620)。中间节点可能不允许,因为 IPv6 源路由已被弃用 (RFC5095)。
选项
-3
RTT 精度(不向上舍入结果时间)。
-4
仅使用 IPv4。
-6
仅使用 IPv6。
-a
可听 ping。
-A
自适应 ping。数据包间隔会适应往返时间,因此实际上网络中不存在超过一个(或者更多,如果设置了 preload)未应答的探测数据包。默认间隔为 2 毫秒,有关更多信息,请参见选项 -i。在具有低 RTT 的网络上,此模式实际上等同于 flood 模式。
-b
允许 ping 广播地址。
-B
不允许 ping 更改探测数据包的源地址。地址绑定到 ping 启动时选择的一个地址。
-c count
发送 count 个 ECHO_REQUEST 数据包后停止。使用 deadline 选项时,ping 等待 count 个 ECHO_REPLY 数据包,直到超时。
-C
在套接字创建时调用 connect() 系统调用。
-d
在正在使用的套接字上设置 SO_DEBUG 选项。本质上,Linux 内核不使用此套接字选项。
-D
在每一行之前打印时间戳(unix 时间 + 纳秒,如 gettimeofday 中)。
-e identifier
设置 ECHO_REQUEST 的标识字段。值为 0 表示使用原始套接字(不支持 ICMP 数据报套接字)。该字段的值可以使用 -v 选项打印。
-f
Flood ping。对于发送的每个 ECHO_REQUEST,打印一个句点“.”,而对于接收的每个 ECHO_REPLY,打印一个退格符。这提供了一种快速显示有多少数据包被丢弃的方法。如果未提供间隔,则将其设置为零并以最快的速度输出数据包,或者每秒输出一百次,以较高的频率为准。只有超级用户才能以零间隔使用此选项。
-F flow label
仅适用于 IPv6。为回显请求数据包分配并设置 20 位流标签(十六进制)。如果值为零,则内核分配随机流标签。
-h
显示帮助。
-H
强制对输出进行 DNS 名称解析。对于数字目标地址或 -f 选项(默认情况下不执行 DNS 解析),此选项非常有用。它还可以帮助解决 DNS 解析问题。覆盖之前定义的 -n 选项。请参阅 IPUTILS_PING_PTR_LOOKUP 环境变量。
-i interval
等待时间(秒),用于发送每个数据包。允许使用带小数点的实数(无论区域设置如何)。默认情况下,通常情况下等待一秒钟再发送每个数据包,或者在洪流模式下不等待。只有超级用户可以将间隔设置为小于 2 毫秒的值。广播和多播 ping 对普通用户有更高的限制:最小值为 1 秒。
-I interface
接口可以是地址、接口名称或 VRF 名称。如果接口是地址,则将源地址设置为指定的接口地址。如果接口是接口名称,则将源接口设置为指定的接口。如果接口是 VRF 名称,则每个数据包都使用相应的路由表进行路由;在这种情况下,可以重复使用 -I 选项以指定源地址。注意:对于 IPv6,当 ping 具有链路本地作用域地址时,可以使用链路规范(通过目标地址中的“%”符号或通过此选项),但不再是必需的。
-l preload
如果指定了 preload,ping 将发送那么多数据包,而无需等待回复。只有超级用户可以选择超过 3 的 preload 值。
-L
抑制多播数据包的环回。此标志仅适用于 ping 目标地址为多播地址时。
-m mark
使用 mark 标记发送的数据包。这对于内核中的各种原因都很有用,例如使用策略路由来选择特定的出站处理。需要 CAP_NET_ADMIN 或 CAP_NET_RAW 权限(从 Linux 5.17 开始),请参阅 socket(7)。
-M pmtudisc_opt
选择路径 MTU 发现策略。pmtudisc_option 可以是 do(设置 DF 标志,但受内核的 PMTU 检查影响,过大的数据包将被拒绝)、want(执行 PMTU 发现,当数据包大小过大时在本地进行分片)、probe(设置 DF 标志并绕过 PMTU 检查,用于探测)或 dont(不设置 DF 标志)。
-N nodeinfo_option
仅适用于 IPv6。发送 IPv6 节点信息查询(RFC4620),而不是回显请求。需要 CAP_NET_RAW 权限。
help
显示 NI 支持的帮助。
name
查询节点名称。
ipv6
查询 IPv6 地址。有几个 IPv6 特定的标志。
ipv6-global
请求 IPv6 全局作用域地址。
ipv6-sitelocal
请求 IPv6 站点本地地址。
ipv6-linklocal
请求 IPv6 链路本地地址。
ipv6-all
请求其他接口上的 IPv6 地址。
ipv4
查询 IPv4 地址。有一个 IPv4 特定的标志。
ipv4-all
请求其他接口上的 IPv4 地址。
subject-ipv6=ipv6addr
IPv6 主题地址。
subject-ipv4=ipv4addr
IPv4 主题地址。
subject-name=nodename
主题名称。如果包含多个点,则假定为完全限定域名。
subject-fqdn=nodename
主题名称。始终假定为完全限定域名。
-n
仅输出数字。不会尝试为主机地址查找符号名称(不进行反向 DNS 解析)。这是数字目标或 -f 选项的默认设置。覆盖之前定义的 -H 选项。另请参阅 IPUTILS_PING_PTR_LOOKUP 环境变量。
-O
在发送下一个数据包之前报告未应答的 ICMP ECHO 响应。这与 -D 选项结合使用,可用于将输出记录到诊断文件中并搜索丢失的响应。
-p pattern
您可以指定最多 16 个“填充”字节来填充您发送的数据包。这对于诊断网络中与数据相关的问题很有用。例如,-p ff 将导致发送的数据包填充为全 1。
-q
安静输出。除了启动时和完成时的摘要行之外,不显示任何内容。
-Q tos
设置 ICMP 数据报中的服务质量相关位。tos 可以是十进制(仅 ping)或十六进制数字。
在 RFC2474 中,这些字段被解释为 8 位差分服务 (DS),包括:单独数据的 0-1 位(最低 2 位),以及差分服务码点 (DSCP) 的 2-7 位(最高 6 位)。
在 RFC2481 和 RFC3168 中,0-1 位用于 ECN。
在历史上(RFC1349,已被 RFC2474 废弃),这些被解释为:最低位的 0 位用于保留(当前正在重新定义为拥塞控制),1-4 位用于服务类型,5-7 位(最高位)用于优先级。
-r
绕过正常的路由表并直接发送到连接接口上的主机。如果主机不在直接连接的网络上,则返回错误。此选项可用于通过不具有路由的接口 ping 本地主机,前提是同时使用 -I 选项。
-R
仅 ping。记录路由。在 ECHO_REQUEST 数据包中包含 RECORD_ROUTE 选项,并在返回的数据包上显示路由缓冲区。请注意,IP 标头仅足以容纳九个此类路由。许多主机忽略或丢弃此选项。
-s packetsize
指定要发送的数据字节数。默认值为 56,与 8 个 ICMP 标头字节结合使用,总计 64 个 ICMP 数据字节。允许的最大值为 IPv4 的 65507(当使用 -R 或 -T 或中间跃点时为 65467),或者 IPv6 的 65527,但大多数系统将其限制为较小的、系统相关的数字。
-S sndbuf
设置套接字 sndbuf。如果未指定,则选择缓冲不超过一个数据包。
-t ttl
仅 ping。设置 IP 生存时间 (TTL)。
-T timestamp option
设置特殊的 IP 时间戳选项。时间戳选项可以是 tsonly(仅时间戳)、tsandaddr(时间戳和地址)或 tsprespec host1 [host2 [host3 [host4]]](时间戳预指定跃点)。
-U
打印完整的用户到用户延迟(旧的行为)。通常,ping 打印网络往返时间,这可能由于 DNS 故障而有所不同。
-v
详细输出。在 ping 多播地址时,不要抑制重复回复。
-V
显示版本并退出。
-w deadline
指定超时时间,以秒为单位,在达到此超时时间后,ping 将退出,无论已发送或接收了多少数据包。在这种情况下,ping 不会在发送指定数量的数据包后停止,而是等待直到超时时间到期、接收到指定数量的回复,或从网络收到错误通知。
-W timeout
等待响应的时间,以秒为单位。此选项仅影响在没有接收到任何响应时使用的超时时间,否则 ping 将等待两个往返时间 (RTT)。允许使用带有小数点作为小数分隔符的实数(无论区域设置如何)。0 表示无限超时。
当使用 ping 进行故障隔离时,应首先在本地主机上运行,以验证本地网络接口是否已启动并正在运行。然后,应依次“ping”越来越远的各个主机和网关。将计算往返时间和数据包丢失统计信息。如果收到重复数据包,则不将其包含在数据包丢失计算中,但这些数据包的往返时间将用于计算最小/平均/最大/标准差往返时间。
总体标准差 (mdev) 本质上是每个 ping RTT 与平均 RTT 之间的平均距离。mdev 越高,RTT 的变化越大(随时间推移)。如果 RTT 的变化很大,则在进行大量数据传输时,可能会出现速度问题(传输时间会比理论上需要的长,因为变化最终会导致发送方等待 ACK),并且 VoIP 质量会变得一般或较差。
当已发送(并已接收)指定数量的数据包时,或者如果程序通过 SIGINT 信号终止,则会显示简要摘要。可以通过 SIGQUIT 信号在不终止进程的情况下获得更短的当前统计信息。
该程序用于网络测试、测量和管理。由于它可能会对网络产生负载,因此不建议在正常操作期间或在自动化脚本中使用 ping。
环境
IPUTILS_PING_PTR_LOOKUP 环境变量设置为 0,以禁用默认的反向 DNS 解析(PTR 查找)。它将被 -H 或 -n 选项覆盖。
退出状态
如果 ping 没有接收到任何回复数据包,它将以代码 1 退出。如果同时指定了数据包计数和超时时间,并且在超时时间到期时接收到的数据包数量少于指定数量,它也将会以代码 1 退出。如果发生其他错误,它将以代码 2 退出。否则,它将以代码 0 退出。这使得可以使用退出代码来查看主机是否在线。
IPv6 链路本地目标地址
对于 IPv6,当目标地址具有链路本地作用域并且 ping 使用 ICMP 数据报套接字时,必须指定输出接口。当 ping 使用原始套接字时,不严格要求指定输出接口,但为了避免在有多个可能的输出接口时产生歧义,应该这样做。
有两种方式可以指定输出接口:
使用 % 符号
目标地址后附加 %,然后是输出接口名称或 ifindex,例如:
ping fe80::5054:ff:fe70:67bc%eth0
ping fe80::5054:ff:fe70:67bc%2
使用 -I 选项
当使用 ICMP 数据报套接字时,此方法自以下内核版本起受支持:5.17、5.15.19、5.10.96、5.4.176、4.19.228、4.14.265。 此外,它也不受 musl libc 的支持。
ICMP 数据包详情
不带选项的 IP 标头为 20 字节。 ICMP ECHO_REQUEST 数据包包含额外的 8 字节 ICMP 标头,后跟任意数量的数据。 当给出 packetsize 时,它表示这部分额外数据的尺寸(默认值为 56)。 因此,在 IP 数据包类型为 ICMP ECHO_REPLY 中接收到的数据量始终比请求的数据空间多 8 字节(ICMP 标头)。
如果数据空间的大小至少为 struct timeval 的大小,则 ping 会使用该空间开头的字节来包含时间戳,并在计算往返时间时使用该时间戳。 如果数据空间较短,则不会提供往返时间。
重复和损坏的数据包
ping 会报告重复和损坏的数据包。 重复的数据包不应该发生,并且似乎是由不适当的链路层重传引起的。 重复可能发生在许多情况下,而且很少(如果有的话)是一个好兆头,尽管低水平的重复可能并不总是需要引起警惕。
损坏的数据包显然是需要引起警惕的原因,并且通常表明网络或主机中的某个地方存在故障硬件。
ID 冲突
与使用端口来唯一标识接收者以传递数据的 TCP 和 UDP 不同,ICMP 使用标识符字段(ID)进行标识。 因此,如果在同一台机器上,在同一时间,两个 ping 进程使用相同的 ID,则回显回复可能会传递给错误的接收者。 这是一个已知问题,因为 16 位 ID 字段的大小有限。 这是一种历史限制,目前无法修复,除非我们将 ID 编码到 ping 数据包的有效负载中。 ping 会打印“不同的地址”错误,并且数据包丢失为负值。
ping 使用 PID 来获取唯一的数字。 `/proc/sys/kernel/pid_max` 的默认值为 32768。 在大量使用 ping 并且 pid_max 大于 65535 的系统中,冲突肯定会发生。
尝试不同的数据模式
(互连)网络层绝不应该根据数据部分中包含的数据对数据包进行不同的处理。 不幸的是,已知存在一些数据依赖性问题,这些问题可能会潜伏在网络中并长时间未被发现。 在许多情况下,导致问题的特定模式是缺乏足够的“过渡”,例如全部为 1 或全部为 0,或者一种边缘模式,例如几乎全部为 0。 仅仅在命令行上指定全部为零(例如)的数据模式并不足以解决问题,因为感兴趣的模式位于数据链路层,并且您输入的内容与控制器传输的内容之间的关系可能很复杂。
这意味着,如果您有一个数据相关的故障,您可能需要进行大量的测试才能找到它。如果您足够幸运,您可能会找到一个无法通过您的网络发送,或者传输时间比其他类似长度的文件长得多的文件。然后,您可以检查该文件,查找可以用于使用 ping 命令的 -p 选项进行测试的重复模式。
TTL 详细信息
IP 数据包的 TTL 值表示数据包在被丢弃之前可以经过的最大 IP 路由器数量。在实际操作中,您可以期望互联网中的每个路由器将 TTL 字段精确地减 1。
TCP 数据包的 TTL 字段可以取各种值。该字段的最大可能值为 255,推荐的初始值为 64。有关更多信息,请参阅 RFC9293 的 TCP/较低层接口部分。
在正常操作中,ping 会打印它收到的数据包中的 TTL 值。当远程系统接收到 ping 数据包时,它可以对响应中 TTL 字段执行以下三个操作之一:
不更改它;这是 4.3BSD Tahoe 版本之前的 Berkeley Unix 系统所做的。在这种情况下,接收到的数据包中的 TTL 值将为 255 减去往返路径中的路由器数量。
设置为 255;这是当前的 Berkeley Unix 系统所做的。在这种情况下,接收到的数据包中的 TTL 值将为 255 减去从远程系统到 ping 主机的路径中的路由器数量。
设置为其他值。有些机器对 ICMP 数据包使用与 TCP 数据包相同的 TTL 值,例如 30 或 60。其他机器可能会使用完全随机的值。
错误
许多主机和网关都忽略 RECORD_ROUTE 选项。
由于 RECORD_ROUTE 等选项,最大的 IP 标头长度太小,因此无法完全发挥作用。但是,对此几乎没有什么可以做的。
通常不建议进行泛洪 ping,并且只有在非常受控的条件下才应 ping 广播地址。
参阅
历史
ping 命令出现在 4.3BSD 中。
此处描述的版本是特定于 Linux 的其衍生版本。
截至 s20150815 版本,ping6 二进制文件不再存在。它已被合并到 ping 中。创建一个名为 ping6 的符号链接,指向 ping,将产生与之前相同的功能。
安全性
如果程序用于非回显查询(请参阅 -N 选项),或者当回显请求的标识字段设置为 0 时(请参阅 -e),或者如果内核不支持 ICMP 数据报套接字,或者如果用户不允许创建 ICMP 回显套接字,则 ping 需要 CAP_NET_RAW 权限才能执行。该程序可以作为 set-uid root 程序使用。
可用性
ping 是 iputils 软件包的一部分。