1 背景
DNS 是 Domain Name System 的缩写,即域名系统。
DNS最早于1983年由保罗·莫卡派乔斯(Paul Mockapetris)发明;原始的技术规范在882号因特网标准草案(RFC 882)中发布。1987年发布的第1034和1035号草案修正了DNS技术规范,并废除了之前的第882和883号草案。在此之后对因特网标准草案的修改基本上没有涉及到DNS技术规范部分的改动。
2 DNS基本内容
下面来了解几个相关的重要概念。
2.1 域名
域名(英语:Domain Name),又称网域,是由一串用点分隔的字符串组成的Internet上某一台计算机或计算机组的名称(如:www.baidu.com),用于在数据传输时对计算机的定位标识。
全球域名的最高管理机构是ICANN (Internet Corporation for Assigned Names and Numbers),即互联网名称与数字地址分配机构,总部在美国加利福尼亚。ICANN负责管理全世界域名系统的运作。
图1 ICANN董事会
域名采用分层的管理模式,可以分为:一级域名(或称顶级域名)、二级域名、三级域名、四级域名等等。如下图2是一个典型的域名分层结构。
www.baidu.com
整体是一个二级域名;
baidu.com
是一个一级域名;
.com
是顶级域(英文:Generic top-level domain)。
图2 典型的域名分层结构
顶级域由ICANN负责管理,常用的顶级域有如下:
- .com 供商业机构使用,但无限制
- .info 供资讯性网站使用,但无限制
- .net 原供网络服务供应商使用,现无限制
- .org 原供不属于其他通用顶级域类别的组织使用,现无限制
- .xyz 无限制
- .edu 供教育机构使用
- .gov 供美国政府及其属下机构使用
- .museum 供博物馆使用
- .post 供邮政服务使用
- .jobs 供求职相关网站使用
上面列举出来的是通用顶级域,还有一类国家顶级域,如下:
- .cn China,中国
- .ca Canada,加拿大
- .de Germany,德国
- .fr France,法国
- .jp Japan,日本
- .us United States,美国
一个完整域名是由字符串+顶级域后缀组成的。那如何区分一个域名是多少级域名呢?一个简单的方法是,数域名中有几个点,一个点一级,两个点二级。如下:
- baidu.com 一级域名
- tmall.com 一级域名
- www.baidu.com 二级域名
- tieba.baidu.com 二级域名
- baike.baidu.com 二级域名
- mp.weixin.qq.com 三级域名
2.2 域名服务器
在整个互联网世界中,域名的数量相当庞大。靠一台域名服务器无法完成这个互联网上所有主机的映射。在实际中,DNS使用了大量的域名服务器,所有这些服务器形成了一个有层次结构的分布式数据库。这也是分布式数据库在实际应用中的一个精彩范例。
下面通过一个具体的例子看一下这些域名服务器的协同工作过程。当我们在浏览器中输入
www.sina.com.cn
时,DNS程序就把DNS请求发送至根域名服务器,因为该域名的顶级域是
.cn
,因此该DNS请求会发到负责该顶级域
.cn
的顶级域名服务器。依次类推,该DNS请求依次经过权限域名服务器、本地域名服务器,直到解析出对应的IP地址为止。如下图3示意了上述过程。
图3 域名解析过程及域名服务器
2.2.1 根域名服务器
在DNS的体系结构中,根域名服务器是最高层级的域名服务器,所有的根域名服务器都知道所有的顶级域名服务器的IP地址。根域名服务器也是最重要的域名服务器,不管是哪个本地域名服务器,若要对互联网上任何一个域名进行解析,只要自己无法解析,就首先要求助于根域名服务器。
关于根域名服务器,最早是IPV4,全球只有13台(这13台IPv4根域名服务器名字分别为“A”至“M”),1个为主根服务器在美国,由美国互联网机构Network Solutions运作。其余12个均为辅根服务器,其中9个在美国,2个在欧洲(位于英国和瑞典),1个在亚洲(位于日本)。
至于IPv6,全球目前完成25台IPv6根服务器架设。中国部署了其中的4台,由1台主根服务器和3台辅根服务器组成,打破了中国过去没有根服务器的困境。
图4 IPv6根服务器全球分布情况
2.2.2 顶级域名服务器
顶级域名服务器负责管理在该顶级域名服务器注册的所有顶级域(如:.cn .com .gov等等)。收到DNS查询请求时,就给出相应的回答,可能是最后的结果,也可能是下一步应当查找的域名服务器的IP地址。
2.2.3 权限域名服务器
权限域名服务器负责管理一个 “区” 的域名服务器。“区” 是DNS服务器管辖的范围,一个 “区” 的大小可能等于一个域,也可能小于一个域。一个域名服务器可以管理多个子域,也可以把某个子域委派出去,委派出去的一个子域也是一个 “区” ,这样一个域就可以包括多个 “区” 。没有委派子域时, “区” 和域的大小是一样的。每一台主机的域名都必须在某个权限域名服务器进行解析,因此权限域名服务器记录了其管辖范围内的域名和IP地址的解析关系。此外,权限域名服务器还知道下一级域名服务器的地址。
2.2.4 本地域名服务器
当一个主机发出DNS查询请求时,会首先请求本地域名服务器,再由本地域名服务器进行递归查询。为了提高域名服务器的可靠性,DNS域名服务器会把数据复制并保存到多个域名服务器,其中一个是主域名服务器(mastername server),其他的是辅助域名服务器(secondary name server)。当主域名服务器发生故障时,辅助域名服务器可以保证DNS的查询工作不会中断。主域名服务器定期把数据复制到辅助域名服务器中,而数据更改只能在主域名服务器中进行,这样就保证了数据的一一致性。
2.3 域名解析
域名解析是指把域名映射成为IP地址或把IP地址映射成域名的过程。前者称为正向解析,后者称为反向解析。在域名解析过程中,有两种查询方式,分别为递归查询和迭代查询。
2.3.1 递归查询
在递归查询模式下,DNS服务器接收到主机请求,必须使用一个准确的查询结果回复给主机。如果DNS服务器本地没有存储查询DNS信息,则该服务器会询问其他服务器,并将返回的查询结果提交给主机。简言之,就是主机只查询一次,等DNS服务器的响应结果就行,剩下所有的事情都交给DNS服务器来处理。
2.3.2 迭代查询
在迭代查询模式下,DNS服务器会向主机提供其他能够解析查询请求的DNS服务器IP地址,当主机发送查询请求时,DNS服务器并不直接回复查询结果,而是告诉主机另一台DNS服务器IP地址,主机再向这台DNS服务器提交请求,依次循环直到返回查询的结果为止。
2.3.3 递归查询+迭代查询
在DNS实际运作模式中,一般采用递归查询+迭代查询相结合的模式。即是主机向本地DNS服务器的查询采用的是递归查询,而本地DNS服务器向根域名服务器的查询采用迭代查询,其过程如图5所示。
图5 递归查询与迭代查询
3 DNS协议报文格式
DNS分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS报文格式如下表所示。
上表中显示了DNS的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这6个字段是DNS的报文首部,共12个字节。整个DNS报文格式主要分为3部分内容,即基础结构部分、问题部分、资源记录部分。
3.1 基础结构部分
DNS报文的基础结构部分指的是报文首部,如下表所示。
- 事务ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段- 的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
- 标志Flags:DNS 报文中的标志字段。
- 问题计数:DNS 查询请求的数目。
- 回答资源记录数:DNS 响应的数目。
- 权威名称服务器计数:权威名称服务器的数目。
- 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。
基础结构部分中的标志字段又分为若干个字段,如下表所示。
- QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
- Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
- AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
- TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
- RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
- RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
- Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
- rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
3.2 问题部分
问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。
该部分中每个字段含义如下:
- 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询。
- 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
- 查询类:地址类型,通常为互联网地址,值为 1。
3.3 资源记录部分
资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如下表所示。
资源记录格式中每个字段含义如下:
- 域名:DNS 请求的域名。
- 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
- 类:地址类型,与问题部分中的查询类值是一样的。
- 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
- 资源数据长度:资源数据的长度。
- 资源数据:表示按查询段要求返回的相关资源记录的数据。
资源记录部分只有在DNS响应包中才会出现。
3.4 DNS报文抓包分析
下面通过Wireshark进行抓包分析DNS报文。
3.4.1 基础结构部分报文分析
(1)下图中的数据包为 DNS请求包,Domain Name System(query) 部分方框标注中的信息为 DNS 报文中的基础结构部分。
为了方便讲解这里将信息列出进行说明:
Domain Name System (query)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x0000 Standard query #报文中的标志字段
0... .... .... .... = Response: Message is a query
#QR字段, 值为0, 因为是一个请求包
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段, 值为0, 因为是标准查询
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...0 .... .... = Recursion desired: Don't do query recursively
#RD字段
.... .... .0.. .... = Z: reserved (0) #保留字段, 值为0
.... .... ...0 .... = Non-authenticated data: Unacceptable
#保留字段, 值为0
Questions: 1 #问题计数, 这里有1个问题
Answer RRs: 0 #回答资源记录数
Authority RRs: 0 #权威名称服务器计数
Additional RRs: 0 #附加资源记录数
以上输出信息显示了 DNS 请求报文中基础结构部分中包含的字段以及对应的值。这里需要注意的是,在请求中 Questions 的值不可能为 0;Answer RRs,Authority RRs,Additional RRs 的值都为 0,因为在请求中还没有响应的查询结果信息。这些信息在响应包中会有相应的值。
(2)DNS响应数据包基础结构部分如下图所示。
图中方框标注部分为响应包中基础结构部分,每个字段如下:
Domain Name System (response)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x8180 Standard query response, No error #报文中的标志字段
1... .... .... .... = Response: Message is a response
#QR字段, 值为1, 因为是一个响应包
.000 0... .... .... = Opcode: Standard query (0) # Opcode字段
.... .0.. .... .... = Authoritative: Server is not an authority for
domain #AA字段
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...1 .... .... = Recursion desired: Do query recursively
#RD字段
.... .... 1... .... = Recursion available: Server can do recursive
queries #RA字段
.... .... .0.. .... = Z: reserved (0)
.... .... ..0. .... = Answer authenticated: Answer/authority portion
was not authenticated by the server
.... .... ...0 .... = Non-authenticated data: Unacceptable
.... .... .... 0000 = Reply code: No error (0) #返回码字段
Questions: 1
Answer RRs: 2
Authority RRs: 5
Additional RRs: 5
以上输出信息中加粗部分为 DNS 响应包比请求包中多出来的字段信息,这些字段信息只能出现在响应包中。在输出信息最后可以看到 Answer RRs,Authority RRs,Additional RRs 都有了相应的值(不一定全为 0)。
3.4.2 问题部分报文分析
(1)DNS 请求包的问题部分字段信息,如下图所示。
在下图中,Queries 部分的信息为问题部分信息,每个字段说明如下:
Domain Name System (query) #查询请求
Queries #问题部分
baidu.com: type A, class IN
Name: baidu.com #查询名字段, 这里请求域名baidu.com
[Name Length: 9]
[Label Count: 2]
Type: A (Host Address) (1) #查询类型字段, 这里为A类型
Class: IN (0x0001) #查询类字段, 这里为互联网地址
其中,可以看到 DNS 请求类型为 A,那么得到的响应信息也应该为 A 类型。
(2)DNS 响应包的问题部分字段信息,如下图所示。
从图中 Queries 部分中可以看到,响应包中的查询类型也是 A,与请求包的查询类型是一致的。
3.4.3 资源记录部分报文分析
资源记录部分只有在 DNS 响应包中才会出现。下面通过 DNS 响应包来进一步了解资源记录部分的字段信息。
(1)DNS 响应包的资源记录部分的字段信息,如下图所示。
其中,方框中标注的信息为 DNS 响应报文的资源记录部分信息。该部分信息主要分为三部分信息,即回答问题区域、权威名称服务器区域、附加信息区域,下面依次分析这三部分信息。
(2)回答问题区域字段的资源记录部分信息如下:
Answers #“回答问题区域”字段
baidu.com: type A, class IN, addr 220.181.57.216 #资源记录部分
Name: baidu.com #域名字段, 这里请求的域名为baidu.com
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001) #类字段
Time to live: 5 #生存时间
Data length: 4 #数据长度
Address: 220.181.57.216 #资源数据, 这里为IP地址
baidu.com: type A, class IN, addr 123.125.115.110 #资源记录部分
Name: baidu.com
Type: A (Host Address) (1)
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 123.125.115.110
其中,
Name
的值为
baidu.com
,表示 DNS 请求的域名为
baidu.com
;类型为 A,表示要获取该域名对应的 IP 地址。
Address
的值显示了该域名对应的 IP 地址。这里获取到了 2 个 IP 地址,分别为
220.181.57.216
和
123.125.115.110
。
(3)权威名称服务器区域字段的资源记录部分信息如下:
Authoritative nameservers #“权威名称服务器区域”字段
baidu.com: type NS, class IN, ns ns7.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2) #类型字段, 这里为NS类型
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns7.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns dns.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2) #类型字段, 这里为NS类型
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: dns.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns3.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns3.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns4.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns4.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns2.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns2.baidu.com #权威名称服务器
(4)附加信息区域字段的资源记录部分信息如下:
Additional records #“附加信息区域”字段
dns.baidu.com: type A, class IN, addr 202.108.22.220 #资源记录部分
Name: dns.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 202.108.22.220 #“权威名称服务器”的IP地址
ns2.baidu.com: type A, class IN, addr 61.135.165.235 #资源记录部分
Name: ns2.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 61.135.165.235 #“权威名称服务器”的IP地址
ns3.baidu.com: type A, class IN, addr 220.181.37.10 #资源记录部分
Name: ns3.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 220.181.37.10 #“权威名称服务器”的IP地址
ns4.baidu.com: type A, class IN, addr 220.181.38.10 #资源记录部分
Name: ns4.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 220.181.38.10 #“权威名称服务器”的IP地址
ns7.baidu.com: type A, class IN, addr 180.76.76.92 #资源记录部分
Name: ns7.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 180.76.76.92 #“权威名称服务器”的IP地址
例如,权威名称服务器名称
ns7.baidu.com
对应的 IP 地址为
180.76.76.92
。
4 总结
- DNS 是 Domain Name System 的缩写,即域名系统。DNS可以理解是将域名(如:www.baidu.com)和**IP地址**进行相互映射的一个分布式数据库。
- 域名(英语:Domain Name),又称网域,是由一串用点分隔的字符串组成的Internet上某一台计算机或计算机组的名称(如:www.baidu.com),用于在数据传输时对计算机的定位标识。
- 域名采用分层的管理模式,可以分为:一级域名(或称顶级域名)、二级域名、三级域名、四级域名等等。
- 域名服务器可以分为:根域名服务器、顶级域名服务器、权限域名服务器、本地域名服务器。
- 域名解析是指把域名映射成为IP地址或把IP地址映射成域名的过程。前者称为正向解析,后者称为反向解析。在域名解析过程中,有两种查询方式,分别为递归查询和迭代查询。
- DNS报文格式主要分为3部分内容,即基础结构部分、问题部分、资源记录部分。
版权归原作者 EternallEi 所有, 如有侵权,请联系我们删除。