由于我们再网络中使用的HTTP请求是基于TCP/IP协议,而TCP/IP的基础是IP协议,所以网络中两台机器的通讯都是使用IP进行通信,而不是我们通常见到的域名。DNS解析就是将域名翻译成IP的过程,了解DNS具体信息可见:DNS。
具体的解析过程可以用上图来概括,下面详细介绍一下。
浏览器缓存
现代浏览器大多都会对DNS解析结果进行缓存,来提升网站的加载速度。
以chrome为例,之前版本可以通过chrome://net-internals/#dns可以查看浏览器的缓存信息,但是好像71版本之后去掉了这个功能,需要通过chrome://net-export来记录浏览器日志后,上传至https://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地址信息。
一次dns缓存引发的惨案
how-to-view-dns-cache-in-osx
Reset the DNS cache in OS X
https://www.zhihu.com/question/23042131/answer/1220848249