浅谈DNS缓存机制--浏览器和OS篇
有人的地方,就有江湖,有DNS的地方,就有缓存。
为了提升域名查询效率,设计了域名缓存机制,当访问过某个网站并得到其IP后,会将其域名和IP缓存下来,下一次访问的时候,就不需要再请求域名服务器获取IP,直接使用缓存中的IP,提高了响应的速度。当然缓存是有有效时间(即TTL值)的,当过了有效时间后,再次请求网站,还是需要先请求域名解析。
目前,除了传统的递归DNS服务器(如运营商的Local DNS, 114dns,Google public DNS等)外,计算机中DNS记录在本地也有两种缓存方式:浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问OS缓存,最后再访问递归DNS服务器,然后递归DNS服务器会递归式的查找域名记录,然后返回结果。那么浏览器DNS缓存和操作系统DNS缓存又是怎样的呢?
浏览器DNS缓存:首先,浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关。浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的DNS缓存时间,如Chrome的过期时间是1分钟,在这个期限内不会重新请求DNS。常用的浏览器的DNS缓存时间如下:Chrome:为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地建立DNS缓存的方法,加快网站的连接速度。在Chrome地址栏中输入chrome://net-internals/#dns 就可以看各域名的DNS 缓存时间。默认,Chrome对每个域名会默认缓存60s:
Firefox:Firefox也有dns缓存功能,但是默认缓存时间只有1分钟,可以通过修改该默认值加快DNS解析速度,方法如下:打开一个新的窗口,地址栏输 入 about:config,回车,进入设置界面。然后搜索 network.dnsCacheExpiration,把原来的60改成 6000(表示缓存6000秒),再搜索network.dnsCacheEntries 把默认的20改成1000(表示缓存1000条)。如果没 有上面两个项目,新建它们即可,新建条目类型为整数型。 当然也可以按照需要设置成其它的值。但是dns缓存太久了也会出问题,比如有的网站ip换了,就无法访问了。针对这样的问题,还可以安装一个 firefox 插件来开启或者 关闭dns cache功能,https://addons.mozilla.org/zh-CN/firefox/addon/5914。
以下是第三方之前测试的不同浏览器的DNS缓存时间情况
(来源链接:https://dyn.com/blog/web-browser-dns-caching-bad-thing/)
操作系统DNS缓存:OS缓存会参考DNS服务器响应的TTL值,但是不完全等于TTL值。
Windows:
Windows系统默认开启DNS缓存服务,叫做DNSClient,可以缓存一些常用的域名。
ipconfig/displaydns – 这个命令可以展示现在你电脑已经缓存的域名
ipconfig/flushdns –这条记录可以帮你马上清空已经缓存的记录
Linux:
Linux系统的nscd服务可以实现DNS缓存的功能。nscd会缓存三种服务passwd,group,hosts,所以它会记录三个库,分别对应源/etc/passwd, /etc/hosts 和/etc/resolv.conf每个库保存两份缓存,一份是找到记录的,一份是没有找到记录的。每一种缓存都保存有生存时间(TTL)。其作用就是增加cache ,加快如DNS的解析等的速度。配置文件为/etc/nscd.conf 默认该服务在redhat或centos下是关闭的,可以通过services nscd start开启。缓存DB文件在/var/db/nscd下。可以通过nscd -g查看统计的信息,这里列出部分:
也可以通过strings /var/db/nscd/hosts命令查看缓存文件
清除缓存
1. nscd -i passwd
2. nscd -i group
3. nscd -i hosts
除了上面的方法,重启nscd服务同样可以达到清理cache的目的。
了解了DNS缓存机制也有助于你判断DNS解析不生效的排查。
- 点赞
- 收藏
- 关注作者
评论(0)