「ping(8)」-

向网络主机发送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头,后跟struct timeval,然后是用于填充数据包的任意数量的“pad”字节。

命令ping适用于IPv4和IPv6。可以通过指定-4或-6来强制明确地只使用其中一个执行。

命令ping还可以发送IPv6节点信息查询(RFC4620)。 可能不允许使用中间跃点,因为不推荐使用IPv6源路由(RFC5095)。

命令支持的选项及含义

-4
仅使用IPv4。

-6
仅使用IPv6。

-a
当对端可达时,发出蜂鸣声。

-A
自适应ping。 发包间隔调整为往返时间,因此有效不超过一个(或更多,如果设置了预加载)未应答的探测存在于网络中。 对于非超级用户,最小间隔是200毫秒。 在具有低rtt的网络上,该模式基本上等同于泛洪模式。

-b
允许ping广播地址。

-B
不允许ping更改探测的源地址。当ping启动时,地址被绑定到一个选中地址。

-c count
发送count个ECHO_REQUEST数据包后停止。 使用截止时间选项,ping等待count个ECHO_REPLY数据包,直到超时到期。

-d
在正在使用的套接字上设置SO_DEBUG选项。 本质上,Linux内核不使用此套接字选项。

-D
在每行之前打印时间戳(unix时间 + gettimeofday中的微秒)。

-f
Flood ping。 对于每个发送的ECHO_REQUEST,打印一个句点“.”打印,而对于永远收到的ECHO_REPLY,会打印一个退格。 这样可以快速显示丢弃的数据包数量。如果没有给出间隔,它会将间隔设置为零,并按照它们返回或每秒一百次的速度输出数据包,以较多者为准。 只有超级用户才可以零间隔使用此选项。

-F flow label
仅限IPv6。 在echo请求数据包上分配和设置20位flow label(十六进制)。 如果value为零,则kernel分配随机flow label。

-i interval
发送每个数据包之间的等待interval秒。默认设置是在每个数据包之间等待一秒钟,或者在洪泛模式下不等待。 只有超级用户可以将间隔设置为小于0.2秒的值。

-I interface
参数interface是地址或接口名称。 如果interface是地址,则将源地址设置为指定的接口地址。 如果interface为接口名称,则将源接口设置为指定接口。 对于IPv6,当对链路本地范围地址执行ping操作时,需要链路说明(通过’%’-目标中的符号,或通过此选项)。

-l preload
如果指定了preload,则ping发送许多不等待回复的数据包。 只有超级用户可以选择超过3的预加载。

-L
抑制组播数据包的环回。 仅当ping目标是多播地址时,此标志才适用。

-m mark
使用mark来标记出去的数据包。 这在内核中有很多原因,例如使用策略路由选择特定的出站处理。

-M pmtudisc_opt
选择路径MTU发现策略。参数pmtudisc_option可以是do(禁止碎片,甚至是本地碎片),want(做PMTU发现,当数据包大小很大时本地碎片),dont(不设置DF标志)。

-N nodeinfo_option
仅限IPv6。 发送ICMPv6节点信息查询(RFC4620),而不是Echo Request。 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
仅限数字输出。不会尝试查找主机地址的符号名称。

-O
在发送下一个数据包之前报告未完成的ICMP ECHO回复。 这与时间戳-D一起使用,可以将输出记录到诊断文件并搜索缺失的响应。

-p pattern
您可以指定最多16个“填充”字节来填写您发送的数据包。 这对于诊断网络中与数据相关的问题很有用。 例如,-p ff将导致发送的数据包被“1”填充。

-Q tos
在ICMP数据报中设置QoS相关位。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
绕过正常的路由表,并直接发送到连接接口上的主机。 如果主机不在直接连接的网络上,则会返回错误。 如果还使用了选项-I,则此选项可用于通过没有路由的接口ping本地主机。

-R
只有ping。 记录路由。 包含在ECHO_REQUEST数据包中的RECORD_ROUTE选项,并在返回的数据包上显示路由缓冲区。 请注意,IP标头仅足以容纳九条此类路由。许多主机忽略或放弃此选项。

-s packetsize
指定要发送的数据字节数。 默认值为56,当与8字节的ICMP头数据组合时,转换为64个ICMP数据字节。

-S sndbuf
设置套接字sndbuf。 如果未指定,则选择缓冲不超过一个数据包。

-t
ttl ping。 设置IP生存时间。

-T timestamp option
设置特殊的IP时间戳选项。 timestamp option可以是tsonly(仅时间戳),tsandaddr(时间戳和地址),tsprespec host1 [host2 [host3 [host4]]](时间戳预先指定的跃点)。

-U
打印完整的用户到用户延迟(旧行为)。 通常ping打印网络往返时间,可以是不同的,比如由于DNS故障。

-w deadline
指定ping退出之前的超时(以秒为单位),无论已发送或接收了多少数据包。 在这种情况下,在发送指定数据包后,ping不会停止,它会等待直到截止时间到期或直到应答计数探测或来自网络的某些错误通知。

-W timeout
等待响应的时间,以秒为单位。 该选项仅在没有任何响应的情况下影响超时,否则ping等待两个RTT。

-v
显示更加详细的输出。

-q
安静的输出。 除启动时和完成时的摘要行外,不显示任何内容。

其他选项

-V
显示版本信息并退出。

-h
显示帮助信息。

注意事项

使用ping进行故障隔离时,应首先在本地主机上运行,​​以验证本地网络接口是否已启动并正在运行。然后,越来越远的主机和网关应该被“ping”过。计算往返时间和分组丢失统计。如果接收到重复的分组,则它们不包括在分组丢失计算中,尽管这些分组的往返时间用于计算最小/平均/最大往返时间数。当已发送(和接收)指定数量的数据包或程序以SIGINT终止时,将显示简要摘要。通过信号SIGQUIT可以在不终止进程的情况下获得更短的统计数据。

如果ping根本没有收到任何回复数据包,它将以代码“1”退出。如果指定了数据包计数和截止时间,并且在截止时间到达之前收到的数据包数量少于它,则它也将以代码“1”退出。在其他错误上,它以代码“2”退出。否则它以代码“0”退出。这使得可以使用退出代码来查看主机是否处于活动状态。

该程序旨在用于网络测试、测量、管理。由于它可能会对网络造成负载,因此在正常操作或自动脚本中使用ping是不明智的。

ICMP数据包细节

没有选项的IP头是20个字节。ICMP ECHO_REQUEST数据包包含额外的8个字节的ICMP标头,后跟任意数量的数据。 当给出包大小时,这表示该额外数据的大小(默认为56)。 因此,在ICMP ECHO_REPLY类型的IP包内接收的数据量将总是比所请求的数据空间(ICMP头)多8个字节。

如果数据空间至少是struct timeval的大小,则ping使用此空间的起始字节来包括它在计算往返时间时使用的时间戳。 如果数据空间较短,则不给出往返时间。

重复和损坏的包裹

命令ping将报告重复和损坏的数据包。 永远不会发生重复数据包,并且似乎是由不适当的链路级重新传输引起的。 在许多情况下可能会出现重复,并且很少(如果有的话)是一个好兆头,尽管低水平重复的存在可能并不总是引起警报。

损坏的数据包显然是导致警报的严重原因,并且经常指示ping数据包路径中的某个地方(网络中或主机中)的硬件损坏。

尝试不同的数据模式

(内部)网络层决不应根据数据部分中包含的数据对数据包进行不同的处理。不幸的是,已知数据相关的问题潜入网络并长时间未被发现。在许多情况下,具有问题的特定模式是没有足够的“过渡”,例如全部为一或全部为零,或者在边缘处具有模式,例如几乎全部为零。在命令行上指定全零(例如)的数据模式不一定足够,因为感兴趣的模式位于数据链路级别,并且您键入的内容与控制器发送的内容之间的关系可以是复杂。

这意味着如果您有数据相关的问题,您可能需要进行大量测试才能找到它。如果幸运的话,您可能会设法找到一个无法通过网络发送的文件,或者传输的文件比其他类似长度的文件需要更长的时间。然后,您可以检查此文件以查找可以使用ping的-p选项进行测试的重复模式。

TTL细节

IP数据包的TTL值表示数据包在被丢弃之前可以通过的最大IP路由器数。在当前的实践中,您可以期望Internet中的每个路由器将TTL字段减少一个。

TCP/IP规范规定TCP数据包的TTL字段应设置为60,但许多系统使用较小的值(4.3 BSD使用30,4.2使用15)。

该字段的最大可能值为255,并且大多数Unix系统将ICMP ECHO_REQUEST数据包的TTL字段设置为255。这就是为什么您会发现可以“ping”某些主机,但不能通过telnet(1)访问它们或ftp(1)。

在正常操作中,ping从它接收的数据包中打印TTL值。当远程系统收到ping数据包时,它可以在响应中使用TTL字段执行以下三种操作之一:

  • 不改变它;这是Berkeley Unix系统在4.3BSD Tahoe发布之前所做的事情。在这种情况下,接收数据包中的TTL值将 = 255 – 往返路径中的路由器数量。
  • 将其设置为255;这就是目前Berkeley Unix系统所做的。在这种情况下,接收数据包中的TTL值将 = 255 – 从远程系统到ping主机的路径中的路由器数量。
  • 将其设置为其他值。某些计算机对TCP数据包使用的ICMP数据包使用相同的值,例如30或60。其他计算机可能使用完全疯狂的值。

如上所述。

注意事项

许多主机和网关忽略RECORD_ROUTE选项。

最大IP标头长度太小了,无法使RECORD_ROUTE等选项完全有用。 然而,关于这一点没有太多可以做的。

一般不建议使用泛洪ping操作,只能在非常受控的条件下对广播地址进行泛洪ping操作。

历史

命令ping出现在4.3BSD中。

这里描述的版本是Linux特有的后代。

从版本s20150815开始,ping6二进制文件不再存在。 它已合并到ping中。 创建一个名为ping6的符号链接指向ping,将产生与以前相同的功能。

安全

ping需要执行CAP_NET_RAW功能:1)如果程序用于非回显查询(参见-N选项);2)如果内核不支持非原始ICMP套接字;3)如果不允许用户创建一个ICMP echo套接字。该程序可以用作set-uid为root。

相关手册

netstat(1), ifconfig(8).

参考文献

  • man 8 ping, Version 320161105-1

更新日志

  • 10/25/2018 创建文章