使用 Linux 的 ping 命令诊断网络连接问题

在本文中,我们将讨论网络连接最基本的诊断工具之一:ping 命令。

如今,联网计算机变得十分普遍,以至于我们大多数人都理所当然地认为,房间一侧的计算机可以连接上房间另一侧的计算机,更不用说能连接上世界的另一端的计算机了。如此,网络使互联网、云、文件共享、媒体流、远程管理、打印等服务成为可能。但是当网络出现问题时,有时很难诊断到底是其中哪一环节出现了问题。下面,我们就来介绍:网络连接最基本的诊断工具之一—— ping 命令。

基本的 ping 命令

当你无法访问本地网络上的计算机或互联网上的服务器时,你可以 ping 它的 IP 地址。ping 互联网控制报文协议 Internet Control Message Protocol (ICMP)数据包发送到目标 IP 地址。当我们要对网路连接状况进行判断时,ICMP 是个非常有用的协议,本质上 ICMP 是一个响应和应答信号。

让我们由近及远地进行故障排除。请先 ping 你自己的计算机,以确保你的计算机正在运行 网络栈 networking stack 。你正在操作的计算机称为 主机 localhost ,本地回环地址是:127.0.0.1

ping 命令能用主机的 主机名 hostname 、IP 地址(即 127.0.0.1)或者仅仅用简写 0 来表示 “主机”。

你可以使用 -c 选项,来控制发送数据包的 次数 count

1
2
3
4
5
6
7
8
$ ping 0 -c 1
PING 0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.069 ms

--- 0 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms

在你确认本地网络栈已启动并运行后,接下来,你可以 ping 你的路由器的 IP 地址。路由器的 IP 地址通常以 192.16810 开头。实际的 IP 地址取决于路由器的配置。

当你没有指定要发送多少次请求时,你可以用 Ctrl+C,来终止 ping 的运行。

1
2
3
4
5
6
7
8
$ ping 192.168.0.1 
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
From 192.168.0.100: icmp_seq=2 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.100: icmp_seq=3 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.100: icmp_seq=4 Redirect Host(New nexthop: 192.168.0.1)
From 192.168.0.100: icmp_seq=5 Redirect Host(New nexthop: 192.168.0.1)
^C

如果你能 ping 通路由器,则表示你的有线或无线连接能正常工作。

对于你的局域网上的其他主机呢?你可以 ping 各种设备,但是并非所有设备都能保证响应,因为一些设备会丢弃 ICMP 数据包,但许多设备会做出响应。例如,我可以 ping 我的打印机:

1
2
$ ping 192.168.0.4 

ping 路由器以外的其他服务器

在确定你自己的网络内部都能连通以后,你还可以 ping 通到路由器以外的其他服务器。同样地,并非所有服务器都能接收 ICMP 数据包,更不用说响应 ICMP 数据包了。然而,也有一些服务器可以接收并响应 ICMP 数据包,而在互联网中的一个重要服务器是 域名服务器 nameserver

谷歌的 域名解析服务器 DNS server 的 IP 地址很容易记住,而且它会响应 ping 请求:

1
2
3
4
5
6
7
8
9
$ ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=53.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=53.5 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 53.304/53.424/53.544/0.120 ms

当你连不上一个网站时,你可以查询全球 DNS 网络,以找出其主机服务器的地址,然后 ping 该服务器。这至少可以告诉你,网站不通的原因是主机已关闭,或者只是 Web 服务器问题。

例如,假设你尝试访问 example.com,但是发现失败了。首先,使用 host 命令找到 example.com 的 IP 地址:

1
2
3
4
5
$ host example.com
example.com has address 93.184.216.34
example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
example.com mail is handled by 0

然后,ping 该网站的的 IP 地址:

1
2
$ ping 93.184.216.34 -c 1

使用 IPv6

ping 不仅可以使用 IPv4,还能使用 IPv6。可以通过指定 -4-6 选项,来只使用 IPv4 或 IPv6。

设置数据包大小

你可以使用 -s 选项,来更改要发送的 ICMP 数据包的 大小 size 。默认的数据大小为 56 字节,加上 8 字节包头,总共得到 64 字节的 ICMP 数据包。以下的示例将发送的 ICMP 数据包大小修改为 35+8=43 个字节:

1
2
$ ping -s 35 -c 5 8.8.8.8

你可以使用 -D 选项,使得在终端中的每个 ping 回复之前,先打印出当前的时间戳。该时间戳为 UNIX 时间戳,加上微秒:

1
2
3
4
5
$ ping -D 8.8.8.8 
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[1634013430.297468] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=53.3 ms
[1634013431.298738] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=53.1 ms

设置时间间隔/长短

你可以使用 -i 选项,来更改两次 ping 请求之间的 时间间隔 interval 。以下的示例将 ping 间隔更改为 2 秒:

1
2
$ ping -i 2 

你也可以使用 -w 选项,来在一段时间后终止 ping,单位为秒。

1
2
$ ping -w 6

ping 的变体

ping 有很多变体。例如,iputils 包提供了 ping 命令;Busybox 也有ping 命令;BSD 也有;甚至还有一个图形界面的 pinggping,它可用于 Linux、macOS 和 Windows。你可以在 GitHub 上找到更多有关 gping 的信息。

一起来学习吧

ping 命令很简单,但它可以帮你诊断网络连接问题。下次再遇到网络连接问题时,让 ping 命令成为你解决问题的第一个工具吧。


via: https://opensource.com/article/21/10/linux-ping-command

作者:Seth Kenlon 选题:lujun9972 译者:chai001125 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


使用 Linux 的 ping 命令诊断网络连接问题
https://linuxcat.top/article-15271-1.html
作者
Seth Kenlon
发布于
2022年11月20日
许可协议
CC-BY-NC