上节中提到了一些有关递归查询的内容,但说的很少,也很笼统,本节将会从原理和实例两方面入手分析DNS的递归以及迭代查询。

在此之前,我们需要了解一些背景知识,以便于更好的理解今天的主题内容。
在互联网中,一个域名的顺利解析离不开两类域名服务器,只有由这两类域名服务器可以提供“权威性”的域名解析。
第一类就是国际域名管理机构,也就InterNIC,主要负责国际域名的注册和解析,第二类就是国内域名注册管理机构,在中国就是CNNIC了,主要负责国内域名注册和解析,当然,尽管分为国际和国内,但两者一主一辅,相互同步信息,毕竟最终的目的是在全球任何一个有网络的地方都可以顺利访问任何一个有效合法的域名,其间的联系就可见一斑了。
有的朋友可能会有这个疑问,域名服务器不是有很多吗?为什么说只有2类呢?是的,ISP何其多?当我们输入某一网址(或域名),系统将这个域名发送至需要将其当前已配置的DNS服务器,以便转换为IP地址进行访问,通常会是当地的公共DNS服务器(内网环境可能直接提交到防火墙或路由器上做进一步转发处理)。公网DNS服务器收到此请求后,并非立刻处理,比如转发至上一级的DNS服务器(在第一节讲过DNS有着很严格的逻辑层次关系),而是首先会查看自己的DNS缓存,如果有这个域名对应的IP,则直接返回给用户,系统收到这个IP后交给浏览器做进一步处理。在这个轮回的过程中,客户端所得到的DNS的回复就是“非权威的性”的,也就是说这个结果并不是来自这个域名所直接授权的DNS服务器,而是该记录的副本。简单的说,“非权威性”的应答是从别的DNS服务器上复制过来的,与之对应的,就是“权威性”应答则是由域名所在的服务器作出的应答,听起来似乎不易理解,我们来看一个例子。
我所在地是深圳,这里的公共DNS服务器是202.96.134.133,我们来检测一下。
如下图:
这里用到了nslookup命令,用来查询当前本机解析域名所依赖的DNS服务器,从上图中文名可以得知当前默认的DNS解析服务器是ns.szptt.net.cn,对应的IP地址为202.96.134.133,也就是说在这台机子上运行的网络程序,如果需要用到DNS域名解析的,都会将请求到这个服务器上,寻求解析。
当然,如果你是在内网,或是其他类型的局域网,在解析时候可能无法顺利得到上图的结果,多半是代理或防火墙的缘故。建议ADSL用户可以自测一下,加深印象。现在,我们来解析一个网站的别名记录,以此来了解一下何为“非授权记录”
以网易为例吧。如下图:
依照上图步骤就完成了一次CNAME记录的查询,通过这次小测试,希望大家注意一下几点:
1、查询的命令不仅这一种,我们还可以用命令nslookup -qt=cname www.163.com ,返回的结果是一样的。
2、查询的对象需要是一个完整的URL地址,而并非域名,如果想查询对象写出163.com,则默认值返回163.com这个域的ns记录。
如下图:

163.com的子域名还有很多,不同的子域名可能对应不用的NS服务器,这样做的目的是可以更快的相应客户请求,这就用到的服务器的均衡负载技术了。所以网易的NS服务器也肯定不只这一个。可以用命令来证实,如下图:
从上图可知,网易的NS服务器至少有2台。
以上所有的信息都是“非权威性”的回应,换句话说,这些记录都保存在深圳的这台DNS服务器上,刚才查询的所有结果均来源于此,自然都是副本信息。
那如何才能找到最原始的解析记录呢?要想揭开这个疑难,我们需要对DNS的查询原理有一定的认识。下面是是DNS查询的大致步骤:
1> 首先,客户端提出域名解析请求(无论以何种形式或方法),并将该请求发或转发给本地的DNS服务器。 
2> 接着,本地DNS服务器收到请求后就去查询自己的缓存,如果有该条记录,则会将查询的结果返回给客户端。(也就是我们看到的““非权威性”的应答”)。
  请注意,下面就开始递归查询了: 
  反之,如果DNS服务器本地没有搜索到相应的记录,则会把请求转发到根DNS(13台根DNS服务器的IP信息默认均存储在DNS服务器中,当需要时就会去有选择性的连接)。 
3> 然后,根DNS服务器收到请求后会判断这个域名是谁来授权管理,并会返回一个负责该域名子域的DNS服务器地址。比如,查询ent.163.com的IP,根DNS服务器就会在负责.com顶级域名的DNS服务器中选一个(并非随机,而是根据空间、地址、管辖区域等条件进行筛选),返回给本地DNS服务器。可以说根域对顶级域名有绝对管理权,自然也知道他们的全部信息,因为在DNS系统中,上一级对下一级有管理权限,毫无疑问,根DNS是最高一级了。
4> 本地DNS服务器收到这个地址后,就开始联系对方并将此请求发给他。负责.com域名的某台服务器收到此请求后,如果自己无法解析,就会返回一个管理.com的下一级的DNS服务器地址给本地DNS服务器,也就是负责管理163.com的DNS。
5> 当本地DNS服务器收到这个地址后,就会重复上面的动作,继续往下联系。
6> 不断重复这样的轮回过程,直到有一台DNS服务器可以顺利解析出这个地址为止。在这个过程中,客户端一直处理等待状态,他不需要做任何事,也做不了什么。
7> 直到本地DNS服务器获得IP时,才会把这个IP返回给客户端,到此在本地的DNS服务器取得IP地址后,递归查询就算完成了。本地DNS服务器同时会将这条记录写入自己的缓存,以备后用。
到此,整个解析过程完成。
客户端拿到这个地址后,就可以顺利往下进行了。但假设客户端请求的域名根本不存在,解析自然不成功,DNS服务器会返回此域名不可达,在客户端的体现就是网页无法浏览或网络程序无法连接等等。

下节中,我将以图解的方式将这个过程体现出来,便于大家形象化的理解递归查询的过程,谢谢。
敬请期待!

本文出自 “许一君的原创技术博客” 博客,请务必保留此出处http://jeffyyko.blog.51cto.com/28563/215293

转载于:https://blog.51cto.com/ljh9527/215523

一起学DNS系列(十)图、例详解DNS递归和迭代查询原理及过程 (1)相关推荐

  1. 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)

    大家好,我是老三,开工大吉,虎年第一篇,面渣逆袭系列继续! 这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 建议大家收藏了慢慢看,新的一年一定能够跳槽加薪,虎年& ...

  2. 详解DNS的常用记录(下):DNS系列之三

                            详解DNS常用记录(下) 在上篇博文中我们介绍了DNS服务器中几种不可或缺的记录,包括A记录,NS记录和SOA记录.本篇博文中我们将继续为大家介绍DNS ...

  3. 详解DNS正向解析实验(有图有实验)

    详解DNS正向解析实验(有图有实验) 一.DNS简介 1.DNS的定义 2.域名结构及解析方式 3.DNS服务器类型 二.构建DNS域名解析服务器步骤 1.安装bind软件包 2.配置正向解析 ①.先 ...

  4. 详解DNS的常用记录(上):DNS系列之二

    详解DNS的常用记录(上) 在上篇博文中,我们介绍了DNS服务器的体系结构,从中我们了解到如果我们希望注册一个域名,那么必须经过顶级域名服务器或其下级的域名服务器为我们申请的域名进行委派,把解析权委派 ...

  5. 入木三分学网络第一篇--VRRP协议详解-----(1)

    原帖:http://blog.chinaunix.net/uid-11654074-id-2857384.html 目录 入木三分学网络第一篇--VRRP协议详解 1. VRRP产生背景及应用环境 1 ...

  6. flutter listview 滚动到底部_Flutter系列之Flex布局详解

    PS:长期坚持是一件很难的事. Flutter 是 Google 推出的跨平台 UI 框架,可以快速地在 Android 和 IOS 上构建高质量的应用程序,其主要特点是 Flutter 具有快速开发 ...

  7. 大型网站架构系列:负载均衡详解(4)

    原文:大型网站架构系列:负载均衡详解(4) 本文是负载均衡详解的第四篇,主要介绍了LVS的三种请求转发模式和八种负载均衡算法,以及Haproxy的特点和负载均衡算法.具体参考文章,详见最后的链接. 三 ...

  8. echart关系树状图_echart——关系图graph详解

    VueEchart组件见上一篇 export default { data () { const title = { // show: true, //是否显示 text: "画布关系图&q ...

  9. STM32H750 更好用的CANFD 用例详解

    目录 前言 Message RAM分配 STM32工程搭建 串口配置 100us定时器 FDCAN配置 Bus-Off处理 新消息接收处理 发送处理 使用Xavier配合测试一下 完整工程下载 关于用 ...

最新文章

  1. controller的frame
  2. 三、Dockerfile的说明和编写
  3. 对于基础太模糊下一步需要清晰 几个目标
  4. python post请求参数错误,爬虫POST请求Json格式不清楚报错原因
  5. getElementById 和 getElementByName的区别
  6. 机器学习与流体动力学:谷歌AI利用「ML+TPU」实现流体模拟数量级加速
  7. 异步调用代码嵌套问题
  8. eps如何建立立体白模_从几个方面说说自动化立体仓库的特别之处
  9. git管理账户忘记了_强制找回GitLab管理员账户密码的方法
  10. [转载]如何限制一个类对象只在栈(堆)上分配空间?
  11. Android视频录制从不入门到入门系列教程(一)————简介
  12. c ++结构体构造函数_C ++中的构造函数
  13. Android Button常用属性
  14. im即时通讯源码+软件+app附详细封装视频搭建教程
  15. Python 用异常处理改写猜数游戏程序
  16. @PostConstruct @DependsOn
  17. xmind8 安装方法(old)
  18. 尚硅谷ssm整合实战项目笔记
  19. 通用权限管理系统设计篇
  20. 生动理解java接口

热门文章

  1. 计算机基础知识_2020年河北省高职单招计算机基础知识和实践技能培训
  2. 湖南长郡2021高考成绩查询时间,2021年湖南新高考六校、长郡十五校联考时间公布...
  3. mysql实现pr曲线_ROC 曲线与 PR 曲线
  4. jmeter csv参数化_运用Jmeter参数化来实现接口自动化测试
  5. html载入excel数据库,网页数据采集如何导出为Excel、CSV、Html、数据库、API格式_视频教程 - 八爪鱼采集器...
  6. 如何在 bash 中使用键值字典
  7. Python中scrapy下载保存图片
  8. Linux三剑客之grep详解
  9. 网络请求方式Fetch简介
  10. 关于学习Python的一点学习总结(52->模块就是程序)