为什么“dig localhost”比“nslookup localhost”快得多?

为什么“dig localhost”比“nslookup localhost”快得多?

查找地址时localhostnslookup localhost大约需要 15 秒:

$ /usr/bin/time nslookup localhost
;; connection timed out; no servers could be reached

Command exited with non-zero status 1
0.00user 0.00system 0:15.00elapsed 0%CPU (0avgtext+0avgdata 4072maxresident)k
0inputs+0outputs (0major+1121minor)pagefaults 0swaps

dig localhost是立即的。

$ /usr/bin/time dig localhost

; <<>> DiG 9.9.5-3ubuntu0.17-Ubuntu <<>> localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20936
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;localhost.         IN  A

;; ANSWER SECTION:
localhost.      0   IN  A   127.0.0.1

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed May 09 08:53:37 UTC 2018
;; MSG SIZE  rcvd: 43

0.00user 0.00system 0:00.07elapsed 6%CPU (0avgtext+0avgdata 4244maxresident)k
320inputs+0outputs (1major+1164minor)pagefaults 0swaps

为什么dig比 快这么多nslookup?做什么nslookup/dig不做什么会花这么长时间?

顺便:

$ grep localhost /etc/hosts
127.0.0.1 localhost

失败的事实nslookup是由于配置问题:/etc/resolv.conf包含一个额外的search后缀,该后缀被转发到不存在的解析器。

我的问题是:为什么会有这种差异?

答案1

在您的特定情况下,这是因为nslookup超时,这通常比获得有效响应需要很长时间。

进一步了解一下背景:

  • dig主要是一个低级调试工具。它本身不执行递归,需要您指定要查询的服务器,并允许您查询任意 RR 类型(或仅ANY获取所有记录)。它执行实际查找的速度通常比 nslookup 稍快,因为它在命令行上拥有所需的所有数据。
  • nslookup旨在成为查询 DNS 基础架构的交互式工具,而不是像 一样固有地进行现场查找dig。它恰好提供了一种非交互式模式(您在上面使用的),但这主要是简写。虽然您可以告诉它使用特定的服务器,但它将默认使用 中配置的服务器/etc/resolv.conf,因此没有指定服务器的启动会比 稍慢dig(因为它必须查找文件)。
  • host,您没有提到,但为了完整性,值得在此提及,是 C 库提供的用于执行主机名查找的命令。它使用 C 库中的名称解析例程,这意味着它遵守/etc/resolv.conf,但它也将遵守中的设置/etc/nsswitch.conf,这意味着它可以通过 NIS 或 NIS+、通过 LDAP、通过 mDNS(如果您为此使用了正确的 TLD)、通过 LLMNR 或通过任何其他方式在 中查找主机名/etc/hosts,因此,与 和 相比,它很慢dignslookup但它也会向您准确显示使用系统的名称解析设置而不是执行自己的 DNS 的程序将看到的内容。

相关内容