当主机无法访问时,为什么 ping 不会等待超时?

当主机无法访问时,为什么 ping 不会等待超时?

我正在尝试使用ping“等待直到主机响应,或者直到超时”。

当主机无法访问且 ping-w返回-W“目标主机不可达”

  • 使用超时:ping -W 10-> 永远运行
  • 使用带数据包计数的超时:ping -c 1 -W 10-> 几乎立即退出,代码为 1
  • 使用截止期限:ping -w 10-> 几乎立即退出,代码为 1
  • 使用数据包计数的截止期限:ping -w 10 -c 1-> 几乎立即退出,代码为 1

这一切对我来说都毫无意义。具体来说,为什么ping -W 10根本不退出?

在我尝试介绍的情况下,主机确实已关闭,并且我得到了以下信息ping

From 192.168.7.100 icmp_seq=95 Destination Host Unreachable

因此,我的本地路由似乎知道没有机会找到主机。但是,为什么截止期限/超时选项的行为如此奇怪?

顺便说一下,这是 Raspberry Pi bullseye,内核为 5.10.92。

答案1

如果您想了解更多信息,请使用ping -v。详细输出将提供更多信息。

当目的地不存在时,这是我的输出:

$ ping -W 10 -v 192.168.1.99
PING 192.168.1.99 (192.168.1.99) 56(84) bytes of data.
From 192.168.1.10 icmp_seq=3 Destination Host Unreachable
From 192.168.1.10 icmp_seq=6 Destination Host Unreachable
From 192.168.1.10 icmp_seq=9 Destination Host Unreachable

基本上,如果没有计数或任何其他方法来限制其操作,ping 将永远工作,每次尝试都会一次又一次地出现“目标主机不可达”的错误。

计数(-c)和截止期限(-w)都是限制条件,当它们被触发时会导致 ping 终止。

-W参数给出了等待答案的超时时间。它没有指定如果超过超时时间是否停止,而只是指定了等待答案的时间,而在您的情况下答案永远不会到来。

答案2

据我有限的理解:

  1. 您正在向目标主机发送 ICMP ping。

  2. 目标子网前面的网关检查并知道该主机不存在于其网络上。

  3. 一旦您的客户端和您尝试 ping 的主机之间的路由上的一个网关报告该主机不可访问,就没有理由继续进一步搜索。

  4. 然后网关以 ICMP 类型 3 代码 1 数据包回复,表明主机不可达。

  5. ping将退出。

man ping注意

-c count
            Stop after sending count ECHO_REQUEST packets. 
            With deadline option, ping waits for count ECHO_REPLY packets, 
            until the timeout expires.
...
-w deadline
           Specify a timeout, in seconds, before ping exits regardless 
           of how many packets have been sent or received. 
           In this case ping does not stop after count packet are sent, 
           it waits either for deadline expire or until count probes 
           are answered or for some error notification from network.

-W timeout
            Time to wait for a response, in seconds. 
            The option affects only timeout in absence of any responses
...

If ping does not receive any reply packets at all it will exit with code 1. 
If a packet count and deadline are both specified,
and fewer than count packets are received by the time the deadline has arrived, 
it will also exit with code 1. 
On other error it exits with code 2. Otherwise it exits with code 0.

如果手册页中提到的“数据包”被定义为 ICMP 类型 0 数据包(即来自可以成功到达的主机的回应回复),则您所描述的行为是有意义的。正如您的情况一样,没有收到有效的回应回复,而是报告了某种网络错误,ping将退出。

ICMP 类型

更多信息

相关内容