1.DNS概述
域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字(如淘宝、百度、腾讯等)转换为IP地址。域名系统很明确地指明这种系统是用在因特网中。
用户与因特网中某个主机通信时,必须要知道对方的IP地址。然而用户很难记住长达32位二进制主机地址,在应用层为了便于用户记忆各种网络应用,更多使用主机名字。但是,机器在处理IP数据报时,并不是使用域名而是使用IP地址。这是因为IP地址长度固定,而域名的长度不固定,机器处理起来比较困难。
因为因特网规模很大,所以整个因特网只使用一个域名服务器是不可行的。因此,早在1983年因特网开始采用层次树状结构的命名方法,并使用分布式的域名系统DNS,采用客户服务器方式。DNS使大多数名字都在本地解析(resolve),仅有少量解析需要在因特网上通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机除了故障,也不会妨碍整个DNS系统的正常运行
1.1 域名结构
采用层次树状的命名方法,任何一台连接在因特网上的主机或者路由器,都有一个唯一的层次结构的名字,即域名(domain name)
域名解析是一个从右向左,由大向小的的过程
2.DNS报文分析
2.1 DNS报文格式
数据报文如下:
以下三个在响应报文中出现
- Answers
服务器到客户端的回答
- Authoritative nameservers
给出权限服务器的相关信息
- Additional recoreds
提供辅助的附加信息
2.1.1 Transcation ID标识
用于识别响应报文与查询报文的对应
2.1.2 Flags标志
每个字段的含义解析如下:
- QR
查询/响应标志,0为查询,1为响应
- opcode
0表示标准查询
1表示反向查
2表示服务器状态请
3-15为保留值
- AA(1bit)
Authoritative Answer
是否权威应答
权威应答就是权威服务器给出的域名解析。权威服务器就是这个域名的“源解析服务器”也是最权威的解析
- TC(1bit)
(TrunCation) 是否可截断的
因为一个UDP报文为512字节,所以该位指示是否截断超过的部分
- RD
Recursion Desired 是否请求递归
这个比特位被请求设置,应答的时候使用的相同的值返回
- RA(1bit)
Recursion Available 由DNS回复返回指定,说明DNS服务器是否支持递归查询
这个比特位在应答中设置或取消
- zero
第10-12位,保留位(设置为0)
- rcode(4bit)
Response Code
0:没有错误
1:格式错误
2:服务器错误
3:名字错误
4:服务器不支持
5:拒绝
6-15:保留值
2.1.3 其他头部字段
- Questions(2字节):报文请求段中的问题记录数;
- AnswerRRs(2字节): 报文回答段中的回答记录数;
- AuthorityRRs(2字节): 报文授权段中的授权记录数;
- AdditionalRRs(2字节) :报文附加段中的附加记录数;
2.1.4 查询区域
- 查询类型
常用的查询类型有以下几种:
A:由域名获得IPv4地址,值为1
NS:查询域名服务器,值为2
CNAME:获得目标主机的别名,值为5
PTR:把IP地址转换成域名,值为12
AAAA:由域名获得IPv6地址,值为28
- 查询类
通常为1,表明是Internet数据,共2个字节,比如,IN代表Internet
2.1.5 资源记录区域
- 域名
当响应报文中出现相关的域名时,使用指针偏移法
- 元信息表示法
(即:非压缩方式lable)以标识符的字节数开头,以00结尾,如:www.baidu.com,其可以表示(ASCII码表中对应的十六进制)成03 77 77 77 05 62 61 69 64 75 03 63 6F 6D 00
- 指针偏移法:
(即:压缩方式poniter) 响应报文中其资源记区域的域名最高为11,即C开头的,如0xC00C(1100000000001100)除去最高为11,Offset其他14位表示指针偏移量(表示从报文开始的字节指针。偏移量为0表示ID字段的第一个字节),如0xC00C表示偏移12字节,即(2字节Name+2字节Type+2字节class+4字节TTL+2字节的资源数据长度)偏移到资源数据部分位置,即域名为:www.baidu.com
如果为0xc02b,则偏移43字节(从最开始的位置偏移43个),则03 77 77 77 01 61 06 73 68 69 65 6e c0 16,即别名为:www.a.shifen.com
3. 混合方式:
以上两种方式的结合
- TTL
生存时间(TTL):以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)
- 资源数据
该字段是一个可变长字段,表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等
3.传输
RFC文档中指出,DNS同时支持端口53的TCP[RFC-793]和端口53的UDP [RFC-768]传输
- 报文长度考虑
UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节
- 区域传输的时候使用TCP协议
DNS的规范规定了2种类型的DNS服务器,一个叫主DNS服务器,一个叫辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息,这就叫做区传送(zone transfer)
辅助域名服务器会定时(一般是3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。 而TCP传输数据的可靠性,保证了数据的准确性。
- 域名解析时使用UDP协议
客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包
4.实例演示
4.1 模拟域名解析
使用nslookup工具模式模拟域名解析
具体的WireShark抓包如下