内容概要:
DNS 的特点
DNS 工作原理
DNS 反向解析
DNS 报文格式
之前我们有文章介绍了DNS基本概念及负载均衡,点击下方链接可回顾↓↓↓
DNS协议——网络世界的地址簿
一、DNS 的特点
DNS服务器具有分布式、阶层式的特点。
全球有那么多的计算机,要让一台服务器记录所有的域名和ip的对应关系的数据库,那这台服务器肯定要炸了,因此人们想到了将这些庞大的数据库分布式地存储于不同的计算机中,让他们共同提供查询域名和IP的功能,目前全球共有13台根服务器,其中1台主根服务器,12台辅助根服务器;
同时为了方便管理这些域名,人们规定域名的命名采用分层的结构,即采用类似树状结构的命名方式。
在这颗倒状树中,每个节点有一个最多63个字符的标识,树的最顶端的根用 . 来标识,从最底部的节点到最顶部的根节点的标识串联起来,不同节点的标识之间也用 . 来分割,这样的一组就表示一个完整的域名(FQDN),例如“www.baidu.com.”,不过人们通常将最后的“. ”去掉,即“www.baidu.com”,这是不完整域名。
1.1 域名格式
. —root
TLD—顶级域名(top-level domain)
com 商业机构
org 其他组织
edu 教育机构
… 等等
SLD—次级域名(second-level domain)
用户可以注册SLD
3onedata
host–主机名(三级域名)
用户可以任意分配
www
1.2 域名授权
DNS的一个重要特征就是域名授权,整个DNS系统中只有一个机构–网络信息中心NIC有权负责顶级域名的分配和指派能够划分次级域名的授权机构。
一棵独立管理的DNS子树就是一个区域(zone),一个区域可以再划分更小的区域,
例如:
com.就是一个区域,com.下可以再划分baidu.com.子区域,一个区域被委派了授权机构之后,该机构需要搭建DNS服务器,记录该区域下的子域名和IP的对应关系,并且该授权机构可以再委派该区域下的子区域的DNS系统;
这样整个DNS结构会是这样的,根服务器记录授权的顶级域名的域名和IP的对应关系数据库,顶级域名服务器记录授权的次级域名的域名和IP的对应关系数据库,这样依次向下委派,就形成了阶梯式的管理结构,减轻了每个授权DNS服务器的负载。
1.3 DNS缓存
DNS的另一个特征就是建立缓存,当一个DNS服务器查询到域名和IP的映射关系后,会将该映射数据写入自己的缓存中,如果其他的主机再来询问相同的映射关系时,直接读取自己的缓存,而不需要再去询问其他服务器了。
1.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.3onedata.com的时候,先查询浏览器的缓存中是否有域名和IP的映射关系,如果没有则查询本地hosts文件,然后查询客户端DNS缓存(如果存在客户端缓存的话),下一步是本地DNS服务器,检查本地DNS服务器的hosts文件和DNS缓存;
如果还没有则下一步是ISP,ISP检查缓存还是没有;则ISP向根服务器发起询问请求,根服务器向ISP返回com.的IP地址,
ISP向com.发起询问请求,com.向ISP返回3onedata.com.的IP,则ISP再想3onedata.com.发起询问,
刚好3onedata.com.有www.3onedata.com.的IP,向ISP返回该IP地址,ISP得到www.3onedata.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的一般报文格式:
1、标识—–两个字节,是请求报文和应答报文的对应id,用来区分应答报文是哪个请求报文的响应;
2、标志—–进一步分为不同的字段,分别为
QR—–一位,0表示该报文为查询报文,1表示响应报文
opcode-四位,操作码字段,0表示正向解析,1表示反向解析
AA—–一位,授权回答,如果是响应报文设定,说明该响应是本域名的DNS服务器发出的
TC—–一位,可截断,使用UDP时,如果响应报文的长度超过512字节,则只返回前512字节。
RD—–一位,递归期望,1表示DNS服务器必须递归处理该请求报文
RA—–一位,递归可用,在响应报文中设定,1表示该域名的DNS服务器支持递归查询
zero—三位,保留字段,必须全为0
rcode–四位,响应码,返回一些正确,格式错误等信息
问题数
资源记录数
授权资源记录数
额外资源记录数
—–以上字段分别表示最后那四个可变字段的统计记录条目数
上边的12个字节字段是DNS报文的包头部分
上图是查询问题部分的字段格式:
查询名—-表示要查询的域名
查询名是由一连串的序列组成的,例如www.3onedata.com.在报文中的表示方式为3www53onedata3com0,数字表示计数,因为域名树每个节点的字符数最多为63,所以数字的范围为0~63,最后都以0结尾,表示root;
查询类型–表示要查询什么样的记录,响应报文就返回什么类型的记录;常见的记录类型有:
A—–IP地址
NS—-name server,域名的DNS服务器
CNAME-别名
PRT—指针类型,用于反向解析
MX—-域名的邮件服务器
查询类—-通常为1,表示查询的是互联网类型,即我们经常在查询结果中看到的IN
上图表示的回答、授权、额外信息三个可变字段的一般格式,用于响应报文
域名—–指定响应的域名,存储格式和上边的一样
类型—–指定记录类型
类——-一般为1,表示互联网类型,即IN
生存时间-表示该记录可以再客户端的缓存中存放多长的时间
资源数据长度-表示返回的记录的数据长度,例如A记录,则数据长度为4字节的IP地址长度
资源数据-表示具体的记录结