一:DNS协议简介
当我们想要访问百度的时候,我们会输入网址www.baidu.com,而不是直接输入百度的服务器的IP地址去访问,而且我们也不知道百度的服务器的IP地址是多少。为什么我们输入百度的网址就能自动去找到百度的服务器地址呢。这背后就有DNS的功劳。
域名系统(Domain Name System,缩写:DNS)是互联网的一项基础服务。DNS允许终端用户设备将给定的人类可读URL转换为网络可以理解的机器可用IP地址。DNS本质是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系统。
DNS作为互联网的一个基础协议,其设计之初就考虑到了高效简单可用的原则,采用了协议设计中场景的分层架构。就像一个数据包有网络层,传输层,应用层。DNS本身也有自己独特的分层设计。
Domain 分层架构呈现为树形结构,最顶上的为根服务器,然后为顶级域名(常见的如aliyun.com,sina.com.net,zte.com.cn)。目前,已经有超过 250 个顶级域名,每个顶级域名又可以进一步的划分出二级域名,二级域名又可以再划分出三级域名。依此类推,最终形成了我们现在见到的 www.baidu.com. 此类形式。(注:最后一个点表示根服务器,默认可忽略。)
Domain 的分层架构设计体现了高效简单可用,如下:
- 层级清晰:每一级域名代表一个层级,整个域名系统具有清晰的层次结构,简化每一层的管理和维护。
- 分布式管理:DNS 是一个分布式数据库,不同的域名由不同的 DNS 服务器管理。分布式管理的最大优点就是提高整个集群的健壮性,单点故障不会影响整个DNS系统。
- 易于扩展:可以根据需要简易的在树形结构上添加新的域名节点,而不会影响到整个系统的稳定性和性能。
- 易于解析:使得域名更容易被解析,有助于搜索和查找。也方便进行域名解析的缓存,提高了域名解析的效率。
二:DNS协议字段解析
DNS协议的层级在传输层之上,常见的是用UDP作为传输层,用的是知名端口53,当然也有TCP的DNS。
1,标识(identifier)
标识占16 位,标识用于DNS的请求和响应是不是一对。对于一对的请求和响应,标识字段是一样的。
2,标志(flags )
标志占 16 位,其包含8个标志字段,其含义分别如下
QR
查询应答标志,0表示这是查询报文,1表示这是应答报文。opcode
查询应答类型,0表示标准查询,1表示反向查询,2表示请求服务器状态。AA
表示权威回答( authoritative answer ),意味着当前查询结果是由域名的权威服务器给出的,仅由应答报文使用。TC
位表示截断( truncated ),使用 UDP 时,如果应答超过 512 字节,只返回前 512 个字节,仅当DNS报文使用UDP服务时使用。DNS 协议使用UDP服务,但也明确了 『当 DNS 查询被截断时,应该使用 TCP 协议进行重试』 这一规范。RD
表示递归查询标志 ( recursion desired ),在请求中设置,并在应答中返回。
- 该位为 1 时,服务器必须处理这个请求:如果服务器没有授权回答,它必须替客户端请求其他 DNS 服务器,这也是所谓的 递归查询;
- 该位为 0 时,如果服务器没有授权回答,它就返回一个能够处理该查询的服务器列表给客户端,由客户端自己进行 迭代查询。
RA
位表示可递归 ( recursion available ),如果服务器支持递归查询,就会在应答中设置该位,以告知客户端。仅由应答报文使用。zero
这三位未使用,固定为0。rcode
表示返回码(reply code),用来返回应答状态,常用返回码:0表示无错误,2表示格式错误,3表示域名不存在。
3,问题数(question count )
占16位,表示后面问题节中的记录个数
4,应答资源记录数(answer count)
占16 位,表示答案节中的记录个数
5,授权资源记录数(authority record count)
占16 位,表示授权信息节中的记录个数
6,额外资源记录数(additional record count)
占16 位,表示额外信息节中的记录个数
7,查询问题
询问题部分由多个(question count)问题构成,每个问题的格式都相同,分为3个段:
- 查询名,以
example.com
为例,将被编码为7example3com0
这13个字节。数字7表示后面example的长度,最后0则表示后面没跟任何字符,相当于一个结束符。单个字节最长可表示255大小,因此每一级域名的最大长度也是255。 - 查询类型(type)
- 查询类(class),通常为 1 ,表示 TCP/IP 互联网地址;
常用的查询类型如下:
查询类型 | 名称代码 | 含义 |
---|---|---|
1 | A | 将域名解析到一个指定的IPV4的IP上。 |
2 | NS | 用来指定该域名由哪个DNS服务器来进行解析,类似于托管,将子域名交给其他DNS服务器解析。 |
5 | CNAME | 规范名称,可以将注册的不同域名都转到同一个规范名称上,由这个规范名称统一解析IP地址 |
15 | MX | 电子邮件交互 |
16 | TXT | 文本信息 |
28 | AAAA | 将域名解析到一个指定的IPV6的IP上。 |
8,应答
该部分仅在应答报文中才有,由应答资源记录(answer resource record, answer RR)、授权资源记录(authority resource record, authority RR)和额外资源记录(additional resource record, additional RR)三部分构成,当然,并非每个应答报文都同时会包含这三部分,有的报文只包含其中一部分或两部分。这三部分均使用相同的格式,以应答资源记录为例,应答资源记录内部也是由answer count 个答案组成的,每个答案可分为6个段,前三个段与请求报文中的查询问题一节中的段落完全一致。
DNS请求
DNS响应
三:DNS工作原理
域名解析流程,即:DNS 系统将域名解析为 IP 地址的过程。域名递归解析流程,即:从 DNS 系统中的根服务器开始向下递归多个相关 DNS 服务器并最终完成域名解析的流程。一个相对完整的流程如下图所示:
需要注意的是域名的查询有两种方式,一种是递归查询和迭代查询。