DNS协议分析
协议描述
DNS协议是用来进行域名与IP地址之间的转换的。当一个应用进程需要把域名解析为IP地址时,该应用进程就调用解析程序,把待解析的域名在DNS请求报文中,以UDP数据报方式发送给本地域名服务器。本地域名服务器在查找域名后,把对应的IP地址放在DNS应答报文中返回。若本地域名服务器不能回答该请求,则向其它域名服务器发送查询请求,直至找到能够回答该请求的域名服务器。
协议数据格式
根据RFC1035文档可知,DNS协议报文格式如下所示:
+---------------------+
| Header | 报文头
+---------------------+
| Question | 查询请求
+---------------------+
| Answer | 应答
+---------------------+
| Authority | 授权应答
+---------------------+
| Additional | 附加信息
+---------------------+
Header定义了报文是请求还是应答、错误码以及其它的一些标志位;
Question描述了查询的问题,包括查询类型(QTYPE)、查询类(QCLASS) 和查询的域名(QNAME);
Answer段包含回答问题的RRs;
Authority段包含授权域名服务器的RRs;
Additional段包含和请求相关的,但是不是必须回答的RRs。
首部部分格式
DNS协议报文首部的格式如下所示:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA|Z |AD|CD| RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
ID (16Bits)
客户端设置,响应报文会原样带回,用于客户端区分不同的请求应答;
QR (1Bit)
区分是请求 (0 Question) 还是应答 (1 Response);
Opcode (4Bits)
设置查询的种类,响应报文会原样带回,可以为:0 标准查询 QUERY;1 反向查询 IQUERY;2 服务器状态查询 STATUS;3~15 保留;
AA (1Bit)
授权应答(Authoritative Answer),这个位在响应报文有效,用于标示服务器响应报文是否为授权服务器返回的结果,可能是在本地 Cache 的缓存;
TC (1Bit)
截断(Truncation),报文因为超过了允许的长度,导致被截断,仅当DNS报文使用UDP服务时使用。因为UDP数据包有长度限制,当长度过长时会被截断。当TC = 1时,标识DNS报文长度超过512字节,并被截断;
RD (1Bit)
期望递归(Recursion Desired)用于请求中,这个位可以置为1,并且被复制到响应中,它引导名称服务器递归跟踪查询,支持递归跟踪查询是可选项。
如果RD = 1,标识执行递归查询,即DNS服务器无法解析某一个主机名,则它向其它DNS服务器继续查询,如此反复,直到它解析到目标主机名并返回给客户端;
如果RD =0标识迭代查询,即DNS服务器无法解析目标主机时,它将查询到的其它DNS服务器的IP地址返回给客户端,供客户端进行参考;
RA (1Bit)
递归可用(Recursion Available)用于响应中,如果服务器支持递归查询则设置为 1 ,否则设置为 0 ;
Z (1Bit)
保留将来使用,原始的DNS保留Z字段供将来使用,它所有的查询和响应中必须是零(0);
AD (1Bit)
应答认证(Answer authenticated)应答/权限部分未由服务器进行认证。
AD = 0 应答服务器未验证该查询相关的 DNSSEC 数字签名;
AD = 1 应答服务器已经验证了该查询相关的 DNSSEC 数字签名。
CD (1Bit)
未经认证的数据:不可接受
CD = 0 为服务器已经进行了相关 DNSSEC 数字签名的验证;
CD = 1 为服务器并未进行相关 DNSSEC 数字签