美文网首页
DNS解析和DNS缓存

DNS解析和DNS缓存

作者: 琳_1fe8 | 来源:发表于2020-10-21 09:11 被阅读0次

    一、DNS解析

    DNS解析也即是我们说的域名解析,为了方便记忆,网站都是注册了一个域名,通过域名来访问网站。访问网站内容,实际是通过访问IP地址实现的,所以在域名和IP之前存在一种对应关系,而域名解析服务器即DNS服务器则完成将域名翻译成IP地址的任务。

    对于用户来说,永远不需要关心访问的IP地址是多少,只需要输入域名即可,所以当IP发生变化时对用户没有一点影响,这就是动态域名解析。域名服务器承载着IP与域名的管理工作和解析工作,当域名对应的IP出现变化时,域名服务器需要重新进行配置。

    动态域名:域名对应的IP地址不是固定的,是变化的,当IP变化后,计算机的域名软件会将新的IP发送到域名服务器,域名服务器进行配置更新。

    静态域名:域名对应的IP地址是固定的。

    DNS查询请求类型

    DNS服务器对于客户请求的答复具有多种类型,常见的有以下四种:

    权威答复:权威答复是返回给客户的正向答复,并且设置了DNS消息中的权威位。此答复代表从具有权威的DNS服务器处发出;

    正向答复:正向答复包含了匹配客户端解析请求的资源记录;

    参考答复:参考答复只在DNS服务器工作在迭代模式下使用,包含了其他有助于客户端解析请求的信息。例如,当DNS服务器不能为客户端发起的解析请求找到某个匹配值时,则向DNS客户端发送参考回复,告诉它有助于解析请求的信息;

    否定答复:否定答复指出权威服务器在解析客户端的请求时可能遇到了以下两种情况之一:

                        权威DNS服务器报告客户端查询的名字不存在;

                        权威DNS服务器报告存在对应的名字但是不存在指定类型的资源记录。

    无论正向答复还是否定答复,DNS客户端都将结果保存在自己的本地缓存中。

    DNS的TTL是指Time to live,既存活时间。

    DNS服务器对IP返回会有一些策略保证客户访问对服务器的负载均衡或速度保证,如IP随机返回,按最近离用户最近IP返回等,其主要的控制策略是调整列表中第一个返回的IP。RFC1794解释了dns对负载均衡的支持:http://www.faqs.org/rfcs/rfc1794.html

    一般的客户端(如浏览器)对DNS返回的IP的选择是取第一个IP,如果第一个IP失败了再去取第二个IP。也有一些客户端在连接第一个IP失败后就直接失败了

    二、各个环节的DNS缓存介绍

    浏览器 DNS缓存

    浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关。

    浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的DNS缓存时间,其中Chrome的过期时间是1分钟,在这个期限内不会重新请求DNS。Chrome浏览器看本身的DNS缓存时间比较方便,在地址栏输入

    chrome://net-internals/#dns

    就能看到看浏览器的缓存

    Java DNS缓存

    Java的网络应用程序的DNS缓存是由JVM的缓存策略控制的,当InetAddress类第一次使用某个域名(如www.google.com)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中。当下一次InetAddress类再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器。两种方式更改这个值:

    可以在应用程序中直接设置缓存过期时间:

    java.security.Security.setProperty("<span style="color:#e45649">networkaddress</span><span style="color:#986801">.cache</span><span style="color:#986801">.ttl</span>"</span>, <span style="color:#2aa198">10</span>);

    </code></span>

    更改jre中security文件中的设置 C:\Program Files\Java\jre1.8.0_31\lib\security\java.security

    The Java-level namelookup cache policy for successful lookups:

    any negative value: caching forever

    any positive value: the number of seconds to cache an address for

    zero: do not cache

    default value is forever (FOREVER). For security reasons, this

    caching is made forever when a security manager is set. When a security

    manager is not set, the default behavior in this implementation

    is to cache for 30 seconds.

    networkaddress.cache.negative.ttl=10

    networkaddress.cache.ttl=-1

    该文件中的文字对以上值已经解释的比较清楚。cache.negative.ttl就是指缓存DNS否定答复的时间。

    OS DNS缓存

    OS缓存会参考DNS服务器响应的TTL值,但是不完全等于TTL值。

    测试,以知乎的DNS解析为例:

    <span style="color:#657b83"><code>C:\windows\system32>ipconfig /displaydns

    </code></span>

    www.zhihu.com

    记录名称. . . . . . . : www.zhihu.com

    记录类型. . . . . . . : 1

    生存时间. . . . . . . : 323 (秒)

    数据长度. . . . . . . : 4

    部分. . . . . . . . . : 答案

    A (主机)记录 . . . . : 60.28.215.71

    记录名称. . . . . . . : www.zhihu.com

    记录类型. . . . . . . : 1

    生存时间. . . . . . . : 323

    数据长度. . . . . . . : 4

    部分. . . . . . . . . : 答案

    A (主机)记录 . . . . : 60.28.215.70

    通过域名解析命令获取ISP端的域名服务中的TTL时间:

    C:\Users\cmcc>nslookup -d www.zhihu.com

    </code></span>

    服务器: ns4.zj.chinamobile.com

    Address: 211.140.188.188

    Got answer:

    HEADER:

    opcode = QUERY, id = 2, rcode = NOERROR

    header flags: response, want recursion, recursion avail.

    questions = 1, answers = 2, authority records = 2, additional = 18

    QUESTIONS:

    www.zhihu.com, type = A, class = IN

    ANSWERS:

    -> www.zhihu.com

    internet address = 60.28.215.71

    ttl = 900 (15 mins)

    -> www.zhihu.com

    internet address = 60.28.215.70

    ttl = 900 (15 mins)

    AUTHORITY RECORDS:

    -> zhihu.com

    nameserver = ns3.dnsv4.com

    ttl = 136 (2 mins 16 secs)

    可以看到本地ISP服务器上缓存的时间是15分钟,就算刷新了本机操作系统缓存,ISP上仍然存在。

    Windows

    Windows2003之前的DNS缓存设置时间在注册表的位置是HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Dnscache/Parameters

    键名MaxCacheEntryTtlLimit,为DNS缓存条目TTL最大值,在XP和2003系统中此项名称为MaxCacheTtl。

    MSDN中对此有详细介绍:https://technet.microsoft.com/en-us/library/cc959517.aspx

    非常详细的解释了DNS域TTL与操作系统的DNS缓存策略的关系:

    The default value for MaxCacheEntryTtlLimit is DWORD = 0x15180 = 86400 seconds = 1 day

    if DNS zone TTL < MaxCacheEntryTtlLimit, then DNS TTL is used

    if DNS zone TTL > MaxCacheEntryTtlLimit, then MaxCacheEntryTtlLimit is used

    以下命令windows系统可使用:

    ipconfig /displaydns 显示本机dns, 生存时间, 80-8000都有

    ipconfig /flushdns 刷新windows dns缓存

    Android

    Addresses are cached for 600 seconds (10 minutes) by default. Failed lookups are cached for 10 seconds.

    DNS caching

    In Android 4.0 (Ice Cream Sandwich) and earlier, DNS caching was performed both by InetAddress and by the C library, which meant that DNS TTLs could not be honored correctly. In later releases, caching is done solely by the C library and DNS TTLs are honored.

    IOS

    按照官方文档说法,iOS 设备上每24小时刷新一次DNS缓存

    其他系统的DNS相关命令

    MAC

    lookupd-flushcache 清缓存

    Linux

    /etc/init.d/nscd restart 清缓存

    ipconfig/displaydns   -查看被缓存的域名解析

     ipconfig/flushdns       -清空DNS缓存

    ISP DNS缓存

    ISP(电信运营商)缓存有些不靠谱,有些缓存服务器(不多)会忽略网站DNS提供的TTL,自己设置一个较长的TTL,导致顶级DNS更新时不能及时拿到新的IP地址。

    可以看出,在从Root DNS请求域名解析的过程中,有太多的层次影响DNS的获取,缓存是双刃剑,提高了获取DNS的速度,也会影响DNS在IP变更时不能及时更新到最新。

    相关文章

      网友评论

          本文标题:DNS解析和DNS缓存

          本文链接:https://www.haomeiwen.com/subject/xhijmktx.html