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

引##

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

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

一般的客户端(如浏览器)对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("networkaddress.cache.ttl", 10);
  • 更改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解析为例:

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/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 清缓存

ISP DNS缓存##

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

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


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

程序员DNS知识指南的更多相关文章

  1. 一个优秀windows C++程序员的知识体系[转]

    转自:一个优秀windows C++程序员的知识体系 思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图: 除了上面知识,程序员还要不断学习, 保持对新知识的 ...

  2. 一个优秀windows C++程序员的知识体系

    思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图: 除了上面知识,程序员还要不断学习, 保持对新知识的热情. 转自http://www.cppblog.co ...

  3. 转:一个优秀windows C++程序员的知识体系

    转自:http://www.cppblog.com/weiym/archive/2012/06/10/178287.html.根据自身的经历,觉得作者总结的很好. 思考一个优秀windows C++ ...

  4. 程序员代码面试指南 IT名企算法与数据结构题目最优解

    原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...

  5. 程序员装B指南

    一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...

  6. 程序员装X指南

      一.准备工作“工欲善其事必先利其器.” 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码 .总之要显得信息量很大,效率很高. 2.椅子不一 ...

  7. 程序员装B指南(转载)

    转自:http://www.oschina.net/question/615783_115390 一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的 ...

  8. 【超级经典】程序员装B指南(转)

    一.准备工作   "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率 ...

  9. Let’s do this!新手程序员的入门指南(转)

    计算机科学(Computer Science)无疑是现在最热门的学科之一,这领域的工作薪水高.工作时间弹性,而且科技业对工程师.开发者的需求至今有增无减,科技龙头们随时虎视眈眈着出色的程式开发者.创意 ...

随机推荐

  1. Unity3D安卓打包参数配置与兼容性的关系分析

    前言 在使用Unity3D工程导出安卓安装包的时候,往往会遇到兼容性的问题,针对某些机型,要么无法打开游戏,要么会出现卡机的现象.面对这种情况,我们可以调节相关的参数来提高兼容性. 为了了解在打包时候 ...

  2. 后台返回字符串类型function的处理 (递归算法)

    $(function(){ $.ajax({ type: "post", url: "${ctx}/modules/fos/reference/echart", ...

  3. 七个高效的文本编辑习惯(以Vim为例)

    七个高效的文本编辑习惯 如果你花很多时间输入纯文本.写程序或HTML,那么通过高效地使用一个好的编辑器,你可以节省大部分时间.本文将提供指导和提示,让你更迅速地做这些工作,并且少犯错误. 本文用开源文 ...

  4. MFC修改初始窗口大小和窗口名字禁止窗口最大,最小化

    2,在里面就可以修改初始窗口大小和窗口名字 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){if( !CFrameWnd::PreCrea ...

  5. access查询优化

    一个zirancun 14万数据量,一个 zirancuntd 19万数据,这两个  zirancuntd.distid 与zirancun.id进行关联,查询 zirancuntd.distid不存 ...

  6. <转>boost 1.53 and STLPort build binary for windows

      1.编译STLPort:    1.1 .开始菜单运行vs2008的命令行工具    1.2.进入E:\00.CODE.SDK\STLport-5.2.1\    1.2.运行configure ...

  7. jQqery EasyUI dategrid行中多列数据的可编辑操作

    最近的项目中需要在前台dategrid列表中直接修改某些列的数据,并且修改后的数据需要不通过后台而自动更新在列表中. 带着这一问题开始寻找实现的思路,首先想到的就是去jQqery EasyUI官网找例 ...

  8. javascript练习-定义子类

    function defineSubclass(superclass, //父类的构造函数 constructor, //新的子类的构造函数 methods, //实例方法:复制至原型中 static ...

  9. Windows 10 for phone 离我们不远了

    今天登录Windows Insider终于看到更多机型可以更新预览版了,看来Windows phone 10离我们不远了!

  10. Python成长笔记 - 基础篇 (十)

    本节内容 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queu ...