===========================================
浏览器访问的DNS缓存机制
参考:https://blog.csdn.net/realmeh/article/details/22663807
===========================================chrome
关于浏览器的DNS缓存机制,有一篇详细的文章描述:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/windows
简单来讲,一条域名的DNS记录会在本地有两种缓存:浏览器缓存和操做系统(OS)缓存。
在浏览器中访问的时候,会优先访问浏览器缓存,若是未命中则访问OS缓存,最后再访问DNS服务器(通常是ISP提供),而后DNS服务器会递归式的查找域名记录,而后返回。浏览器
DNS查询顺序:浏览器缓存→系统缓存→路由器缓存→ISP DNS 缓存→递归搜索缓存
DNS记录会有一个TTL值(time to live),单位是秒,意思是这个记录最大有效期是多少。通过实验,OS缓存会参考TTL值,可是不彻底等于TTL值,而浏览器DNS缓存的时间跟TTL值无关,每种浏览器都使用一个固定值。
通过测试,Mac下Chrome的DNS缓存时间是1分钟。Safari下DNS缓存时间大约为10秒。安全
听说修改主机的Hosts文件,能够清除DNS缓存。为何修改hosts文件以后,有时会马上生效,有时却一直不生效呢?
其实缘由很简单,Hosts修改的是OS的DNS缓存,而不是浏览器的DNS缓存:
例如:我00秒的时候使用chrome访问过www.google.com.hk,此时浏览器DNS缓存产生,而后我修改了hosts文件,将www.google.com.hk指向本地127.0.0.1,而后在05秒的时候尝试再次访问这个地址,由于浏览器DNS缓存未过时,因此hosts修改没法体现出来。
另外一种状况下,我好久都没有访问www.baidu.com了,而后我修改了hosts文件,将其指向127.0.0.1,这时由于浏览器没有DNS缓存,因此会查询操做系统中的DNS缓存,结果此时hosts文件生效!bash
如何清除浏览器的DNS缓存呢?
一、chrome
chrome对每一个域名会默认缓存60s。
chrome://chrome-urls/能够看到chrome全部的配置界面。chrome://dns或者chrome://net-internals/#dns能够查看chrome浏览器的dns缓存信息,点击“Clear host cache”+而后选择"clear cache"和 " flush socket",能够清空chrome的dns缓存。服务器
二、firefox
network.dnsCacheEntries:缓存的数量
network.dnsCacheExpiration:dns缓存的时间
network.dnsCacheExpirationGracePeriod:dns缓存的时间,设置为0表示不缓存app
若是一个域名的DNS解析结果会有多个的话(A记录列表),浏览器是如何处理的呢?
Chrome浏览器会优先向第一个IP发起HTTP请求,若是不通,再向后面的IP发起HTTP请求。socket
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 。编辑器
IE解决方式:
禁用DNS缓存的方法,将下面内容保存为注册表文件,在运行写入注册表:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=dword:00000000
"DnsCacheTimeout"=dword:00000000
"ServerInfoTimeOut"=dword:00000000
写入注册表之后IE将再也不缓存DNS,咱们对hosts便会当即生效,无需再重启浏览器。
若是须要恢复IE的DNS缓存,只需清楚咱们以前写入的注册表内容。跟上面的方法同样:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"DnsCacheEnabled"=-
"DnsCacheTimeout"=-
"ServerInfoTimeOut"=-
================================
OS的TTL缓存
================================
不一样的操做系统,它的TTL值是不相同的,默认状况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。笔者单位使用的是Windows 2000服务器,TTL值默认为128,若是将该值修改成255,那么局域网内的用户就会觉得这个服务器是Linux系统或UNIX系统,那么他们就会针对Linux系统或UNIX系统来查找Windows 2000服务器的安全漏洞,不过他们是不会找到什么安全漏洞的,这样一来,服务器就安全多了。
修改TTL值其实很是简单。经过注册表编辑器就能够实现,点击“开始→运行”,在“运行”对话框中输入“regedit”命令并回车,弹出“注册表编辑器”对话框,展开“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters”,找到“DefaultTTL”,将该值修改成十进制的“255”,从新启动服务器系统后便可。
Windows操做系统下查看TTL时长:命令行执行ipconfig displaydns。目前Win查看是95s。
微软windows下如何清空dns
在微软windows下,你能够用命令ipconfig /flushd ns来清空dns 缓存内容。
你也能够用命令ipconfig /displaydns 来查看dns缓存内容。
Mac OSX下如何清空dns缓存
在Mac OSX中,你能够用这个命令lookupd -flushcache 来清空保留的缓存。
bash-2.05a$ lookupd -flushcache