为什么按主机名 ping 比按 IP 地址 ping 需要更长的时间?

Spa*_*awk 8 networking ping

我注意到通过主机名 ping 比使用 IP 地址慢。例如,在 Linux 命令行中:

$ time ping google.com -c 1
PING google.com (150.101.213.160) 56(84) bytes of data.
64 bytes from 150.101.213.160: icmp_seq=1 ttl=61 time=14.4 ms

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

real    0m5.251s
user    0m0.003s
sys 0m0.005s

$ time ping 150.101.213.160 -c 1
PING 150.101.213.160 (150.101.213.160) 56(84) bytes of data.
64 bytes from 150.101.213.160: icmp_seq=1 ttl=61 time=14.5 ms

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

real    0m0.019s
user    0m0.001s
sys 0m0.004s
Run Code Online (Sandbox Code Playgroud)

我一开始以为是DNS服务器需要一段时间来解析,但是当我按主机名ping时,几乎立即出现第一行,表明IP地址已经确定。五秒钟的暂停是在此 DNS 解析之后,就在收到(第一个)ping 之前。

use*_*686 15

延迟是由于ping尝试通过查找(反向 DNS)将 IP 地址解析回名称1引起的。160.213.101.150.in-addr.arpa

通常,回复(无论是成功还是 nxdomain)应该是即时的,但也可能是您的 ISP 没有缓存它,并且当时权威服务器213.101.150.in-addr.arpa出现了问题。

它也可能是由错误配置或某些 DNS 服务器中的错误引起的。如果您每次都看到这种延迟发生,则可能是您的 DNS 解析器没有正确缓存回复(即使否定回复也是可缓存的)。

使用pingfrom iputils 时,添加-n选项以避免反向 DNS 查找。


1是域名或主机名,不是网址;它没有指定任何特定的协议或资源。http://google.com将是一个网址。http://150.101.213.160也将是一个 URL。

  • @Sparhawk:因为`ping` 要求它。就 DNS 服务器而言,`google.com.` 和 `160.213.101.150.in-addr.arpa.` 是绝对独立的——它们甚至由不同的组织委托——并且没有要求它们指向每个其他。例如,如果`mail.example.com./A` 有`1.2.3.4`,则可能是`4.3.2.1.in-addr.arpa./PTR` 有`travis.example.com`(服务器的实际姓名)。因此,为了方便起见,`ping` 尝试反向查找收到 ICMP 回复的任何人的 IP 地址。(它甚至可能是中间的路由器,发送错误回复。) (3认同)
  • @Sparhawk:此外,多个域可能指向同一个 IP 地址,在极少数情况下,一个 IP 地址的 rDNS 甚至可能指向多个域。因此,当`ping` 进行反向查找时,DNS 服务器不能根据它所看到的正向查找做出任何假设,反之亦然。它唯一可以重用的是 _exact_ 相同查询的缓存结果。 (2认同)