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

系统 Linux
在本文中,我们将讨论网络连接最基本的诊断工具之一: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。

$ ping 0 -c 1PING 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 0msrtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms

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

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

$ 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​​ 我的打印机:

$ ping 192.168.0.4

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

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

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

$ ping -c 2 8.8.8.8PING 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 ms64 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 1000msrtt min/avg/max/mdev = 53.304/53.424/53.544/0.120 ms

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

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

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

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

$ 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 个字节:

$ ping -s 35 -c 5 8.8.8.8

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

$ 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 秒:

$ ping -i 2

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

$ ping -w 6

ping 的变体

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

一起来学习吧

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

责任编辑:庞桂玉 来源: Linux中国
点赞
收藏

51CTO技术栈公众号