一篇文章让你了解DNS
目录
-
什么是DNS
-
DNS的特点
-
DNS的工作原理
-
反向解析
-
DNS的报文格式
一、什么是DNS
DNS--Domain Name System,域名系统。
互联网中计算机之间进行通讯,数据怎么走,走向哪里,这些都需要根据IP地址来指引,再如客户端访问服务器,客户端必须知道服务器的IP地址才能将数据正确地发送过去,这么重要的IP地址当然是必不可少的。我们知道现在的IP地址都是由32位的二进制数组成的,为了便于人们记忆,出现了十进制的表示方法,如192.168.0.1,但是人们对数字的记忆太困难了,更何况将来的IPV6(128位)时代,要记忆这些IP地址根本是不可能的。所以出现了更便于人记忆的域名来替代IP的记忆,如www.baidu.com,计算机只需要将域名和IP转换,就可以通过域名来访问其他的计算机。其中域名和IP转换工作就是DNS完成的,由于DNS极其重要,所以DNS在计算机网络中拥有不可缺少的地位。
DNS本质是用于TCP/IP应用程序的数据库,该数据库中记录了域名和IP的对应关系,同时也是一种用于客户端和服务端通讯的应用层的计算机网络协议。计算机要将域名解析成IP(或者将IP反解成域名),需要先去询问DNS服务器的数据库,查询得到域名和IP的对应关系,才能开始使用IP地址进行计算机通讯。
目前提供DNS功能的常用软件为BIND, 该软件产生的服务名叫做named。
二、DNS的特点
DNS服务器具有分布式、阶层式的特点。
全球有那么多的计算机,要让一台服务器记录所有的域名和IP的对应关系的数据库,那这台服务器肯定要炸了,因此人们想到了将这些庞大的数据库分布式地存储于不同的计算机中,让他们共同提供查询域名和IP的功能,目前全球共有13台根服务器,其中1台主根服务器,12台辅助根服务器;
同时为了方便管理这些域名,人们规定域名的命名采用分层的结构,即采用类似树状结构的命名方式。在这颗倒状树中,每个节点有一个最多63个字符的标识,树的最顶端的根用 . 来标识,从最底部的节点到最顶部的根节点的标识串联起来,不同节点的标识之间也用 . 来分割,这样的一组就表示一个完整的域名(FQDN),例如www.baidu.com.,不过人们通常将最后. 去掉,即www.baidu.com,这是不完整域名。
2.1 域名格式
. ---root
TLD---顶级域名(top-level domain)
com 商业机构
org 其他组织
edu 教育机构
... 等等
SLD---次级域名(second-level domain)
用户可以注册SLD
baidu
host--主机名(三级域名)
用户可以任意分配
www
2.2 域名授权
DNS的一个重要特征就是域名授权,整个DNS系统中只有一个机构--网络信息中心NIC有权负责顶级域名的分配和指派能够划分次级域名的授权机构。
一棵独立管理的DNS子树就是一个区域(zone),一个区域可以再划分更小的区域,例如com.就是一个区域,com.下可以再划分baidu.com.子区域,一个区域被委派了授权机构之后,该机构需要搭建DNS服务器,记录该区域下的子域名和IP的对应关系,并且该授权机构可以再委派该区域下的子区域的DNS系统,这样整个DNS结构会是这样的,根服务器记录授权的顶级域名的域名和IP的对应关系数据库,顶级域名服务器记录授权的次级域名的域名和IP的对应关系数据库,这样依次向下委派,就形成了阶梯式的管理结构,减轻了每个授权DNS服务器的负载。
2.3 DNS缓存
DNS的另一个特征就是建立缓存,当一个DNS服务器查询到域名和IP的映射关系后,会将该映射数据写入自己的缓存中,如果其他的主机再来询问相同的映射关系时,直接读取自己的缓存,而不需要再去询问其他服务器了。
2.4 DNS的TCP和UDP
我们知道DNS是同时监听TCP和UDP的53号端口,那么DNS什么时候使用UDP,什么时候使用TCP呢?
DNS在大部分情况下是使用UDP的,但是UDP能够传输的DNS报文最大是512字节,如果客户端在得到响应报文后得知该响应报文不止512字节的时候,客户端会重新使用TCP发送请求报文,DNS服务器使用TCP将大于512字节的报文分段传输,这是其中一种使用TCP的情况;
另外一种使用TCP的情况是,主从DNS服务器在进行数据库同步时,那么庞大的数据量,slave是怎么从master哪里更新的,当然使用的是TCP分段传输了。
三、DNS的工作原理
DNS的解析过程中最重要的两个概念是递归查询和迭代查询,
当你在浏览器输入www.baidu.com的时候,先查询浏览器的缓存中是否有域名和IP的映射关系,如果没有则查询本地hosts文件,然后查询客户端DNS缓存(如果存在客户端缓存的话),下一步是本地DNS服务器,检查本地DNS服务器的hosts文件和DNS缓存,如果还没有则下一步是ISP,ISP检查缓存还是没有;则ISP向根服务器发起询问请求,根服务器向ISP返回com.的IP地址,ISP向com.发起询问请求,com.向ISP返回baidu.com.的IP,则ISP再想baidu.com.发起询问,刚好baidu.com.有www.baidu.com.的IP,向ISP返回该IP地址,ISP得到www.baidu.com的IP后,将IP返回本地DNS服务器,本地DNS服务器在返回给客户端。这样完成整个流程。
DNS中的递归和迭代的重要区别是:递归是查询者变化,迭代是查询者不变。
四、反向解析
我们熟知的DNS的由域名获得IP为正向解析,但是DNS也提供了由IP获得域名的反向解析。这里补充一点,在顶级域中,有一个特殊的域名arpa,它有唯一的一个子域in-addr,其实in-addr.arpa域名是为反向解析做准备的。当一个DNS系统获得域名授权之后,同时也会获得in-addr.arpa的授权,假如某域名的IP地址为192.168.138.1,在DNS域名树中会这样记录该IP,in-addr下划分了192子域名,192下划分了168子域名,168下划分了138子域名,138下记录了1的映射关系,由于DNS的完整域名是从底往上串联的,因此就成了1.138.168.192.in-addr.arpa.。
因此当客户端反向解析192.168.138.1的时候,其实就是正向解析1.138.168.192.in-addr.arpa.,然后就是正向解析的正常流程,最后会访问到标识为138的DNS服务器获取该IP和域名的映射关系。总之,反向解析的本质还是正向解析。
五、DNS的报文格式
上图是DNS的一般报文格式:
标识-----两个字节,是请求报文和应答报文的对应id,用来区分应答报文是哪个请求报文的响应;
标志-----进一步分为不同的字段,分别为
QR-----一位,0表示该报文为查询报文,1表示响应报文
opcode-四位,操作码字段,0表示正向解析,1表示反向解析
AA-----一位,授权回答,如果是响应报文设定,说明该响应是本域名的DNS服务器发出的
TC-----一位,可截断,使用UDP时,如果响应报文的长度超过512字节,则只返回前512字节。
RD-----一位,递归期望,1表示DNS服务器必须递归处理该请求报文
RA-----一位,递归可用,在响应报文中设定,1表示该域名的DNS服务器支持递归查询
zero---三位,保留字段,必须全为0
rcode--四位,响应码,返回一些正确,格式错误等信息
问题数
资源记录数
授权资源记录数
额外资源记录数
-----以上字段分别表示最后那四个可变字段的统计记录条目数
上边的12个字节字段是DNS报文的包头部分
上图是查询问题部分的字段格式:
查询名----表示要查询的域名
查询名是由一连串的序列组成的,例如www.baidu.com.在报文中的表示方式为3www5baidu3com0,数字表示计数,因为域名树每个节点的字符数最多为63,所以数字的范围为0~63,最后都以0结尾,表示root;
查询类型--表示要查询什么样的记录,响应报文就返回什么类型的记录;常见的记录类型有:
A-----IP地址
NS----name server,域名的DNS服务器
CNAME-别名
PRT---指针类型,用于反向解析
MX----域名的邮件服务器
查询类----通常为1,表示查询的是互联网类型,即我们经常在查询结果中看到的IN
上图表示的回答、授权、额外信息三个可变字段的一般格式,用于响应报文
域名-----指定响应的域名,存储格式和上边的一样
类型-----指定记录类型
类-------一般为1,表示互联网类型,即IN
生存时间-表示该记录可以再客户端的缓存中存放多长的时间
资源数据长度-表示返回的记录的数据长度,例如A记录,则数据长度为4字节的IP地址长度
资源数据-表示具体的记录结果