原理

如图所示,域名是一种树状结构,最顶层的域名是根域名(注意是一个点“.”,它是 .root 的含义,不过现在“.root”已经默认被隐藏),然后是顶级域名(Top Level Domain,简写 TLD,例如 .com),再是二级域名(例如 google.com)。

Image

通常情况下的域名解析过程,其实就是从“域名树”的根部到顶部,不断递归查询的过程。整个解析过程可总结如下图。

Image

排查域名解析故障

如果请求一个 HTTPS 接口,出现服务不可用、Unknown host 等错误时,除了用 ping 测试连通性外,我们可以用 nslookup 或者 dig 命令确认域名解析是否出现问题。

先看 nslookup 命令,该命令可用于查询域名的解析结果,判断域名解析是否正常。nslookup 命令示例:

$ nslookup github.com
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
Name:	github.com
Address: 20.205.243.166

上述的返回信息说明:

实际上,“DNS 解析器”也经常出现问题,这时候再使用 nslookup 命令就不行了。

当怀疑系统默认的“DNS 解析器”异常时,我们可以使用 dig 命令,通过切换不同的“DNS 解析器”,分析解析哪里出现异常。例如,使用 8.8.8.8 查询 github.com 的解析记录。代码如下所示:

$ dig @8.8.8.8 github.com

; <<>> DiG 9.16.48-Ubuntu <<>> @8.8.8.8 github.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17821
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;github.com.			IN	A

;; ANSWER SECTION:
github.com.		60	IN	A	20.205.243.166

;; Query time: 31 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon May 12 14:04:22 CST 2025
;; MSG SIZE  rcvd: 55

上述的返回信息说明: