1. 简介

  • 域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
  • DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。DNS协议是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。
  • DNS是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统。
  • DNS系统采用递归查询请求的方式来响应用户的查询,为互联网的运行提供关键性的基础服务。
  • 目前绝大多数的防火墙和网络都会开放DNS服务,DNS数据包不会被拦截,因此可以基于DNS协议建立隐蔽信道,从而顺利穿过防火墙,在客户端和服务器之间传输数据。
  • DNS允许终端用户设备将给定的人类可读URL转换为网络可以理解的机器可用IP地址。
  • Internet Engineering Task Force(IETF)标准组对HTTP和DNS进行了标准化定义。
  • 原始的DNS标准是在1987年发布的,因为用户在使用网络浏览器的同时需要使用其他应用程序,例如将电子邮件地址转换为IP地址。

2. DNS应用层协议

2.1 DNS资源记录

  • 在介绍DNS层协议之前,先了解一下DNS服务器存储资源记录(Resource Records,RRs),一条资源记录(RR)记载着一个映射关系。每条RR通常包含如下表所示的一些信息:
字段含义
NAME名字
TYPE类型
CLASS
TTL生存时间
RDLENGTHRDATA所占的字节数
RDATA数据
  • NAME和RDATA表示的含义根据TYPE的取值不同而不同,常见的:
  1. 若TYPE=A,则name是主机名,value是其对应的ip;
  2. 若TYPE=NS,则name是一个域,value是一个权威DNS服务器的主机名。该记录表示name域的域名解析将由value主机名对应的DNS服务器来做;
  3. 若TYPE=CNAME,则value是别名为name的主机对应的规范主机名;
  4. 若TYPE=MX,则value是别名为name的邮件服务器的规范主机名;
  5. ……
  • TYPE实际上还有其他类型,所有可能的type及其约定的数值表示如下:
TYPEvaluemeaning
A1a host address
NS2an authoritative name server
MD3a mail destination (Obsolete - use MX)
MF4a mail forwarder (Obsolete - use MX)
CNAME5the canonical name for an alias
SOA6marks the start of a zone of authority
MB7a mailbox domain name (EXPERIMENTAL)
MG8a mail group member (EXPERIMENTAL)
MR9a mail rename domain name (EXPERIMENTAL)
NULL10a null RR (EXPERIMENTAL)
WKS11a well known service description
PTR12a domain name pointer
HINFO13host information
MINFO14mailbox or mail list information
MX15mail exchange
TXT16text strings

2.2 整体及Header部分

DNS请求与响应的格式是一致的,其整体分为Header、Question、Answer、Authority、Additional5部分,如下图所示:

Header部分是一定有的,长度固定为12个字节;其余4部分可能有也可能没有,并且长度也不一定,这个在Header部分中有指明。Header的结构如下:

下面说明一下各个字段的含义:

  1. ID:占16位。该值由发出DNS请求的程序生成,DNS服务器在响应时会使用该ID,这样便于请求程序区分不同的DNS响应。
  2. QR:占1位。指示该消息是请求还是响应。0表示请求;1表示响应。
  3. OPCODE:占4位。指示请求的类型,有请求发起者设定,响应消息中复用该值。0表示标准查询;1表示反转查询;2表示服务器状态查询。3~15目前保留,以备将来使用。
  4. AA(Authoritative Answer,权威应答):占1位。表示响应的服务器是否是权威DNS服务器。只在响应消息中有效。
  5. TC(TrunCation,截断):占1位。指示消息是否因为传输大小限制而被截断。
  6. RD(Recursion Desired,期望递归):占1位。该值在请求消息中被设置,响应消息复用该值。如果被设置,表示希望服务器递归查询。但服务器不一定支持递归查询。
  7. RA(Recursion Available,递归可用性):占1位。该值在响应消息中被设置或被清除,以表明服务器是否支持递归查询。
  8. Z:占3位。保留备用。
  9. RCODE(Response code):占4位。该值在响应消息中被设置。取值及含义如下:
    • 0:No error condition,没有错误条件;
    • 1:Format error,请求格式有误,服务器无法解析请求;
    • 2:Server failure,服务器出错。
    • 3:Name Error,只在权威DNS服务器的响应中有意义,表示请求中的域名不存在。
    • 4:Not Implemented,服务器不支持该请求类型。
    • 5:Refused,服务器拒绝执行请求操作。
    • 6~15:保留备用。
  10. QDCOUNT:占16位(无符号)。指明Question部分的包含的实体数量。
  11. ANCOUNT:占16位(无符号)。指明Answer部分的包含的RR(Resource Record)数量。
  12. NSCOUNT:占16位(无符号)。指明Authority部分的包含的RR(Resource Record)数量。
  13. ARCOUNT:占16位(无符号)。指明Additional部分的包含的RR(Resource Record)数量。

2.3 Question部分

Question部分的每一个实体的格式如下图所示:

  1. QNAME:字节数不定,以0x00作为结束符。表示查询的主机名。注意:众所周知,主机名被"."号分割成了多段标签。在QNAME中,每段标签前面加一个数字,表示接下来标签的长度。比如:api.sina.com.cn表示成QNAME时,会在"api"前面加上一个字节0x03,"sina"前面加上一个字节0x04,"com"前面加上一个字节0x03,而"cn"前面加上一个字节0x02;
  2. QTYPE:占2个字节。表示RR类型,见以上RR介绍;
  3. QCLASS:占2个字节。表示RR分类,见以上RR介绍。

2.4 Answer、Authority、Additional部分

Answer、Authority、Additional部分格式一致,每部分都由若干实体组成,每个实体即为一条RR,之前有过介绍,格式如下图所示:

  1. NAME:长度不定,可能是真正的数据,也有可能是指针(其值表示的是真正的数据在整个数据中的字节索引数),还有可能是二者的混合(以指针结尾)。若是真正的数据,会以0x00结尾;若是指针,指针占2个字节,第一个字节的高2位为11。
  2. TYPE:占2个字节。表示RR的类型,如A、CNAME、NS等,见以上RR介绍;
  3. CLASS:占2个字节。表示RR的分类,见以上RR介绍;
  4. TTL:占4个字节。表示RR生命周期,即RR缓存时长,单位是秒;
  5. RDLENGTH:占2个字节。指定RDATA字段的字节数;
  6. RDATA:即之前介绍的value,含义与TYPE有关,见以上RR介绍。

3. DNS域名结构

域名系统必须要保持唯一性。
为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法:
1. 每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成
2. 标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label)
3. 每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名
4. 级别最低的域名写在左边,级别最高的域名写在右边。
域名服务主要是基于UDP实现的,服务器的端口号为53。
关于域名的层次结构,如下图所示:

图注:因特网的域名空间结构

eg :我们熟悉的,www.baidu.com
1. com: 一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等。
2. baidu: 二级域名,指公司名。
3. www: 只是一种习惯用法。

4. DNS域名的分级

域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。
如下图所示:

其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名

国家顶级域名中国:cn, 美国:us,英国uk…
通用顶级域名com公司企业,edu教育机构,gov政府部门,int国际组织,mil军事部门 ,net网络,org非盈利组织…
反向域名arpa,用于PTR查询(IP地址转换为域名

5. 域名服务器

域名是分层结构,域名服务器也是对应的层级结构。
有了域名结构,还需要有一个东西去解析域名,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。

由高向低进行层次划分,可分为以下几大类:

分类作用
域名服务器最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助
顶级域名服务器负责管理在该顶级域名服务器下注册的二级域名
权限域名服务器负责一个区的域名解析工作
本地域名服务器当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器

注:一个域名服务器所负责的范围,或者说有管理权限的范围,就称为区。
我们需要注意的是:
1. 每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器。
2. 每一级域名服务器都知道下级域名服务器的IP地址。
3. 为了容灾,每一级至少设置两个或以上的域名服务器。

6. 域名解析过程

域名解析总体可分为一下过程:
(1) 输入域名后,先查找自己主机对应的域名服务器,域名服务器先查找自己的数据库中的数据;
(2) 如果没有, 就向上级域名服务器进行查找, 依次类推;
(3) 最多回溯到根域名服务器,肯定能找到这个域名的IP地址;
(4) 域名服务器自身也会进行一些缓存, 把曾经访问过的域名和对应的IP地址缓存起来,可以加速查找过程;

具体可描述如下:
1. 主机先向本地域名服务器进行递归查询;
2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询;
3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的IP地址;
4. 本地域名服务器向顶级域名服务器进行查询;
5. 顶级域名服务器告诉本地域名服务器,下一步查询权限服务器的IP地址;
6. 本地域名服务器向权限服务器进行查询;
7. 权限服务器告诉本地域名服务器所查询的主机的IP地址;
8. 本地域名服务器最后把查询结果告诉主机。

如图所示:

DNS域名查询方式:递归查询、迭代查询和反向查询:

(1)递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机。

(2)迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。

(3)反向查询:反向查询时通过DNS客户端提供的IP地址来查询主机完整域名,但是域名与IP地址之间无法建立直接对应关系,所以要在DNS服务器内创建一个反向型查询的区域。

 ☛  以上部分图片及内容显示异常,详细图文内容!  

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐