找回密码
 立即注册
搜索

[开发] DNS解析的过程是什么,求详细的?

[复制链接]
智慧谋略 发表于 2023-11-21 17:04:06 | 显示全部楼层 |阅读模式
DNS原理及其解析过程
为什么需要DNS解析域名为IP地址?
    网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。
具体什么是DNS?
    DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示。
e5143bc08d4ec9d7f210522c7e540f4d_720w.jpg

DNS 的过程?
关于DNS的获取流程:
DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。
具体过程如下:
①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如

http://www.baidu.com/
, 并将这个主机名传送给DNS应用的客户端
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址
⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接

DNS服务的体系架构是怎样的?

DNS domain name system 主要作用就是将主机域名转换为ip地址

假设运行在用户主机上的某些应用程序(如Webl浏览器或者邮件阅读器)需要将主机名转换为IP地址。这些应用程序将调用DNS的客户机端,并指明需要被转换的主机名。(在很多基于UNIX的机器上,应用程序为了执行这种转换需要调用函数gethostbyname())。用户主机的DNS客户端接收到后,向网络中发送一个DNS查询报文。所有DNS请求和回答报文使用的UDP数据报经过端口53发送(至于为什么使用UDP,请参看为什么域名根服务器只能有13台呢? - 郭无心的回答)经过若干ms到若干s的延时后,用户主机上的DNS客户端接收到一个提供所希望映射的DNS回答报文。这个查询结果则被传递到调用DNS的应用程序。因此,从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。但事实上,实现这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器以及定义了DNS服务器与查询主机通信方式的应用层协议组成。

DNS为什么不采用单点的集中式的设计方式,而是使用分布式集群的工作方式?
DNS的一种简单的设计模式就是在因特网上只使用一个DNS服务器,该服务器包含所有的映射,在这种集中式的设计中,客户机直接将所有查询请求发往单一的DNS服务器,同时该DNS服务器直接对所有查询客户机做出响应,尽管这种设计方式非常诱人,但他不适用当前的互联网,因为当今的因特网有着数量巨大并且在持续增长的主机,这种集中式设计会有单点故障(嗝屁一个,全球着急),通信容量(上亿台主机发送的查询DNS报文请求,包括但不限于所有的HTTP请求,电子邮件报文服务器,TCP长连接服务),远距离的时间延迟(澳大利亚到纽约的举例),维护开销大(因为所有的主机名-ip映射都要在一个服务站点更新)等问题
DNS服务器一般分三种,根DNS服务器,顶级DNS服务器,权威DNS服务器。

607e9d15fd6d5f9d02f6f4b0adb261b9_r.jpg


使用分布式的层次数据库模式以及缓存方法来解决单点集中式的问题。

DNS域名称
    域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。域名包含单个标签分隔点,例如:
im.qq.com
完全限定的域名 (FQDN) 唯一地标识在 DNS 分层树中的主机的位置,通过指定的路径中点分隔从根引用的主机的名称列表。 下图显示与主机称为 im 内
qq.com
DNS 树的示例。 主机的 FQDN 是
im.qq.com
DNS 域的名称层次结构
0c7565c6c0543b554ee02e163a820b25_720w.jpg


DNS域名称空间的组织方式
    按其功能命名空间中用来描述 DNS 域名称的五个类别的介绍详见下表中,以及与每个名称类型的示例。
例如:
www.uestc.edu.cn

79b9fd2666e989ab24024966632ae63f_r.jpg

DNS 和 Internet 域
    互联网域名系统由名称注册机构负责维护分配由组织和国家/地区的顶级域在 Internet 上进行管理。 这些域名按照国际标准 3166。 一些很多现有缩写,保留以供组织中,以及两个字母和三个字母的国家/地区使用的缩写使用下表所示。一些常见的DNS域名称如下图:
bd29822632ad712b1944bb41d7d3e0ba_720w.jpg


资源记录
    DNS 数据库中包含的资源记录 (RR)。 每个 RR 标识数据库中的特定资源。我们在建立DNS服务器时,经常会用到SOA,NS,A之类的记录,在维护DNS服务器时,会用到MX,CNAME记录。
常见的RR见下图:
0810966e5761d5dccb3d9b9906e10ca0_r.jpg


Dns服务的工作过程
当 DNS 客户机需要查询程序中使用的名称时,它会查询本地DNS 服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。
● 指定的 DNS 域名,表示为完全合格的域名 (FQDN) 。
● 指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。
● DNS域名的指定类别。
    对于DNS 服务器,它始终应指定为 Internet 类别。例如,指定的名称可以是计算机的完全合格的域名,如
im.qq.com
,并且指定的查询类型用于通过该名称搜索地址资源记录。
    DNS 查询以各种不同的方式进行解析。客户机有时也可通过使用从以前查询获得的缓存信息就地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询,也可代表请求客户机来查询或联系其他 DNS 服务器,以完全解析该名称,并随后将应答返回至客户机。这个过程称为递归。
    另外,客户机自己也可尝试联系其他的 DNS 服务器来解析名称。如果客户机这么做,它会使用基于服务器应答的独立和附加的查询,该过程称作迭代,即DNS服务器之间的交互查询就是迭代查询。
DNS 查询的过程如下图所示。
7fcd81756bdc8b52ade0531402c43e43_r.jpg


1、在浏览器中输入www  . qq  .com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www  . qq  .com主机。
6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

    从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。
附录:
本地DNS配置转发与未配置转发数据包分析
    新建一DNS,具体怎么建我这里就不再描述了,见我的上一篇博文《在Win2003中安装bind【部署智能DNS】》
1、DNS服务器不设转发
    在192.168.145.228服务器上安装上wireshark软件,并打开它,设置数据包为UDP过滤,在192.168.145.12客户机上用nslookup命令查询一下http://www.sohu.com/,马上可以看到本地DNS服务器直接查全球13台根域中的某几台,然后一步步解析,通过递代的方式,直到找到www  .sohu .com对应的IP为220.181.118.87。
    本地DNS服务器得到搜狐的IP后,它把这个IP返回给192.168.145.12客户机,完成解析。
738184d6ef3f834ba96776e37d2b2378_r.jpg


2、DNS服务器设置转发
    因搜狐域名在第一步的验证中使用过,有缓存,为了不受上步实验干扰,我们在客户机上192.168.145.12上nslookup 百度一下,你就知道。从图上看,本地DNS把请求转发至192.168.133.10服务器,133.10服务器把得到的IP返回给本地DNS,然后本地DNS再把IP告诉DNS客户机,完成解析。
ae0f47ad8dbad0443b1490ddcff232f2_r.jpg




 楼主| 智慧谋略 发表于 2023-11-21 17:08:20 | 显示全部楼层
我们平时在访问网站时,不使用 IP 地址,而是网站域名。但是抓包发现:交互报文是以 IP 地址进行的。那么 IP 地址是从哪来的呢?这是因为 DNS 把网站域名自动转换为 IP 地址

v2-aa2e0444db943d2d9a2e1f1c15591550_r.jpg

DNS 出现
TCP/IP 是基于 IP 地址进行通信的,但是 IP 地址不太好记。于是出现了另一种方便记忆的标识符,那就是主机名。为计算机配置主机名,在进行网络通信时,直接使用主机名,而不用输入一大串的 IP 地址。同时,系统通过一个叫 hosts 的文件,实现主机名转换 IP 地址的功能。hosts 文件包括主机名和 IP 地址的对应关系。当需要通过主机名访问主机时,它就会查看本地的 hosts 文件,从文件中找到相对应的 IP 地址,然后进行报文发送。如果在 hosts 文件中没找到相关信息,则主机访问失败。
hosts 文件是主机的本地文件,优点是查找响应速度快。它主要用来存储一些本地网络的主机名和 IP 地址的对应信息。这样,主机在以主机名访问本地网络主机时,通过 hosts 文件可以迅速获得相应的 IP 地址。

v2-0fceb89b433ed64fce3353f24218af5d_720w.jpg

每台主机的 hosts 文件都需要单独手工更新。随着网络规模的不断扩大、接入计算机的数量不断增加,维护难度越来越大,每台主机同步更新,几乎是一件不可能完成的任务。

v2-06b4423a486fdc71ca944a19d0a40ed4_r.jpg

为了解决 hosts 文件维护困难的问题,出现了 DNS 域名系统,一个可以解决主机名和 IP 地址互相转换的系统。无论网络规模变得多么庞大,都能在一个小范围内通过 DNS 进行管理。

v2-25fb3ef8db911808a9cfe938a5cd215c_r.jpg

DNS 介绍
DNS ,全称 Domain Name System 。采用 client/server 模式,DNS client 发出查询请求,DNS server 响应请求。DNS client 通过查询 DNS server 获得主机的 IP 地址,进而完成后续的 TCP/IP 通信过程。

v2-6d5388cb35c3197fd82ab8857ee4b9dc_r.jpg

当 Windows 系统用户使用 nslookup hostname/domainname 命令时,DNS 会自动查找注册了主机名和 IP 地址的数据库,并返回对应的 IP 地址。

v2-9afdf10463b97f4097a444bc61d66f3d_r.jpg

DNS 域名
先了解什么是域名,才能理解 DNS 。域名是为了识别主机名或机构的一种分层的名称。因为单独的一台域名服务器是不可能知道所有域名信息,所以域名系统是一个分布式数据库系统,域名(主机名)到 IP 地址的解析可以由若干个域名服务器共同完成。每一个站点维护自己的信息数据库,并运行一个服务器程序供互联网上的客户端查询。DNS 提供了客户端与服务器的通信协议,也提供了服务器之间交换信息的协议。由于是分布式系统,即使单个服务器出现故障,也不会导致整个系统失效,消除了单点故障。
DNS 域名组成
DNS 域的本质是一种管理范围的划分,最大的域是根域,向下可以划分为顶级域二级域三级域四级域等。相对应的域名是根域名顶级域名二级域名三级域名等。不同等级的域名使用点号分隔,级别最低的域名写在最左边,而级别最高的域名写在最右边。

v2-d5aab5cbd37ede88a27a28d165abe1fc_r.jpg

举个栗子:网站域名 http://www.tsinghua.edu.cn 中,从右到左开始,cn 是顶级域名,代表中国,edu是二级域名,代表教育机构,tsinghua 是三级域名,表示清华大学,www 则表示三级域名中的主机,并提供了 web 服务。

v2-0d8ed8870fa1fc4e5f0275e08b510444_720w.jpg

除了 www 主机外,常见的主机还有 arch 、sem 、mail ,域名如下:

v2-263303ea167e4bbd10c1e6002360ce1e_r.jpg

每一级的域名都由英文字母数字组成,域名不区分大小写,长度不能超过 63 字节,一个完整的域名不能超过 255 个字节。根域名用 “ . ”(点)表示。目前我们看到的域名例子都是完全合格域名( FQDN ),FQDN 的完整格式是以点结尾的域名。接入互联网的主机、服务器或其它网络设备都可以拥有一个唯一的 FQDN 。与 FQDN 对应的,系统中的默认域名是非合格域名,会把当前的区域域名添加到尾部。例如,tsinghua 域内的主机上查找 mail ,本地解析器就会将这个名称转换为 FQDN ,即 http://mail.tsinghua.edu.cn ,然后解析出 IP 地址。

v2-0834ae182b6c2efb9b8c56ed8d99d2f0_720w.jpg

DNS 域名空间
域名空间结构像是一棵倒过来的树,也叫做树形结构根域名就是树根( root ),用点号表示,往下是这棵树的各层枝叶。根域名的下一层叫顶级域名,顶级域名包括三大类:

v2-bd8a97718bb666741bbb88320bd92a46_r.jpg

  • 国家顶级域名
国家顶级域名采用 ISO3166 的规定。比如:.cn 表示中国,.us 表示美国,.uk表示英国等。现在使用的国家顶级域名大约在 200个左右。

v2-cdcd425c7ad7d9309dcd8720febf2672_r.jpg

  • 国际顶级域名
国际顶级域名采用 .int 。国际性的组织可以在 .int 下注册。
  • 通用顶级域名

v2-35dfc89d03097871e6fdbaa1b5984395_r.jpg

最早的顶级域名共有 6 个。分别为:
.com 表示公司企业,
.net 表示网络服务机构,
.org 表示非盈利组织,
.edu 表示教育机构(仅限美国),
.gov 表示政府部门(仅限美国),
.mil 表示军事部门(仅限美国)。
随着互联网用户不断增加,又增加了 7 个通用顶级域名。分别为:
.aero 用于航空运输业,
.biz 用于公司和企业,
.coop 用于合作团体,
.info 用于各种情况,
.museum 用于博物馆,
.name 用于个人,
.pro 用于自由职业者。
顶级域名下面是二级域名。国家顶级域名下注册的二级域名均由国家自行确定。我国二级域名分为类别域名行政域名两大类,类别域名如:.com ,.edu ,.gov 等分别代表不同的机构;行政域名如:.bj 表示北京,.sh 表示上海,代表我国各省、自治区及直辖市等。

v2-c7c205dfcdd2f083200f435571eca9b4_r.jpg

二级域名下面是三级域名四级域名等。命名树上任何一个节点的域名就是从这个节点到最高层的域名串起来,中间以 “ . ” 分隔。

v2-414b5a9a8dcb9aca951b0f31e6e9d7fc_r.jpg

在域名结构中,节点在所属域中的主机名标识可以相同,但是域名必须不同。比如:清华大学和新浪公司下都有一台主机的标识是 mail ,但是两者的域名却是不同的,前者为 http://mail.tsinghua.edu.cn ,而后者为 http://mail.sina.com.cn

v2-36dfa6f6b2acb1e6b56dd42933faafaa_720w.jpg

DNS 域名解析
域名转换为对应的 IP 地址的过程叫做域名解析。在域名解析过程中,DNS client 的主机调用解析器( Resolver ),向 DNS server 发出请求,DNS server 完成域名解析。

v2-2205b505629b83cdf61d6168158283b8_r.jpg

域名解析是按照 DNS 分层结构的特点,自顶向下进行的。但是如果每一个域名解析都从根域名服务器开始,那么根域名服务器有可能无法承载海量的流量。在实际应用中,大多数域名解析都是在本地域名服务器完成。通过合理设置本地域名服务器,由本地域名服务器负责大部分的域名解析请求,提高域名解析效率。

v2-62e0623c10f367d1bb6e9ff35d74bcaf_r.jpg

DNS 解析器
从应用程序的角度看,访问 DNS 是通过一个叫解析器( Resolver )的应用程序来完成的。发送一个 TCP 或 UDP 数据包之前,解析器必须将域名(主机名)转换为 IP 地址。一个解析器至少要注册一个域名服务器的 IP 地址。通常,它至少包括本地域名服务器的 IP 地址。

v2-878e085a36ec4391fb36159efc82af4e_720w.jpg

DNS 域名服务器
DNS 域名空间的层次结构,允许不同的域名服务器管理域名空间的不同部分。域名服务器是指管理域名的主机及软件,它可以管理所在分层的域。其所管理的分层叫做区域( zone )。一个 zone 是 DNS 域名空间的一棵子树,它可以单独管理而不受其它 zone 影响。每层都设有一个域名服务器。

v2-11f529c107402eafb0e69ea46f522797_r.jpg

根所设置的 DNS 叫做根域名服务器,它对 DNS 的检索数据功能起着至关重要的作用。根域名服务器中注册了顶级域名服务器的 IP 地址。如果想要新增一个一级域名,或者修改已有的顶级域名,就要在根域名服务器中进行新增或变更。
类似的,顶级域名服务器中注册了二级域名服务器的 IP 地址。如果域名服务器下面没有其它分层,就可以自由地指定主机名称。如果想重新设置域名服务器的 IP 地址或修改域名,必须在上一层的域名服务器中进行修改。
域名和域名服务器都需要按照分层进行设置。如果域名服务器出现故障,那么针对这个域的 DNS 查询就无法正常工作。因此,为了提高可用性,至少设置两台域名服务器。一旦第一台域名服务器无法提供查询时,就会自动转到第二个甚至第三个域名服务器上进行。
DNS 域名服务器类型
  • 本地域名服务器
互联网接入服务运营商或者一个大的网络机构,像公司、大学等都有一台或多台可以自行管理的域名服务器,这类域名服务器称为本地域名服务器,也称为默认域名服务器。本地域名服务器离客户端较近。当一个 DNS客户端发出 DNS 查询时,首先送到本地域名服务器。如果本地域名服务器数据库中有对应的域名信息,会将查询的域名转换为 IP 地址返回客户端。如果没有,它会以 DNS 客户端的身份向根域名服务器进行查询。根域名服务器收到本地域名服务器的查询后,会返回相关域名服务器的 IP 地址,本地域名服务器再向相关域名服务器发送查询请求。

v2-2cb13b83963cea06396924eceba75001_r.jpg

  • 根域名服务器
通常根域名服务器用来管理顶级域,本身并不对域名进行解析,但它知道相关域名服务器的 IP 地址。IPv4 根域名服务器全球有 13 台,主机名分别为 A ~ M 。1 台为主根服务器在美国,其余 12 个均为辅根服务器,其中 9 个在美国,2 个在欧洲,位于英国和瑞典,1 台在亚洲,位于日本。所有的域名服务器都必须注册根域名服务器的 IP 地址,因为 DNS 根据 IP 地址进行检索时,需要按顺序从根域名服务器开始。

v2-a501212bed10a8ce4c5ab8c9aa4a9f4a_r.jpg

  • 授权域名服务器
互联网上的主机在域名服务器上进行注册,这个域名服务器就是主机的授权域名服务器。通常,主机的授权域名服务器就是本地域名服务器。实际上,主机会有两个授权域名服务器,防止单点故障。授权域名服务器上有注册主机域名与 IP 地址的映射信息,当查询注册主机域名时,它会返回相应主机的 IP 地址。如果主机域名和 IP 地址需要进行变更,只需要在授权域名服务器处理即可,不用再向其它域名服务器进行申请或报告。

v2-26dbb7c1e32589edfffa07aec48f6ce7_r.jpg

  • 主域名服务器
主域名服务器是完成一个或多个区域域名解析工作的主要域名服务器,通常也是一个或多个区域的授权域名服务器。主域名服务器有区域内主机地址信息的源数据文件,并且是区域传送中区域数据的唯一来源。
  • 辅助域名服务器
辅助域名服务器可以协助主域名服务器提供域名查询服务,在主机很多的情况下,可以有效分担主域名服务器的压力。辅助域名服务器也有冗余功能,当主域名服务器故障时,辅助域名服务器能够在数据有效期内继续为主机提供域名解析服务。

v2-fabae66d96a9936bbef7541a6a2d4522_r.jpg

一台主域名服务器可以有多台辅助域名服务器,一台辅助域名服务器也可以是其它区域的主域名服务器。辅助域名服务器中包含区域内主机地址数据的授权信息,通过区域配置文件副本的方式存储。辅助域名服务器也是区域的授权域名服务器,可以完成本区域内域名查询的授权回答。
辅助域名服务器并不建立数据文件,它获得区域数据的唯一途径就是通过区域传送的方式,从主域名服务器上获得区域数据的最新副本。获得数据副本的方式有两种,第一种是辅助域名服务器定期主动获得主域名服务器的副本,或更新副本中的数据。第二种是主域名服务器在区域数据发生变化时,及时通知辅助域名服务器更新副本中的数据。
DNS 域名完整解析过程
v2-2e3c4a5086b77c9dc2fa88c55e12e689_r.jpg

DNS 客户端进行域名 http://www.tsinghua.edu.cn 的解析过程如下:
DNS 传输层协议
DNS 域名服务器使用的端口号是 53 ,并且同时支持 UDP 和 TCP 协议。为什么同时使用两种协议呢?
因为 DNS 响应报文中有一个删减标志位,用 TC 表示。当响应报文使用 UDP 封装,且报文长度大于 512 字节时,那么服务器只返回前 512 字节,同时 TC 标志位置位,表示报文进行了删减。当客户端收到 TC 置位的响应报文后,将采用 TCP 封装查询请求。DNS 服务器返回的响应报文长度大于 512 字节。

v2-e0be3a55d1cb9ed305265f9517d234c6_r.jpg

UDP 报文最大长度是 512 字节,最多可以包含 13 台根域名服务器数据,因此 ipv4 根域名服务器只能限制在 13 个,且每个服务器使用单个字母命名,也是 IPv4 根服务器是从 A ~ M 命名的原因。

v2-2b83b2eff96df4b82b1e1f916af14ea8_r.jpg

当辅助域名服务器启动时,将从主域名服务器执行区域传送。正常运行过程中,辅助域名服务器也会定时向主域名服务器进行查询,以便了解主域名服务器数据是否发送变化。如果有变化,将执行一次区域传送。因为区域传送的数据多,所以传送的数据采用 TCP 封装

v2-28c6e4baaa922e3a5dd8288e6b43c1ac_r.jpg

因此,UDP 用于 client 和 server 的查询和响应TCP 用于主从 server 之间的传送
DNS 查询方式
DNS 域名解析包括两种查询( query )方式,一种是递归查询,另一种是迭代查询
递归查询
DNS 服务器如果不能直接响应解析请求,它将继续请求其它的 DNS 服务器,直到查询域名解析的结果。查询的结果可以是域名主机的 IP 地址,或者是域名无法解析。无论哪种结果,DNS 服务器都会将结果返回给客户端。
举个栗子:当本地域名服务器接收了客户端的查询请求,本地域名服务器将代表客户端来找答案,而在本地域名服务器执行工作时,客户端只是等待,直到本地域名服务器将最终查询结果返回客户端。

v2-6747ad1eb06c929874bf2b447935c508_r.jpg

迭代查询
如果 DNS 服务器查不到相应记录,会向客户端返回一个可能知道结果的域名服务器 IP 地址,由客户端继续向新的服务器发送查询请求。对域名服务器的迭代查询只得到一个提示,则继续查询。
举个栗子:本地域名服务器发送请求到根域名服务器,根域名服务器并没有相应记录,它只是给本地域名服务器返回一个提示,引导本地域名服务器到另一台域名服务器进行查询。

v2-af3f4e4a4aa43ba34ee9589157f24c37_720w.jpg

客户端在查询 IP 地址时,向本地域名服务器进行递归查询。如果本地域名服务器的数据库有相应数据,则直接返回相应数据。如果没有,则本地域名服务器向根域名服务器进行迭代查询。从根开始对这棵树按照顺序进行遍历,直到找到指定的域名服务器,并由这个域名服务器返回相应的数据。客户端和本地域名服务器会将收到的信息保存在缓存里,这样可以减少每次查询时的性能消耗。
DNS 反向查询
在 DNS 查询中,客户端希望知道域名对应的 IP 地址,这种查询称为正向查询。大部分的 DNS 查询都是正向查询。与正向查询对应的,是反向查询它允许 DNS 客户端通过 IP 地址查找对应的域名。

v2-418fba8eb3869e4baf61f4566e750c22_r.jpg

为实现反向查询,在 DNS 标准中定义了特色域 in-addr.arpa 域,并保留在域名空间中,以便执行反向查询。为创建反向域名空间,in-addr.arpa 域中的子域是按照 IP 地址相反的顺序构造的。
举个栗子:http://www.tsinghua.edu.cn 的 IP 地址是 166.111.4.100 ,那么在 in-addr.arpa 域中对应的节点就是 100.4.111.166 。

v2-5829aa6413cffb834e869c4410aafc1e_r.jpg

DNS 应用场景静态域名解析
域名解析分为动态域名解析静态域名解析。在解析域名时,首先采用静态域名解析,如果静态解析不成功,再采用动态域名解析。
静态域名解析是通过静态域名解析表进行的,手动建立域名和 IP 地址之间的对应关系表,该表的作用类似于 Windows 操作系统下的 hosts 文件,可以将一些常用的域名放入表中。当 DNS client 需要域名所对应的 IP 地址时,即到静态域名解析表中去查找指定的域名,从而获得所对应的 IP 地址,提高域名解析的效率。

v2-186874aa6ab642dcf4d15f8ac36a4de7_720w.jpg

动态域名解析
动态域名解析需要专用的域名服务器( DNS server )运行域名解析服务器程序,提供从域名到 IP 地址的映射关系,负责接收客户端( DNS client)提出的域名解析请求。

v2-6d5388cb35c3197fd82ab8857ee4b9dc_r.jpg

DNS 代理
在使用了 DNS 代理( DNS proxy )功能的组网中,DNS client 将 DNS 请求报文直接发送给 DNS proxy 。DNS proxy 会先查找本地域名解析表,如果未查询到对应的解析表项,会将 DNS 请求报文转发给 DNS Server ,并在收到 DNS server 的应答报文后将其返回给 DNS client ,从而实现域名解析。

v2-f78e1f2a21e737367c805ffa6cfd1d05_r.jpg

因此,当 DNS server 的地址发生变化时,只需改变 DNS proxy 上的配置,无需逐一改变局域网内每个 DNS client 的配置,从而简化了网络管理。


​赞同 185​​6 条评论​分享

​收藏​喜欢​





v2-98f2e73c0d32161569ee7beb5b58ad55_l.jpg
小林coding
v2-4812630bc27d642f7cafcd6cdeca3d7a.jpg
计算机网络话题下的优秀答主




​ 关注


发布于 2022-08-11 10:58
创建于: 2022-08-11 10:58:54   修改于: 2022-08-11 10:58:54

作者:小林coding
来源原创文章:键入网址到网页显示,期间发生了什么?
通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。
但在发送之前,还有一项工作需要完成,那就是查询服务器域名对应的 IP 地址,因为委托操作系统发送消息时,必须提供通信对象的 IP 地址。
比如我们打电话的时候,必须要知道对方的电话号码,但由于电话号码难以记忆,所以通常我们会将对方电话号 + 姓名保存在通讯录里。
所以,有一种服务器就专门保存了 Web 服务器域名与 IP 的对应关系,它就是 DNS 服务器。
域名的层级关系
DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限
在域名中,越靠右的位置表示其层级越高
毕竟域名是外国人发明,所以思维和中国人相反,比如说一个城市地点的时候,外国喜欢从小到大的方式顺序说起(如 XX 街道 XX 区 XX 市 XX 省),而中国则喜欢从大到小的顺序(如 XX 省 XX 市 XX 区 XX 街道)。
实际上域名最后还有一个点,比如 www.server.com.,这个最后的一个点代表根域名。
也就是,. 根域是在最顶层,它的下一层就是 .com 顶级域,再下面是 server.com。
所以域名的层级关系类似一个树状结构:
  • 根 DNS 服务器(.)
  • 顶级域 DNS 服务器(.com)
  • 权威 DNS 服务器(http://server.com

v2-f1322532ba352564d3024a63971f1868_r.jpg

根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。
这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。
因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。
域名解析的工作流程
  • 客户端首先会发出一个 DNS 请求,问 http://www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
  • 本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 http://www.server.com,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 http://www.server.com 的 IP 地址吗?” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  • 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“http://www.server.com 这个域名归 .com 区域管理”,我给你 .com 顶级域名服务器地址给你,你去问问它吧。”
  • 本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 http://www.server.com 的 IP 地址吗?”
  • 顶级域名服务器说:“我给你负责 http://www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。
  • 本地 DNS 于是转向问权威 DNS 服务器:“老三,http://www.server.com对应的IP是啥呀?” http://server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
  • 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
  • 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
至此,我们完成了 DNS 的解析过程。现在总结一下,整个过程我画成了一个图。

v2-d8d88e788cd08be6024a4ef987324b43_r.jpg

DNS 域名解析的过程蛮有意思的,整个过程就和我们日常生活中找人问路的过程类似,只指路不带路
那是不是每次解析域名都要经过那么多的步骤呢?
当然不是了,还有缓存这个东西的嘛。
浏览器会先看自身有没有对这个域名的缓存,如果有,就直接返回,如果没有,就去问操作系统,操作系统也会去看自己的缓存,如果有,就直接返回,如果没有,再去 hosts 文件看,也没有,才会去问「本地 DNS 服务器」。



 楼主| 智慧谋略 发表于 2023-11-21 17:13:55 | 显示全部楼层
要了解 DNS ,我不得不为你写一篇文章了,因为 DNS 涉及的内容,真的非常多。
v2-cb2c1f540f1f58320363fe00bcc2345d_r.jpg
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管我们有多种识别方式,但在特定的环境下,某种识别方法可能比另一种方法更为适合。因特网上的主机和人类一样,可以使用多种识别方式进行标识。互联网上主机的一种标识方法是使用它的 主机名(hostname) ,如 www.facebook.comwww.google.com 等。但是这是我们人类的记忆方式,路由器不会这么理解,路由器喜欢定长的、有层次结构的 IP地址。
如果你还不理解 IP 的话,可以翻阅一下我的这篇文章计算机网络层
IP 地址现在简单表述一下,就是一个由 4 字节组成,并有着严格的层次结构。例如 121.7.106.83 这样一个 IP 地址,其中的每个字节都可以用 . 进行分割,表示了 0 - 255 的十进制数字。
然而,路由器喜欢的是 IP 地址进行解析,我们人类却便于记忆的是网址,那么路由器如何把 IP 地址解析为我们熟悉的网址地址呢?这时候就需要 DNS 出现了。

v2-51a2b37f9e4cbecef8f68e6f8d879707_r.jpg

DNS 的全称是 Domain Name System,DNS ,它是一个由分层的 DNS 服务器(DNS server)实现的分布式数据库;它还是一个使得主机能够查询分布式数据库的应用层协议。DNS 服务器通常是运行 BIND(Berkeley Internet Name Domain) 软件的 UNIX 机器。DNS 协议运行在 UDP 之上,使用 53 端口。
DNS 基本概述
与 HTTP、FTP 和 SMTP 一样,DNS 协议也是应用层的协议,DNS 使用客户-服务器模式运行在通信的端系统之间,在通信的端系统之间通过下面的端到端运输协议来传送 DNS 报文。但是 DNS 不是一个直接和用户打交道的应用。DNS 是为因特网上的用户应用程序以及其他软件提供一种核心功能。
DNS 通常不是一门独立的协议,它通常为其他应用层协议所使用,这些协议包括 HTTP、SMTP 和 FTP,将用户提供的主机名解析为 IP 地址。
下面根据一个示例来描述一下这个 DNS 解析过程,这个和你输入网址后,浏览器做了什么操作有异曲同工之处
你在浏览器键入 www.someschool.edu/index.html 时会发生什么现象?为了使用户主机能够将一个 HTTP 请求报文发送到 Web 服务器 www.someschool.edu ,会经历如下操作
  • 同一台用户主机上运行着 DNS 应用的客户端
  • 浏览器从上述 URL 中抽取出主机名 www.someschool.edu ,并将这台主机名传给 DNS 应用的客户端
  • DNS 客户向 DNS 服务器发送一个包含主机名的请求。
  • DNS 客户最终会收到一份回答报文,其中包含该目标主机的 IP 地址
  • 一旦浏览器收到目标主机的 IP 地址后,它就能够向位于该 IP 地址 80 端口的 HTTP 服务器进程发起一个 TCP 连接。
除了提供 IP 地址到主机名的转换,DNS 还提供了下面几种重要的服务
  • 主机别名(host aliasing),有着复杂的主机名的主机能够拥有一个或多个其他别名,比如说一台名为 relay1.west-coast.enterprise.com 的主机,同时会拥有 enterprise.com 和 www.enterprise.com 的两个主机别名,在这种情况下,relay1.west-coast.enterprise.com 也称为 规范主机名,而主机别名要比规范主机名更加容易记忆。应用程序可以调用 DNS 来获得主机别名对应的规范主机名以及主机的 IP地址。
  • 邮件服务器别名(mail server aliasing),同样的,电子邮件的应用程序也可以调用 DNS 对提供的主机名进行解析。
  • 负载分配(load distribution),DNS 也用于冗余的服务器之间进行负载分配。繁忙的站点例如 cnn.com 被冗余分布在多台服务器上,每台服务器运行在不同的端系统之间,每个都有着不同的 IP 地址。由于这些冗余的 Web 服务器,一个 IP 地址集合因此与同一个规范主机名联系。DNS 数据库中存储着这些 IP 地址的集合。由于客户端每次都会发起 HTTP 请求,所以 DNS 就会在所有这些冗余的 Web 服务器之间循环分配了负载。
DNS 工作概述
假设运行在用户主机上的某些应用程序(如 Web 浏览器或邮件阅读器) 需要将主机名转换为 IP 地址。这些应用程序将调用 DNS 的客户端,并指明需要被转换的主机名。用户主机上的 DNS 收到后,会使用 UDP 通过 53 端口向网络上发送一个 DNS 查询报文,经过一段时间后,用户主机上的 DNS 会收到一个主机名对应的 DNS 回答报文。因此,从用户主机的角度来看,DNS 就像是一个黑盒子,其内部的操作你无法看到。但是实际上,实现 DNS 这个服务的黑盒子非常复杂,它由分布于全球的大量 DNS 服务器以及定义了 DNS 服务器与查询主机通信方式的应用层协议组成。
DNS 最早的设计是只有一台 DNS 服务器。这台服务器会包含所有的 DNS 映射。这是一种集中式的设计,这种设计并不适用于当今的互联网,因为互联网有着数量巨大并且持续增长的主机,这种集中式的设计会存在以下几个问题
  • 单点故障(a single point of failure),如果 DNS 服务器崩溃,那么整个网络随之瘫痪。
  • 通信容量(traaffic volume),单个 DNS 服务器不得不处理所有的 DNS 查询,这种查询级别可能是上百万上千万级
  • 远距离集中式数据库(distant centralized database),单个 DNS 服务器不可能 邻近 所有的用户,假设在美国的 DNS 服务器不可能临近让澳大利亚的查询使用,其中查询请求势必会经过低速和拥堵的链路,造成严重的时延。
  • 维护(maintenance),维护成本巨大,而且还需要频繁更新。
所以 DNS 不可能集中式设计,它完全没有可扩展能力,因此采用分布式设计,所以这种设计的特点如下
分布式、层次数据库
首先分布式设计首先解决的问题就是 DNS 服务器的扩展性问题,因此 DNS 使用了大量的 DNS 服务器,它们的组织模式一般是层次方式,并且分布在全世界范围内。没有一台 DNS 服务器能够拥有因特网上所有主机的映射。相反,这些映射分布在所有的 DNS 服务器上。
大致来说有三种 DNS 服务器:根 DNS 服务器、 顶级域(Top-Level Domain, TLD) DNS 服务器 和 权威 DNS 服务器 。这些服务器的层次模型如下图所示

v2-8d42abe5cb8aa4d6548bd1b10adc97d1_r.jpg

假设现在一个 DNS 客户端想要知道 www.amazon.com 的 IP 地址,那么上面的域名服务器是如何解析的呢?首先,客户端会先根服务器之一进行关联,它将返回顶级域名 com 的 TLD 服务器的 IP 地址。该客户则与这些 TLD 服务器之一联系,它将为 amazon.com 返回权威服务器的 IP 地址。最后,该客户与 amazom.com 权威服务器之一联系,它为 www.amazom.com 返回其 IP 地址。
DNS 层次结构
我们现在来讨论一下上面域名服务器的层次系统
  • 根 DNS 服务器 ,有 400 多个根域名服务器遍及全世界,这些根域名服务器由 13 个不同的组织管理。根域名服务器的清单和组织机构可以在 https://root-servers.org/ 中找到,根域名服务器提供 TLD 服务器的 IP 地址。
  • 顶级域 DNS 服务器,对于每个顶级域名比如 com、org、net、edu 和 gov 和所有的国家级域名 uk、fr、ca 和 jp 都有 TLD 服务器或服务器集群。所有的顶级域列表参见 https://tld-list.com/ 。TDL 服务器提供了权威 DNS 服务器的 IP 地址。
  • 权威 DNS 服务器,在因特网上具有公共可访问的主机,如 Web 服务器和邮件服务器,这些主机的组织机构必须提供可供访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。一个组织机构的权威 DNS 服务器收藏了这些 DNS 记录。
DNS 查询步骤
下面我们描述一下 DNS 的查询步骤,从 DNS 解析 IP 再到 DNS 返回的一系列流程。
注意:通常情况下 DNS 会将查找的信息缓存在浏览器或者计算机本地中,如果有相同的请求到来时,就不再会进行 DNS 查找,而会直接返回结果。
通常情况下,DNS 的查找会经历下面这些步骤
  • 用户在浏览器中输入网址 www.example.com 并点击回车后,查询会进入网络,并且由 DNS 解析器进行接收。
  • DNS 解析器会向根域名发起查询请求,要求返回顶级域名的地址。
  • 根 DNS 服务器会注意到请求地址的前缀并向 DNS 解析器返回 com 的顶级域名服务器(TLD) 的 IP 地址列表。
  • 然后,DNS 解析器会向 TLD 服务器发送查询报文
  • TLD 服务器接收请求后,会根据域名的地址把权威 DNS 服务器的 IP 地址返回给 DNS 解析器。
  • 最后,DNS 解析器将查询直接发送到权威 DNS 服务器
  • 权威 DNS 服务器将 IP 地址返回给 DNS 解析器
  • DNS 解析器将会使用 IP 地址响应 Web 浏览器
一旦 DNS 查找的步骤返回了 http://example.com 的 IP 地址,浏览器就可以请求网页了。
整个流程如下图所示

v2-966729800098446bdd9854a9c5763cfa_r.jpg

DNS 解析器
进行 DNS 查询的主机和软件叫做 DNS 解析器,用户所使用的工作站和个人电脑都属于解析器。一个解析器要至少注册一个以上域名服务器的 IP 地址。DNS 解析器是 DNS 查找的第一站,其负责与发出初始请求的客户端打交道。解析器启动查询序列,最终使 URL 转换为必要的 IP 地址。

v2-4ded206c5b860d4ac527d63869e8ac37_r.jpg

DNS 递归查询和 DNS 递归解析器不同,该查询是指向需要解析该查询的 DNS 解析器发出请求。DNS 递归解析器是一种计算机,其接受递归查询并通过发出必要的请求来处理响应。
DNS 查询类型
DNS 查找中会出现三种类型的查询。通过组合使用这些查询,优化的 DNS 解析过程可缩短传输距离。在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够直接使用非递归查询。
  • 递归查询:在递归查询中,DNS 客户端要求 DNS 服务器(一般为 DNS 递归解析器)将使用所请求的资源记录响应客户端,或者如果解析器无法找到该记录,则返回错误消息。
v2-a576067da37a4bc5812a3b7a54ae4a27_r.jpg
2. 迭代查询:在迭代查询中,如果所查询的 DNS 服务器与查询名称不匹配,则其将返回对较低级别域名空间具有权威性的 DNS 服务器的引用。然后,DNS 客户端将对引用地址进行查询。此过程继续使用查询链中的其他 DNS 服务器,直至发生错误或超时为止。
v2-166bbf11f88d2c0e0f78a3db60eae5cb_r.jpg
3. 非递归查询:当 DNS 解析器客户端查询 DNS 服务器以获取其有权访问的记录时通常会进行此查询,因为其对该记录具有权威性,或者该记录存在于其缓存内。DNS 服务器通常会缓存 DNS 记录,查询到来后能够直接返回缓存结果,以防止更多带宽消耗和上游服务器上的负载。
DNS 缓存
DNS 缓存(DNS caching) 有时也叫做 DNS 解析器缓存,它是由操作系统维护的临时数据库,它包含有最近的网站和其他 Internet 域的访问记录。也就是说, DNS 缓存只是计算机为了满足快速的响应速度而把已加载过的资源缓存起来,再次访问时可以直接快速引用的一项技术和手段。那么 DNS 的缓存是如何工作的呢?
DNS 缓存的工作流程
在浏览器向外部发出请求之前,计算机会拦截每个请求并在 DNS 缓存数据库中查找域名,该数据库包含有最近的域名列表,以及 DNS 首次发出请求时 DNS 为它们计算的地址。
DNS 缓存方式
DNS 数据可缓存到各种不同的位置上,每个位置均将存储 DNS 记录,它的生存时间由 TTL(DNS 字段) 来决定。
浏览器缓存
现如今的 Web 浏览器设计默认将 DNS 记录缓存一段时间。因为越靠近 Web 浏览器进行 DNS 缓存,为检查缓存并向 IP 地址发出请求的次数就越少。发出对 DNS 记录的请求时,浏览器缓存是针对所请求的记录而检查的第一个位置。
在 chrome 浏览器中,你可以使用 chrome://net-internals/#dns 查看 DNS 缓存的状态。这是基于 Windows 下查询的,我的 Mac 电脑输入上面 url 后无法查看 DNS ,只能 clear host cache,我也不知道为啥,可能是哪里设置的原因?

v2-8241ffbf7ba08056fa1f3c1c67a38ae6_r.jpg

操作系统内核缓存
在浏览器缓存查询后,会进行操作系统级 DNS 解析器的查询,操作系统级 DNS 解析器是 DNS 查询离开你的计算机前的第二站,也是本地查询的最后一个步骤。
DNS 报文
共同实现 DNS 分布式数据库的所有 DNS 服务器存储了资源记录(Resource Record, RR),RR 提供了主机名到 IP 地址的映射。每个 DNS 回答报文中会包含一条或多条资源记录。RR 记录用于回复客户端查询。
资源记录是一个包含了下列字段的 4 元组
(Name, Value, Type, TTL)RR 会有不同的类型,下面是不同类型的 RR 汇总表
v2-38df8c1ea83b5cdfc23a50ff7eec58a1_r.jpg
DNS 有两种报文,一种是查询报文,一种是响应报文,并且这两种报文有着相同的格式,下面是 DNS 的报文格式
v2-0ca939e45e5fde1ba632842adeb44e28_r.jpg

上图显示了 DNS 的报文格式,其中事务 ID、标志、问题数量、回答资源记录数、权威名称服务器计数、附加资源记录数这六个字段是 DNS 的报文段首部,报文段首部一共有 12 个字节。
报文段首部
报文段首部是 DNS 报文的基础结构部分,下面我们对报文段首部中的每个字节进行描述
  • 事务 ID: 事务 ID 占用 2 个字节。它是 DNS 的标识,又叫做 标识符,对于请求报文和响应报文来说,这个字段的值是一样的,通过标识符可以区分 DNS 应答报文是对哪个请求进行响应的。
  • 标志:标志字段占用 2 个字节。标志字段有很多,而且也比较重要,下面列出来了所有的标志字段。
v2-86b10b0952e6263cd5e093117ebe8335_r.jpg

每个字段的含义如下
  • QR(Response): 1 bit 的 QR 标识报文是查询报文还是响应报文,查询报文时 QR = 0,响应报文时 QR = 1。
  • OpCode: 4 bit 的 OpCode 表示操作码,其中,0 表示标准查询,1 表示反向查询,2 表示服务器状态请求。
  • AA(Authoritative): 1 bit 的 AA 代表授权应答,这个 AA 只在响应报文中有效,值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated): 截断标志位,值为 1 时,表示响应已超过 512 字节并且已经被截断,只返回前 512 个字节。
  • RD(Recursion Desired): 这个字段是期望递归字段,该字段在查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • RA(Recursion Available): 可用递归字段,这个字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • zero: 保留字段,在所有的请求和应答报文中,它的值必须为 0。
  • AD: 这个字段表示信息是否是已授权。
  • CD: 这个字段表示是否禁用安全检查。
  • rcode(Reply code):这个字段是返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
相信读者跟我一样,只看这些字段没什么意思,下面我们就通过抓包的方式,看一下具体的 DNS 报文。
v2-5eb8e6c6630478e9b4554888276de261_r.jpg

现在我们可以看一下具体的 DNS 报文,通过 query 可知这是一个请求报文,这个报文的标识符是 0xcd28,它的标志如下
  • QR = 0 实锤了这就是一个请求。
  • 然后是四个字节的 OpCode,它的值是 0,表示这是一个标准查询。
  • 因为这是一个查询请求,所以没有 AA 字段出现。
  • 然后是截断标志位 Truncated,表示没有被截断。
  • 紧随其后的 RD = 1,表示希望得到递归回答。
  • 请求报文中没有 RA 字段出现。
  • 然后是保留字段 zero。
  • 紧随其后的 0 表示未经身份验证的数据是不可接受的。
  • 没有 rcode 字段的值
然后我们看一下响应报文
v2-0d55d0461dc287bf8bcd5b11e0012b5a_r.jpg

可以看到,标志位也是 0xcd28,可以说明这就是上面查询请求的响应。
查询请求已经解释过的报文我们这里就不再说明了,现在只解释一下请求报文中没有的内容
  • 紧随在 OpCode 后面的 AA 字段已经出现了,它的值为 0 ,表示不是权威 DNS 服务器的响应
  • 最后是 rcode 字段的响应,值为 0 时,表示没有错误。
问题区域
问题区域通常指报文格式中查询问题的区域部分。这部分用来显示 DNS 查询请求的问题,包括查询类型和查询类
v2-971d596adea72cffd5489a4bf87632b0_r.jpg

这部分中每个字段的含义如下
  • 查询名:指定要查询的域名,有时候也是 IP 地址,用于反向查询。
  • 查询类型:DNS 查询请求的资源类型,通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
  • 查询类:地址类型,通常为互联网地址,值为 1 。
同样的,我们再使用 wireshark 查看一下问题区域
v2-5582e99c492ea2052bc92d4d02b310d9_r.jpg

可以看到,这是对 http://mobile-gtalk.l.google.com 发起的 DNS 查询请求,查询类型是 A,那么得到的响应类型应该也是 A
v2-7552f5f89d6371a129769c8a2d73a40a_r.jpg

如上图所示,响应类型是 A ,查询类的值通常是 1、254 和 255,分别表示互联网类、没有此类和所有类,这些是我们感兴趣的值,其他值通常不用于 TCP/IP 网络。
资源记录部分
资源记录部分是 DNS 报文的最后三个字段,包括回答问题区域、权威名称服务器记录、附加信息区域,这三个字段均采用一种称为资源记录的格式,如下图所示
v2-b6c79994fa0b8b810662a1e2902da2ff_r.jpg

资源记录部分的字段含义如下
  • 域名:DNS 请求的域名。
  • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
  • 类:地址类型、与问题中的查询类值一样的。
  • 生存时间:以秒为单位,表示资源记录的生命周期。
  • 资源数据长度:资源数据的长度。
  • 资源数据:表示按查询段要求返回的相关资源记录的数据。
资源记录部分只有在 DNS 响应包中才会出现。下面我们就来通过响应报文看一下具体的字段示例
v2-ff1444ccfe2eb5eea1e80924b4b50481_r.jpg

其中,域名的值是 http://mobile-gtalk.l.google.com ,类型是 A,类是 1,生存时间是 5 秒,数据长度是 4 字节,资源数据表示的地址是 63.233.189.188。
SOA 记录
如果是权威 DNS 服务器的响应的话,会显示记录存储有关区域的重要信息,这种信息就是 SOA 记录。所有 的DNS 区域都需要一个 SOA 记录才能符合 IETF 标准。 SOA 记录对于区域传输也很重要。
SOA 记录除具有 DNS 解析器响应的字段外,还具有一些额外的字段,如下
v2-bf367d4bf17a0f15d039f40bb6283a2b_r.jpg

具体字段含义
  • PNAME:即 Primary Name Server,这是区域的主要名称服务器的名称。
  • RNAME:即 Responsible authority's mailbox,RNAME 代表管理员的电子邮件地址,@ 用 . 来表示,也就是说 admin.example.com 等同于 admin@example.com
  • 序列号: 即 Serial Number ,区域序列号是该区域的唯一标识符。
  • 刷新间隔:即 Refresh Interval,在请求主服务器提供 SOA 记录以查看其是否已更新之前,辅助服务器应等待的时间(以秒为单位)。
  • 重试间隔:服务器应等待无响应的主要名称服务器再次请求更新的时间。
  • 过期限制:如果辅助服务器在这段时间内没有收到主服务器的响应,则应停止响应对该区域的查询。
上面提到了主要名称服务器和服务名称服务器,他们之间的关系如下
v2-b2b33aa5dcf48f39503ef4b40b8510fa_r.jpg

这块我们主要解释了 RR 类型为 A(IPv4) 和 SOA 的记录,除此之外还有很多类型,这篇文章就不再详细介绍了,读者朋友们可以阅读 《TCP/IP 卷一 协议》和 cloudflare 的官网 https://www.cloudflare.com/learning/dns/dns-records/ 查阅,值得一提的是,cloudflare 是一个学习网络协议非常好的网站。
DNS 安全
几乎所有的网络请求都会经过 DNS 查询,而且 DNS 和许多其他的 Internet 协议一样,系统设计时并未考虑到安全性,并且存在一些设计限制,这为 DNS 攻击创造了机会。
DNS 攻击主要有下面这几种方式
  • 第一种是 Dos 攻击,这种攻击的主要形式是使重要的 DNS 服务器比如 TLD 服务器或者根域名服务器过载,从而无法响应权威服务器的请求,使 DNS 查询不起作用。
  • 第二种攻击形式是 DNS 欺骗,通过改变 DNS 资源内容,比如伪装一个官方的 DNS 服务器,回复假的资源记录,从而导致主机在尝试与另一台机器连接时,连接至错误的 IP 地址。
  • 第三种攻击形式是 DNS 隧道,这种攻击使用其他网络协议通过 DNS 查询和响应建立隧道。攻击者可以使用 SSH、TCP 或者 HTTP 将恶意软件或者被盗信息传递到 DNS 查询中,这种方式使防火墙无法检测到,从而形成 DNS 攻击。
  • 第四种攻击形式是 DNS 劫持,在 DNS 劫持中,攻击者将查询重定向到其他域名服务器。这可以通过恶意软件或未经授权的 DNS 服务器修改来完成。尽管结果类似于 DNS 欺骗,但这是完全不同的攻击,因为它的目标是名称服务器上网站的 DNS 记录,而不是解析程序的缓存。
  • 第五章攻击形式是 DDoS 攻击,也叫做分布式拒绝服务带宽洪泛攻击,这种攻击形式相当于是 Dos 攻击的升级版
那么该如何防御 DNS 攻击呢?
防御 DNS 威胁的最广为人知的方法之一就是采用 DNSSEC 协议。

DNSSEC
DNSSEC 又叫做 DNS 安全扩展,DNSSEC 通过对数据进行数字签名来保护其有效性,从而防止受到攻击。它是由 IETF 提供的一系列 DNS 安全认证的机制。DNSSEC 不会对数据进行加密,它只会验证你所访问的站点地址是否有效。

DNS 防火墙
有一些攻击是针对服务器进行的,这就需要 DNS 防火墙的登场了,DNS 防火墙是一种可以为 DNS 服务器提供许多安全和性能服务的工具。DNS 防火墙位于用户的 DNS 解析器和他们尝试访问的网站或服务的权威名称服务器之间。防火墙提供 限速访问,以关闭试图淹没服务器的攻击者。如果服务器确实由于攻击或任何其他原因而导致停机,则 DNS 防火墙可以通过提供来自缓存的 DNS 响应来使操作员的站点或服务正常运行。
除了上述两种防御手段外,本身 DNS 区域的运营商就会采取进步一措施保护 DNS 服务器,比如配置 DNS 基础架构,来防止 DDoS 攻击。
更多关于 DNS 的攻击和防御就是网络安全的主题,这篇文章就不再详细介绍了。

总结
这篇文章我用较多的字数为你介绍了 DNS 的基本概述,DNS 的工作机制,DNS 的查询方式,DNS 的缓存机制,我们还通过 WireShark 抓包带你认识了一下 DNS 的报文,最后我为你介绍了 DNS 的攻击手段和防御方式。
这是一篇入门 DNS 较全的文章,花了我一周多的时间来写这篇文章,这篇文章了解清楚后,基本上 DNS 的大部分问题你应该都能够回答,面试我估计也稳了。
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|探索掌握未知、共创美好未来

GMT+8, 2026-9-17 02:30 , Processed in 0.075975 second(s), 44 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表