查找地址时localhost
,nslookup 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
,因此,与 和 相比,它很慢dig
,nslookup
但它也会向您准确显示使用系统的名称解析设置而不是执行自己的 DNS 的程序将看到的内容。