由于我们再网络中使用的 HTTP 请求是基于 TCP/IP 协议,而 TCP/IP 的基础是 IP 协议,所以网络中两台机器的通讯都是使用 IP 进行通信,而不是我们通常见到的域名。DNS 解析就是将域名翻译成 IP 的过程,了解 DNS 具体信息可见:DNS。
具体的解析过程可以用上图来概括,下面详细介绍一下。
浏览器缓存
现代浏览器大多都会对 DNS 解析结果进行缓存,来提升网站的加载速度。
以 chrome 为例,之前版本可以通过 chrome://net-internals/#dns 可以查看浏览器的缓存信息,但是好像 71 版本之后去掉了这个功能,需要通过 chrome://net-export 来记录浏览器日志后,上传至 netlog-viewer.appspot.com/#import 来分析。但是依然可以通过 chrome://net-internals/#dns 中的“clear host cache”来清除浏览器的缓存,下图为本机 chrome 的DNS缓存信息
操作系统缓存
如果在浏览器缓存中未查询到 DNS 记录信息,将会从操作系统缓存中查询 DNS 信息。首先看本地的 host 文件中是否有此域名的映射,如果有则直接返回。否则看本地的 DNS 解析器中是否有相关域名缓存。
查看操作系统缓存
在 macOs 10.10.4 之后可以通过 log stream --predicate 'process == "mDNSResponder"' --info 查看 DNS 的活动情况,使用 sudo killall -INFO mDNSResponder 可以打印出当前 DNS 的统计信息。里面还有很多其他的信息,像本地 host 配置、DNS 服务器、授权记录等,感兴趣的同学可以自己打印看看。
清除操作系统缓存
在 macOs 10.10.4 之后可以通过 sudo killall -HUP mDNSResponder 来清空系统的 DNS 缓存。
域名解析服务器
如果从 host 以及操作系统缓存中都找不到,则会从网络设置中的首选 DNS 服务器中开始查找,如果没有经过特殊设置一般是路由器的网关(如 192.168.0.1),也有很多人会设置 DNS 的解析服务器,比如 Google 的 8.8.8.8。
在域名解析服务器中,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址,则调用这个 IP 地址映射,完成域名解析,此解析不具有权威性。
递归查询
如果域名解析服务器中也无法解析此网址则开始递归查询,以 ditu.amap.com 的解析为例
- 首先将请求发至 13 台根 DNS 服务器,根 DNS 服务器收到请求后会判断这个域名的顶级域名(com)是谁来管理的,并会返回此顶级域名相关的 NameServer 及 IP。
- 然后域名解析服务器会根据返回的 IP 向(com)的域名服务器请求域名的解析,顶级域名服务器则会返回次顶级域名(amap.com)相关的 NameServer 及 IP。
- 最后拿着顶级域名返回的 IP 向次级域名服务器请求域名解析,即可获得 ditu.amap.com 的 IP 地址信息。