通过DNS数据包解释DNS协议各个字段含义
通常来说,想要对DNS最为权威和全面的定义见RFC文档,这里。但是本文不是一篇面面俱到的DNS说明文档,是从使用示例出发,使用wireshark对于一个具体的DNS请求进行分析和呈现,并介绍DNS中最常见的一些字段的含义。
域名的出现是为了方便人们记住网络中的公开服务的地址,所以域名一般使用特定意义的字符串表示,例如csdn.net。但是网络空间对于主机的标识是IP地址,IP地址分为IPv4以及IPV6,例如192.168.0.1。使用数字表示地址对于机器来说是友好的,方便存储,寻址等运算。人记住的是域名,机器记住的是IP地址,为了完成人机之间的交互,DNS就出现了。DNS全称叫做domain name system,DNS的本质就是域名到IP的映射表。当然构建这张表很容易,但是如何在网络空间中用好这张表,需要软件和硬件的配合。这里的软件就是指我们通常所说的DNS协议,这里的硬件就是网络空间中存在的各种各样的DNS服务器。
DNS示例
DNS请求从业务逻辑上来讲是十分的简单,如下图1所示:
图1
- 源地址192.168.0.103对目的地址192.168.0.1发起DNS请求。
- 192.168.0.1对于p3p.sogou.com域名对应的IP地址进行了响应。
其中192.168.0.103是请求解析的客户端,192.168.0.1是本地的DNS服务器地址,p3p.sogou.com域名对应的IP地址有多个,包括49.7.176.34以及49.7.176.60等多个IP地址。上述是对于DNS整个业务逻辑上的描述,其请求和响应字段的解析如下。
无论是DNS请求消息还是响应消息,RFC1035中DNS消息的整体结构如下图2:
图2
其中header部分是每个DNS消息都具备的,根据header的不同,决定了该DNS请求和响应内容结构的不同。
DNS 头部
Header结构如下图3:
图3
对应图1的请求头示例如下图4:
图4
对应图2的响应头示例如下图5:
图5
transaction ID
无论对于TCP还是UDP来说,一条流上是能承载多个请求和响应的。因此通信双方为了区分一条流上出现的请求和相应对,使用了transaction ID在应用层加以区分,称之为一次事物交互。可看到图4和图5使用同一个transaction ID表示这一一堆请求和响应。
QR
- QR字段依据第一个bit位的不同,后续的每个bit表示的含义是不同的。如果第一个标志位是0,表示这是一个DNS请求,如图4。如果第一个标志位为1,表示这是一个DNS响应如图5。
OPCODE
该字段一共使用4个bit表示。0表示标准的DNS请求。1表示反向DNS请求,通常DNS通过域名请求IP,反向DNS表示通过IP请求域名。但是在使用nslookup做反向DNS请求的时候,该字段值仍然是0,实际使用的是请求的type字段表示反向DNS,如图6。OPCODE为2表示请求服务器的状态。OPCODE3-15属于保留使用。
图6
AA
AA即Authoritative Answer,表示权威的响应。当响应的服务器并非域名注册时候所设定的DNS服务器的时候,DNS 响应中该值都是0,如图5。当响应的服务器是域名登记时候指定的DNS服务器时候,值为1。该字段用来提醒非注册指定DNS解析服务器的响应可能存在问题。
TC
由于IP承载层的限制,上层消息过大的时候会发生分片传输,DNS应用层使用该标志位表示DNS消息是否截断。0表示是一个完整的DNS消息,1表示发生截断,如图4/5所示。
RD
Recursion desired,DNS的查询方式包含递归查询和迭代查询,该标志位为1表示请求DNS服务器采用递归查询的方式,为0表示客户端采用迭代查询方式,递归查询比较常见,如图4/5所示。关于两种查询方式会单独进行介绍。
RA
该字段在DNS响应中有意义,为1的时候表示服务器支持递归查询的方式,如上图5所示。
Z
保留位,为未来规划使用,如图4/5所示。
AD
在图3中Z保留位是3位,但是在图4/5中,Z只占了1位。这一因为RFC1035编写的时间为1987年,非常的古老,期间经历过多次的修订,如下图7:
图7
在RFC2535中对保留字段进行了修订,如下图8:
图8
因此AD的含义表示响应数据是否经过DNS服务器认证,该标志位在响应中才有实际的意义,如图5。
CD
表示没有经过服务器认证的数据是否可以接受,0表示不可接受,1表示接受,如图4/5。
RCODE
Response code,4位响应码,用来表示服务器可能存在的错误。0表示没错误,1表示DNS请求格式错误/服务器无法解析请求,2表示服务器自身问题无法解析请求。其他数值出现的频次较少,出现后可以自行查阅RFC1035文档。
QDCOUNT
2个字节表示后续查询的域名数量,图4中的值为1,对应请求中只有一个记录。
ANCOUNT
2个字节表示DNS服务器响应中条目数,如图5,有5个响应记录,因为一个域名可能对应着多个IP地址,因此出现5次响应记录。
NSCOUNT
2个字节表示经过服务器认证的记录个数,如图4/5,认证记录如图2中的结构。
ARCOUNT
2个字节表示是否存在附加信息记录个数,如图4/5,附加信息如图2中的结构。
DNS请求字段
RFC 1035定义的请求消息内容如下图9:
图9
QNAME
该字段表示的是请求的域名内容,由于域名字符串是变长的,因此该部分内容使用特殊编码方式,长度+字符内容,并以ASCII码0作为结束。
QTYPE
该字段使用两个字节表示请求记录的类型,如图4所示,数字1代表的是A记录,即从域名到IP地址的解析。除此之外DNS还支持诸多的其他解析请求类型,如下图10。其中CNAME表示一个别名记录;NS 表示查询DNS服务器的IP地址记录;PTR表示一个反向查询的记录,即IP到DNS的映射记录;MX表示域名到邮件服务器地址的映射记录,比如根据邮箱后缀查找对应的邮件服务器地址就属于这种场景。
QCLASS
在早期的网络中是考虑到互联网之外的其他网络的,如图11。但是现在的DNS请求中该字段基本为1,因为其他种类的网络基本消失了。
图10
图11
DNS响应字段
RFC 1035定义的请求消息内容如下图12:
图12
其中NAME,TYPE,CLASS的含义和请求中的内容是相同的,其他字段的含义如下:
TTL
4个字节表示DNS记录建议被缓存的秒数。
RDLENGTH
两个字节表示RDDATA部分的数据长度、
RDDATA
变长数据表示解析的内容,对应图5中解析后的IP地址。
上述通过RFC文档和实际的DNS数据包,对于DNS各个字段进行了介绍,后续会介绍DNS两种查询的方式。
本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。