通过负载均衡器+域名实现容灾切换-(3)浏览器的DNS缓存过程

===========================================
浏览器访问的DNS缓存机制
参考:https://blog.csdn.net/realmeh/article/details/22663807
===========================================

关于浏览器的DNS缓存机制,有一篇详细的文章描述:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/

简单来说,一条域名的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文件生效!

如何清除浏览器的DNS缓存呢?
1、chrome
chrome对每个域名会默认缓存60s。
chrome://chrome-urls/可以看到chrome所有的配置界面。chrome://dns或者chrome://net-internals/#dns可以查看chrome浏览器的dns缓存信息,点击“Clear host cache”+然后选择"clear cache"和 " flush socket",可以清空chrome的dns缓存。

2、firefox
network.dnsCacheEntries:缓存的数量
network.dnsCacheExpiration:dns缓存的时间
network.dnsCacheExpirationGracePeriod:dns缓存的时间,设置为0表示不缓存

如果一个域名的DNS解析结果会有多个的话(A记录列表),浏览器是如何处理的呢?
Chrome浏览器会优先向第一个IP发起HTTP请求,如果不通,再向后面的IP发起HTTP请求。

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

猜你喜欢

转载自www.cnblogs.com/yickel/p/10961963.html