如何显示 ping 失败?

如何显示 ping 失败?

当我们使用 Windows ping 时,它会显示失败的 ping。Ubuntu 有类似的功能吗?

在调试网络时,ping 失败非常有用。你们是怎么解决这个问题的?好吧,我只想要简单的解决方案,我不想要一个很长的脚本。

答案1

当 Windows 的 ping 命令提示“请求超时”时,本身并不是错误。微软随意选择了 4 秒的超时时间,超过该时间他们就认为“失败”并报告。如果你从火星 ping 任何东西,那肯定是误报,但即使在地球上,RTT(往返时间)超过 4 秒也是完全有可能的。超时时间可以通过开关配置/w <millisec>

在 Linux 上,ping 实用程序不认为超时是失败并且不等待回复。通常,它会立即按原样打印所有收到的回复,包括“迟到”的回复、无序的回复、重复的回复和冲突的回复(例如,“无法到达目的地”之后的有效回复)。

话虽如此,通常有一些选项可以查看长时间未收到回复的情况。即使在我的 Android 手机上,库存 ping 实用程序也支持以下 2 个选项:

  • -D在每条消息之前打印时间戳,使差距更容易发现。
  • -O如果在发送下一个 ping 之前没有收到回复,则打印一条消息,这或多或少就是被问到的问题。但是,“超时”固定为 ping 间隔(-i)。

但是,这些选项似乎并不是在所有地方都受支持(例如,据我所知,Debian Wheezy 缺少这些选项,而 Jessie 有这些选项。busybox ping但尚不支持它们)。

下面是我设法获得的示例输出(跳过了不重要的 ping 回复):

u0_a93@NX505J:/ $ ping -D -O 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[1440545014.805478] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=244 time=116 ms
~~~~~~~~~~
[1440545142.995443] 64 bytes from 8.8.8.8: icmp_seq=129 ttl=244 time=110 ms
[1440545144.885601] no answer yet for icmp_seq=130
[1440545145.455485] 64 bytes from 8.8.8.8: icmp_seq=131 ttl=244 time=568 ms
[1440545145.455780] 64 bytes from 8.8.8.8: icmp_seq=130 ttl=244 time=1569 ms
[1440545146.005850] 64 bytes from 8.8.8.8: icmp_seq=132 ttl=244 time=119 ms
~~~~~~~~~~
[1440545254.055962] 64 bytes from 8.8.8.8: icmp_seq=240 ttl=244 time=115 ms
^C
--- 8.8.8.8 ping statistics ---
240 packets transmitted, 240 received, 0% packet loss, time 239250ms
rtt min/avg/max/mdev = 109.062/138.757/1569.620/101.608 ms, pipe 2

注意#130首先被报告为“丢失”,然后被收到#131,最后数据包丢失报告为零。Windows 的 ping 永远不会给出这样的结果:它会等待回复或超时,然后才发送下一个 ping,忽略任何延迟或非第一个回复。

答案2

部分偏离EvgEnZh的答案,但我有自己的版本:

ping -O -q 8.8.8.8

这样,当回复时间过长或从未返回时,它会打印一条消息(-O),而当回复返回时,它会隐藏消息(-q)。结果是,您只会在数据包丢失时获得输出。这样,您就不必在一堆“它正常工作”的消息中寻找少数几个出现故障的地方,从而可以更轻松地找到间歇性问题。

答案3

也许ping -f适合你。摘自 ping 手册:

-F

泛洪 ping。对于每个发送的 ECHO_REQUEST,都会打印一个句点“。”,而对于每个收到的 ECHO_REPLY,都会打印一个退格符。这可以快速显示丢弃了多少数据包。如果没有给出间隔,它会将间隔设置为零,并以数据包返回的速度或每秒一百次(以较大者为准)输出数据包。只有超级用户才能使用零间隔的此选项。

对于每秒 1 个 echo_request 来说,它看起来像ping -i 1 -f 8.8.8.8

答案4

即使使用 -v 选项,ping 也不会这样做。请参阅这个问题。但如果这对你来说真的很重要(或很有趣),你可以下载源代码,修改代码以包含合适的 printf 调用。一个好的地方是方法“send_probe”的末尾(12.10 上的第 619 行)...

首先你得到源代码

apt-get source iputils
cd iputils*

进行编辑

gedit ping.c

构建并安装生成的包...

apt-get install libsysfs-dev
dpkg-buildpackage

相关内容