程序员DNS知识指南

吴押狱
• 阅读 12398

本次内容比较hardcore,非科班出身可能会有理解障碍,可以考虑不用挣扎,直接放弃。毕竟普通驾驶员是不需要理解内燃机原理和曲轴如何做功的,所谓术业有专攻也,能看完的不是同行就是真爱~

DNS对于网络应用的重要性不言而喻,先解释一下其工作原理。

我们上网的原点就是打开浏览器,在上方地址栏输入网址的那一刻,这个回车按了之后,发生了很多事情。首先,计算机只懂0和1,也就是说人类的字母网址计算机是不懂的,它只认识IP地址,如果是IPV4那就是4组8位的二进制数字。为了人类方便,需要有一个把网址翻译成IP地址的服务,就是DNS。其工作原理如图

程序员DNS知识指南

这是一个高度简略的示意图,实际上DNS整个获取过程是被层层缓存的,一个DNS的获取并不一定都是从权威处获得的响应。再来一个复杂点的示意图:
程序员DNS知识指南

DNS查询请求类型

查询响应类型
 DNS服务器对于客户请求的答复具有多种类型,常见的有以下四种:
  权威答复:权威答复是返回给客户的正向答复,并且设置了DNS消息中的权威位。此答复代表从具有权威的DNS服务器处发出;
  正向答复:正向答复包含了匹配客户端解析请求的资源记录;
  参考答复:参考答复只在DNS服务器工作在迭代模式下使用,包含了其他有助于客户端解析请求的信息。例如,当DNS服务器不能为客户端发起的解析请求找到某个匹配值时,则向DNS客户端发送参考回复,告诉它有助于解析请求的信息;
  否定答复:否定答复指出权威服务器在解析客户端的请求时可能遇到了以下两种情况之一:
  权威DNS服务器报告客户端查询的名字不存在;
  权威DNS服务器报告存在对应的名字但是不存在指定类型的资源记录。

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

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

DNS服务器解析返回IP分配策略与客户端对域名IP选择策略

一个简单测试,先解析163域名

C:\Users\cmcc>nslookup www.163.com
服务器:  ns4.zj.chinamobile.com
Address:  211.140.188.188

非权威应答:
名称:    c01.i05.cmbzj.hadns.net
Addresses:  111.1.38.160
          111.1.38.159
          223.94.95.114
          223.94.95.119
Aliases:  www.163.com
          www.163.com.cloudcdn.net
          c01.i05.hacdn.net

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

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

各个环节的DNS缓存介绍

浏览器 DNS缓存

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

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

chrome://net-internals/#dns

就能看到看浏览器的缓存
程序员DNS知识指南

Java DNS缓存

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

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

java.security.Security.setProperty("networkaddress.cache.ttl", 10);
  • 更改jre中security文件中的设置 C:Program FilesJavajre1.8.0_31libsecurityjava.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解析为例:

C:\windows\system32>ipconfig /displaydns

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

服务器: 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...
非常详细的解释了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 清缓存

ISP DNS缓存

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

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


文章来自微信平台「麦芽面包」(微信扫描二维码关注)。未经允许,禁止转载。

程序员DNS知识指南

点赞
收藏
评论区
推荐文章
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
3A网络 3A网络
3年前
DNS 系列(二):DNS 记录及工作方式,你了解吗?
在上一篇《DNS系列(一):为什么更新了DNS记录不生效?》中,我们主要讲解了DNS和DNS传播,知道了网络通信主要通过IP地址来进行,而域名系统(DNS)则是保证用户在浏览器中输入域名之后,可以访问到对应的网站服务器。那这个过程到底是如何进行的呢?DNS记录DNS记录是位于权威DNS服务器中的指令,提供域和主机名相关的详细信息,
鱼蛮子9527 鱼蛮子9527
3年前
DNS
DNS(DomainNameSystem),主要作用是将域名转成IP,本文主要讲解了DNS的一些基础知识,以及DNS转换域名的过程。DNS是什么绝大多数网络通信都是基于TCP/IP协议,而TCP/IP协议的基础是IP,所以网络中的计算机进行通信都是基于IP而不是我们在浏览器中输入的域名。DNS全程是DomainName
高防加速CDN 高防加速CDN
2年前
怎样预防和处理DNS劫持?
DNS中文叫域名解析,在计算机中占据非常重要的作用,但是DNS也会被攻击,比如我们经常遇见的域名被劫持,其实也就是DNS被劫持,这里许多人一定会很好奇,DNS被劫持这是怎么回事呢?DNS被劫持后会出现怎么样的后果呢?DNS被劫持后还能拯救吗?对于这些DNS
Stella981 Stella981
4年前
Linux查看DNS服务器及设置DNS服务器
DNS(DomainNameSystem,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。一台主机的dns服务器的好坏会直接影响我们上网的速度以及网站的访问,今天我们一起来看一下如何为Linux系统配置好用的公共DNS.1\.查看服务器的DNS方法一,查看
Stella981 Stella981
4年前
DHCP服务原理与搭建(Linux系统+路由器,二选一方案)
大家都知道上网的最基本前提是要在终端上设置IP、子网掩码、网关、DNS等地址信息,在家里或者在办公室很多时候打开电脑后发现就可以上网,并没有手动设置IP、掩码、DNS地址也能上网,这是什么原因呢?其实这个原因很简单,说明你的内网有"DHCP"服务器,通过它给你的终端自动分配了IP掩码和网关等地址,省去了你手动配置过程,从而给网管人员和办公人员都带来了方便,简
Stella981 Stella981
4年前
Linux下DNS简单部署(主从域名服务器)
一、DNS简介DNS(DomainNameSystem),域名系统,因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。DNS服务器的作用就是
Wesley13 Wesley13
4年前
CDN与智能DNS原理和应用
1.cdn概念,DNS概念CDN:CententDeliveryNetwork(内容分发网络)使用户可以就近取得所需内容,提高用户访问网站相应速度CDN更智能的镜像缓存流量导流;DNS:DomainNameSystem域名系统域名和ip地址相互映射的一个分布式数据库,不用去记住被机器读取的ip地址CDN是内容分发网络,
Wesley13 Wesley13
4年前
DNS解析过程
DNS解析过程是重点也是难点,下面我按自己的理解一步步来解释,可能有错误之处,欢迎指正。以下步骤中,将DNS缓存中存在域名对应IP则DNS解析成功,用户计算机将直接访问服务器,若DNS服务器缓存中不存在域名对应IP,则自动进入下一步。1.浏览器缓存 当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址
Wesley13 Wesley13
4年前
35岁,真的是程序员的一道坎吗?
“程序员35岁是道坎”,“程序员35岁被裁”……这些话咱们可能都听腻了,但每当触及还是会感到丝丝焦虑,毕竟每个人都会到35岁。而国内互联网环境确实对35岁以上的程序员不太友好:薪资要得高,却不如年轻人加班猛;虽说经验丰富,但大部分公司并不需要太资深的程序员。但35岁危机并不是不可避免的,比如你可以不断精进技术,将来做技术管理或者