转载请注明出处:http://blog.csdn.net/luotuo44/article/details/45545059

DNS(domain name system),读者们或多或少都听过,就是可以将域名转换给IP的一个系统。使得我们只需记住域名而非IP就能访问某个网站。当我们在浏览器里面输入一个网址时,浏览器会向本地DNS服务器发出查询请求,本地DNS服务器会把网址对应的IP返回给浏览器。注意:更确切来说,不是本地DNS服务器,而是Windows网络连接里面所配置的DNS服务器。一般我们不会配置的,所以本文默认使用本地DNS服务器。        除了用浏览器,我们也可以通过命令行的方式查询某个网址的IP。比如使用nslookup命令。下图是通过nslookup命令向阿里的公共DNS服务器223.5.5.5查询www.weibo.com的IP地址。可以看到最后的查询结果是121.194.0.221

从上面的叙述和命令使用,可以得知从域名到IP参与者有:DNS客户端(浏览器或者nslookup命令);DNS服务器(本地DNS服务器或者阿里的公共服务器)。其实,这里还隐藏了另外一个参与者:名字服务器(name server)。一共有三个参与者:DNS客户端( domain name systemclient)、DNS服务器(domain name system server)、名字服务器(name server)。

名字服务器有什么用呢?它和DNS服务器又有什么区别呢?要弄懂这个,首先要解决一个问题,阿里的公共DNS是如何知道微博IP的?它记住了,确实它是记住了(上图返回的是非权威应答,这说明是记住了)。但它不可能记住全球所有网站的IP吧。当用户向它查询一个它没有记住的网址时,它是怎么办的呢?我们不知道一个网址的IP,可以求助于DNS服务器,那么DNS服务器不知道呢?嘿嘿。

或许读者听说过DNS是分层的,不知道的话,就向上层查询。DNS确实是分层的,并且全球有13个根域名服务器(root name server)。阿里的公共DNS不懂一个网址的IP就要向根域名服务器询问(也可能不是向根域名服务器询问),不懂就要问嘛。但根域名服务器也不可能把全球的所有网址的IP都记录下来吧(对于IPv4或许有点可能,但对于IPv6就不可能了)。如果根域名服务器都不知道某个网址的IP,那可怎么办?其实,虽然根域名服务器不能告诉你某个网址的IP,但它会提供非常有用的信息给查询者(也就是阿里公共DNS服务器或者本地DNS服务器)。

在继续讲解查询之前,要先介绍域(domain)这个概念,因为网址是分域而治的。域名系统就像我们平常使用的文件目录那样,是分层的。首先是根,然后是顶级域(一级域)、接着是二级域、三级域、……。我们熟知的顶级域有:com、net、org、cn。父域将某个标识符(比如cn)分配给子域,然后子域cn将全权负责cn下面的二级域的具体分配。对于cn,熟知的二级域有com.cn、edu.cn这些。当然对于edu.cn又会负责旗下的三级域名分配(比如每个大学分配一个)。这样分层的一个好处就是方便管理。下图是一个DNS层次例子。

图来自《DNS 与 BIND》 图2-5

除了域(domain),还有另外一个重要的概念区域(zone)。假如A是一个域(domain),并且A有子域a和b。如果域(domain)A的管理者把a和b授权给另外的人管理,那么a和b就各自形成一个区域(zone)。也就是说,站在A的角度来看,a和b是区域(zone),但如果只看a或者b,那么又是一个域了。这类似于树里面的,树的一个孩子节点本身也是一颗树。下面用一张图说明这点:

图来自《DNS与BIND》

每一个区域(zone)都会有名字服务器(name server)[1],用来管理这个区域。管理包括对这个域进行再划分成更小的子域以及对子域名的IP解析(也就是将域名转换成IP)。对于某个区域,该区域的名字服务器(name server)就是该区域的权威,权威可以这样认为:该名字服务器给出的本区域的域名到IP转换结果是权威的(除了域名到IP的转换外,还有其他转换的)。

可以使用nslookup 命令查询一个区域(zone)或者主机的名字服务器(name server),如下图所示。其中,-qt=ns 指明要查询的类型是名字服务器(name server);223.5.5.5则是阿里的公共DNS服务器。

从上图可以看到,区域(zone) qq.com的名字服务器是ns[1-4].qq.com,而主机www.qq.com则是ns-tell.qq.com。

需要注意的是,区域(zone)和域(domain)都是一个范围而不是一台主机。比如qq.com它不是一台主机,而qq旗下的万维网服务器的主机名为www.qq.com,还有v.qq.com则是视频服务器的主机名。

有了上面的那些介绍,明确DNS中有什么物理实体,那么讲解DNS查询过程就容易多了。

使用阿里的223.5.5.5作为DNS服务器,查询www.qq.com的IP。假设在查询过程中,阿里的DNS服务器的缓存中并没有任何有关www.qq.com的记录。

  1. 我的PC机向223.5.5.5提出查询请求,查询www.qq.com对应的IP地址
  2. 223.5.5.5向根域名服务器提出查询请求,查询www.qq.com。根域名服务器的IP地址是固定的,每一个DNS服务器都会从配置文件中读取到
  3. 根域名服务器告诉223.5.5.5:“x.x.x.x是.com的名字服务器的IP地址,你去.com的名字服务器查询吧。哥只能帮你到这里了。”
  4. 223.5.5.5拿到这个回复并不生气,而是屁颠屁颠地向.com的名字服务器发出查询请求:“请告诉我www.qq.com的IP地址?”
  5. .com的名字服务器回复说,“给你qq.com区域的名字服务器 ns1.qq.com的IP地址y.y.y.y,你去那里查吧。”
  6. 吃完闭门羹,223.5.5.5再次出发向ns1.qq.com提出查询请求,“你总能告诉我www.qq.com的IP地址吧?这是你们旗下的域名啊”
  7. ns1.qq.com嘿嘿一声,说:“你去ns-tel1.qq.com查吧,它的IP是z.z.z.z”
  8. 223.5.5.5不抱希望地问ns-tel1.qq.com:“你能告诉我www.qq.com的IP吗”
  9. ns-tel1.qq.com说:“可以啊,它的IP是14.17.42.40”
  10. 223.5.5.5拿到结果后,在自己的缓存中存了一份备份,免得待会又有人问我的时候又要这样问来问去。最后223.5.5.5把结果告诉我的PC机

由于223.5.5.5会在自己的缓存中保留一份备份,这就有权威应答和非权威应答两种。如果223.5.5.5返回的结果是直接从自己的缓存中读取的,那么就是非权威应答。如果是从域名本身的权威名字服务器得到的结果,那么就是权威应答。

下图是《DNS与BIND》书中关于DNS查询过程的流程图:

图中的解析器相当于PC里面的浏览器或者nslookup程序。左边的名字服务器就相当于本地DNS服务器或者阿里的公共DNS服务器。

有一点要注意:阿里公共DNS服务器每次发出查询时,请求查询的内容都www.qq.com,而不是其中的某一部分。上图也展示了这一点。这是因为可能途中某个名字服务器的缓存中有www.qq.com,如果仅仅查询qq.com可能会错过[2]。

需要指出的是,DNS查询有两种:递归查询和迭代查询[3]。前面展示的是递归查询,查询工作由本地DNS服务器或者本文中的阿里公共DNS服务器完成绝大部分任务,查询的最初提出者只需等待结果即可。而在迭代查询中,如果本地DNS服务器或者公共DNS服务器的缓存中有查询的域名,那么返回之。如果没有,那么就像上图右边的那些名字服务器(name server)那样,告诉查询提出者“你去那里查吧”,当然也是可以直接返回一个错误信息的。

递归查询使得我们无法观察整个流程,此时可以使用dig命令,通过+trace强制使用迭代查询观看整个流程。下图展示了整个流程(@223.5.5.5表示使用阿里公共DNS服务器):

参考:

[1] http://en.wikipedia.org/wiki/Name_server#Authoritative_name_server

[2]《DNS与BIND》第5版 32页

[3] http://en.wikipedia.org/wiki/Domain_Name_System#DNS_resolvers

转载 DNS查询流程简介的更多相关文章

  1. HTTP请求流程(一)----流程简介

    最近一直在研究如何让asp.net实现上传大文件的功能,所以都没怎么写技术类的文章了.可惜的是至今还没研究出来,惭愧~~~.不过因为这样,也了解了一下http消息请求的大致过程.我就先简单介绍下,然后 ...

  2. [转】:HTTP请求流程(一)----流程简介

    http://www.cnblogs.com/stg609/archive/2008/07/06/1236966.html HTTP请求流程(一)----流程简介 最近一直在研究如何让asp.net实 ...

  3. DNS查询的工作原理

    二.DNS查询的工作原理 1.DNS查询过程按两部分进行     1.名称查询从客户端计算机开始, 并传送给本机的DNS客户服务程序进行解析     2.如果不能再本机解析查询, 可根据设定的查询DN ...

  4. Linux DNS 查询剖析(第四部分) | Linux 中国

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/82879414 在第四部分中,我将介绍容 ...

  5. FFmpeg编解码处理1-转码全流程简介

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584901.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...

  6. 用户访问网页流程、DNS 解析流程

    一.用户访问流程 二.DNS解析流程 DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于 TCP/IP 网络,它所提供的 ...

  7. 简单理解DNS解析流程(一)

    0x0 简单理解dns DNS服务器里存着一张表 表中放着域名和IP地址,域名和IP地址以映射关系保存,即一对一 浏览器访问某个域名,实际上是访问它的ip地址 所以浏览器需要知道域名对应的ip地址 如 ...

  8. Java DNS查询内部实现

    源码分析 在Java中,DNS相关的操作都是通过通过InetAddress提供的API实现的.比如查询域名对应的IP地址: String dottedQuadIpAddress = InetAddre ...

  9. gitlab工作流程简介

    gitlab工作流程简介 新建项目流程 创建/导入项目 可以选择导入github.bitbucket项目,也可以新建空白项目,还可以从SVN导入项目 建议选择private等级 初始化项目 1.本地克 ...

随机推荐

  1. http://jingyan.baidu.com/article/a378c960630e61b329283045.html

    http://jingyan.baidu.com/article/a378c960630e61b329283045.html

  2. 在自己的网站上实现QQ授权登录

    最近在实现QQ授权登录,现将我的实现过程以及我的理解整理如下.以下所述如有不对之处,请指正. 官方提供的SDK有:JS,PHP,Java.我的网站使用Scala+Play搭建的,所以只能用JS SDk ...

  3. Struts中的 saveToken的方法

    Struts中的 saveToken的方法     saveToken防止2次提交的问题 struts有自带的Token(令牌)的机制来解决重复提交(包括后退,刷新等).举例: 假设:假设有一个新增用 ...

  4. poi对wps excel的支持

    今天在使用poi解析xls文件的时候出现了如下异常 Exception in thread"main"java.lang.RuntimeException: Expected an ...

  5. 西南科技大学第十一届ACM程序设计大赛发言稿

    西南科技大学第十一届ACM程序设计大赛发言稿 各位老师.志愿者及参赛选手: 大家好,我是来自计科学院卓软1301的哈特13,很荣幸今天能站在这里代表参赛选手发言. 回想起来,我参加ACM比赛已经快两年 ...

  6. 逻辑回归损失函数(cost function)

    逻辑回归模型预估的是样本属于某个分类的概率,其损失函数(Cost Function)可以像线型回归那样,以均方差来表示:也可以用对数.概率等方法.损失函数本质上是衡量”模型预估值“到“实际值”的距离, ...

  7. Mysql主从复制的实现

    MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司.MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一 ...

  8. 剑指Offer:连续子数组的最大和

    题目: 输入一个整型数组, 数组里有正数也有负数. 数组中的一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值. 要求时间复杂度为O(n) #include <stdio.h> ...

  9. ubuntu常用快捷键

    1.直接退出窗口  Ctrl + q 2.窗口变大变小  Alt + Q 3.最小化窗口,显示桌面Ctrl + Alt + D 4.把当前窗口移到另一个工作区 Shift+ Ctrl + Alt +方 ...

  10. Asp.net MVC 4 异步方法

    今天我们来看一下,同样功能在 Asp.net MVC 4 下的实现,基于.net framework 4.5 下的async支持,让我们的代码更加简单,看下面片断代码名叫Index的Action方法: ...