DNS协议详解

优质资料:

https://www.ruanyifeng.com/blog/2016/06/dns.html   dig命令

https://www.cnblogs.com/yingsong/p/4429637.html  DNS与NS、NS记录

https://imlonghao.com/41.html DNSSEC

 

1、URL构成和域名体系

URL构成

URL:(Uniform Resource Locator)统一资源定位符。一条符合规范的URL对应的是服务器的一个特定的资源(如HTML页面,一张图片等)。

结构如下:

scheme://hostname[:port]/path/[;parameters][?query]#fragment

  scheme:通信协议,常用的有http、https、ftp、mailto等。
  hostname:主机域名或IP地址。
  port:端口号,可选。省略时使用协议的默认端口,如http默认端口为80。
  path:路径由零或多个"/"符号隔开的字符串组成,一般用来表示主机上的一个目录或文件地址。
  query:查询,可选。用于传递参数,可有多个参数,用"&"符号隔开,每个参数的名和值用"="符号隔开。
  fragment:信息片断字符串,也称为锚点。用于指定网络资源中的片断。

比如:

https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9230366566950910677%22%7D&n_type=0&p_from=1

其中mbd.baidu.com为主机域名。

域名体系

  域名(Domain Name)通常是用户所在的主机名。域名格式是由若干部分组成,每个部分又称子域名,它们之间用“.”分开,每个部分最少由两个字母或数字组成。城名通常按分层结构来构造,每个子域名都有其特定的含义。从右到左,子域名分别表示不同的国家或地区的名称(只有美国可以省略表示国家的顶级域名)、组织类型、组织名称、分组织名称和计算机名称等。

2、DNS服务器体系

域名服务器实际上就是装有域名系统的主机。由高向低进行层次划分,可分为以下几大类:

  • 根域名服务器:最高层次的域名服务器,也是最重要的域名服务器,本地域名服务器如果解析不了域名就会向根域名服务器求助。全球共有13个不同IP地址的根域名服务器,它们的名称用一个英文字母命名,从a一直到m。这些服务器由各种组织控制,并由 ICANN(互联网名称和数字地址分配公司)授权,每个根服务器都有镜像服务器,每个根服务器与它的镜像服务器共享同一个 IP 地址,中国大陆地区内只有6组根服务器镜像(F,I(3台),J,L)。当你对某个根服务器发出请求时,请求会被路由到该根服务器离你最近的镜像服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和地址,如果向根服务器发出对 “jocent.me” 的请求,则根服务器是不能在它的记录文件中找到与 “jocent.me” 匹配的记录。但是它会找到 “me” 的顶级域名记录,并把负责 “me” 地址的顶级域名服务器的地址发回给请求者。
    • 为什么根域名服务器只能有13个?

      通过UDP协议传输的DNS消息最大长度需要限制在512字节(不包括IP头部、UDP头部),超出部分要被截断。有了最大长度限制后,一个UDP协议传输的DNS响应能够返回的资源记录数量就是有限的。512字节的限制是在RFC 1035中规定的,为了更好的性能我们需要将响应限制在一个响应报文中完成,也就是只有512字节可以用了。当我们查询根域的NS记录时,512字节只够返回包含13个由A-M命名的根域名服务器的NS记录和A记录的响应。NS记录在回答区段中,A记录在额外信息区段中,A记录用于帮助你接下来向根域名服务器进一步查询。

  • 顶级域名服务器:负责管理在该顶级域名服务器下注册的二级域名。当根域名服务器告诉查询者顶级域名服务器地址时,查询者紧接着就会到顶级域名服务器进行查询。比如还是查询"jocent.me",根域名服务器已经告诉了查询者“me”顶级域名服务器的地址,“me”顶级域名服务器会找到 “jocent.me”的域名服务器的记录,域名服务器检查其区域文件,并发现它有与 “jocent.me” 相关联的区域文件。在此文件的内部,有该主机的记录。此记录说明此主机所在的 IP 地址,并向请求者返回最终答案。
  • 权限域名服务器:负责一个区的域名解析工作
  • 本地域名服务器:当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的。

3、域名解析过程

域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址。

其具体的流程可描述如下:

  1.现在我有一台计算机,通过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。

  2.现在的我计算机要向这台ISPDNS发起请求查询www.baidu.com这个域名了,(经网友提醒:这里其实准确来说不是ISPDNS,而应该是用户自己电脑网络设置里的DNS,并不一定是ISPDNS。比如也有可能你手工设置了8.8.8.8)

  3.ISPDNS拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话就直接返回。这个时候拿到的ip地址,会被标记为非权威服务器的应答

  4.如果缓存中没有的话,ISPDNS会从配置文件里面读取13个根域名服务器的地址(这些地址是不变的,直接在BIND的配置文件中),

  5.然后像其中一台发起请求。

  6.根服务器拿到这个请求后,知道他是com.这个顶级域名下的,所以就会返回com域中的NS记录,一般来说是13台主机名和IP。

  7.然后ISPDNS向其中一台再次发起请求,com域的服务器发现你这请求是baidu.com这个域的,我一查发现了这个域的NS,那我就返回给你,你再去查。

(目前百度有4台baidu.com的顶级域名服务器)。

  8.ISPDNS不厌其烦的再次向baidu.com这个域的权威服务器发起请求,baidu.com收到之后,查了下有www的这台主机,就把这个IP返回给你了,

  9.然后ISPDNS拿到了之后,将其返回给了客户端,并且把这个保存在高速缓存中。

 

其中有两个概念递归查询和迭代查询,其实在整个描述的过程中已经体现的很明显,这里再说明一下:

  • 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
  • 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询

 

DNS 的三种查询方式:

参考:https://juejin.im/post/6844903900982558734

  • 递归查询 (Recursive query)

递归查询是这么一种查询方式,一般发生在 Client 请求 DNS Server。Client 发出一个域名解析的请求,DNS Server 必须返回对应的 IP 地址,或者返回找不到的错误。

 

 

  • 迭代查询 (Iterative query)

迭代查询一般发生在 DNS Server 之间,当 Client 发出域名解析的请求后,DNS Server 需要给予最佳答案,这个最佳答案可能是"距离最近"的顶级域名服务器,也能是权威域名服务器。无论如何,Client 需要对返回结果再次发起请求,知道获得最终结果。

  • 非递归查询 (Non-recursive query)

非递归查询发生在 Client 和 DNS Server 之间,指的是,请求的 DNS Server 已经知道答案,直接返回。这里可能有两种情况,一种是 DNS Server 本机缓存了对应的 IP,或者是缓存了对应的域名的权威服务器。第二种情况只需要再发一次请求,即可拿到结果返回。

【TODO:DNS缓存机制】

 

4、DNS报文结构

参考:http://c.biancheng.net/view/6457.html

DNS报文分为查询请求报文和查询相应报文,两类报文结构基本相同,结构如下:

  

 报文每行为4个字节,其中前12个字节节(前三行)为基础部分,后四行为可变长度的区段,包括问题部分(即查询问题区域,存在于查询请求报文)和响应资源记录(后三行,存在于响应报文中)。

基础部分

 

 该部分中每个字段含义如下。

  • 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
  • 标志:DNS 报文中的标志字段。
    • QR(Query/Response Flag) 是 1 bit 字段:0 表示查询报文,1 表示响应报文。
    • opcode 是一个 4 bit 字段:通常值为 0(标准查询),其他值为 1(反向查询)和 2(服务器状态请求)。
    • AA 是 1 bit 标志,表示 “授权回答(Authoritative Answer)” 。该名字服务器是授权于该域的。
    • TC 是 1 bit字段,表示 “可截断的(Truncated)”。使用 UDP 时,它表示当应答的总长度超过 512 字节时,只返回前 512 个字节。
    • RD 是 1 bit字段 表示 “期望递归(Recursion Desired)”。 该比特能在一个查询中设置,并在响应中返回。 这个标志告诉名字服务器必须处理这个查询,也称为一个递归查询。 如果该位为 0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。 
    • RA 是 1 bit 字段,表示 “可用递归(Recursion Available)”。 如果名字服务器支持递归查询,则在响应中将该比特设置为 1。 在后面的例子中可看到大多数名字服务器都提供递归查询,除了某些根服务器。
    • 随后的 3 bit 字段必须为 0。
    • rcode(Response Code) 是一个 4 bit 的返回码字段。通常的值为 0(没有差错)和 3(名字差错)。 名字差错只能从一个授权名字服务器上返回,它表示在查询中指定的域名不存在。
  • 计数/记录数:随后的 4 个 16 bit 字段说明最后 4 个变长字段中包含的条目数。对于查询报文,问题(question)数通常是 1,而其他 3 项则均为 0。类似地,对于应答报文,回答数至少是 1,剩下的两项可以是 0 或非 0

问题部分

问题部分的格式如下,该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。

  • 查询名(QName)是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度, 每个名字以最后字节为 0 结束,长度为 0 的标识符是根标识符。 计数字节的值必须是 0 ~ 63 的数,因为标识符的最大长度仅为 63 (在本节的后面我们将看到计数字节的最高两比特为 1,即值 192 ~ 255,将用于压缩格式)。 不像我们已经看到的许多其他报文格式,该字段无需以整 32 bit 边界结束,即无需填充字节。图 14-6 显示了如何存储域名 gemini.tuc.noao.edu。

DNS-Domain-Name-Representation

  • 每个问题有一个查询类型(QType),而每个响应(也称一个资源记录,我们下面将谈到)也有一个类型。 大约有 20 个不同的类型值,其中的一些目前已经过时。 图 14-7 显示了其中的一些值。 查询类型是类型的一个超集( superset ):图中显示的类型值中只有两个能用于查询类型。最常用的查询类型是 A 类型,表示期望获得查询名的 IP 地址。域名服务器是能提供域名解析的服务器,上面的记录类型可以是A(address)记录,NS记录(name server),MX(mail),CNAME等。

DNS-Type-Value  

  • 查询类(QClass)通常是 1,指互联网地址(某些站点也支持其他非 IP 地址)。

 

响应资源记录

资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示。

资源记录格式中每个字段含义如下:

  • 域名:DNS 请求的域名。
  • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
  • 类:地址类型,与问题部分中的查询类值是一样的。
  • 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
  • 资源数据长度:资源数据的长度。
  • 资源数据:表示按查询段要求返回的相关资源记录的数据。

资源记录部分只有在 DNS 响应包中才会出现。

 

5、Wireshark抓包分析

请求报

响应报文

 

如果收到的域名是本地dns缓存中的数据,则授权部分和附加部分为空。

 

posted @ 2020-08-13 18:29  进击的小Y  阅读(4391)  评论(0编辑  收藏  举报