DNS服务器
DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器,使用UDP和TCP 的53端口。DNS服务器是C/S架构,服务器完成将主机名和域名转换为IP地址的工作。
“本文将主要介绍DNS报文的格式,以及通过wireshark观察DNS报文来进行学习。”
信息来源
以下内容记录在RFC1035
报文格式
dns请求和应答都是用相同的报文格式,分成5个段(有的报文段在不同的情况下可能为空),如下:
+---------------------+
| Header | 报文头 // 报文头格式 1.1 节
+---------------------+
| Question | 要查询的问题 // 问题格式 1.2 节
+---------------------+
| Answer | 服务器的应答 // 后三种信息统一格式 1.3 节
+---------------------+
| Authority | 权威的应答
+---------------------+
| Additional | 附加信息
+---------------------+
Header段定义了Request/Response,以及其它一些信息;
Question段描述了查询问题;
Answer段包含了对问题的回复信息。
1.1 Header格式
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID | 客户端设置16bit ID,服务器响应时应一致
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE | 一些状态字,在下面详细讨论
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT | 表示报文请求段的数目
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT | 表示报文回答段的数目
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT | 报文授权段的数目
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT | 报文附加段的数目
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
字段的解释:
ID:唯一标识了某个请求与对应的应答
QR :字段 1bit区分请求(0),应答(1)。
OPCODE : 4 bit 设置查询的种类,具体意义如下表所示
值 | 含义 |
---|---|
0 | 标准查询 |
1 | 反向查询 |
2 | 服务器状态查询 |
3-15 | 保留 |
AA :授权应答,在应答报文中代表这是一个从授权解析服务器中查询到的应答。
TC :截断,指出报文比允许的长度还要长,导致被截断。
RD :递归,请求时设置,期望DNS服务器进行递归的查询。
RA :递归可用,响应时服务器设置,表示本服务器是否支持递归。
Z :3 bit 预留位,设置为0
RCODE:3 bit 应答码,具体意义如下表
值 | 含义 |
---|---|
0 | 没有错误 |
1 | 报文格式错误 |
2 | 服务器错误,无法处理该请求 |
3 | 解析的域名错误 |
4 | 没有实现,域名服务器不支持该查询种类 |
5 | 拒绝,服务器因为某种策略拒绝给出应答 |
6-15 | 保留 |
QDCOUNT:表示报文请求段的数目,该请求包含几个问题
ANCOUNT:表示报文回答段的数目,该响应报文包含了几个问题的回答
NSCOUNT:表示包含的授权记录数
ARCOUNT:表示附加段记录数
1.2 Question格式
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Question包含了client向server提出的问题,
QNAME:包含请求的域名,格式为1字节长度加对应字节数据,举例来说若要查询www.baidu.com对应的IP,那么这个地方应该插入03 77 77 77(代表有3个字母,是www,自动以.分隔),05 62 61 69 64 75(代表baidu,以.分隔),之后 03 63 6f 6d(代表com)结尾处添加一个00表示QNAME结束。
QTYPE:表示查询类型,类型有如下
类型 | 值和含义 |
---|---|
A | 1 a host address |
NS | 2 an authoritative name server |
MD | 3 a mail destination (Obsolete – use MX) |
MF | 4 a mail forwarder (Obsolete – use MX) |
CNAME | 5 the canonical name for an alias |
SOA | 6 marks the start of a zone of authority |
MB | 7 a mailbox domain name (EXPERIMENTAL) |
MG | 8 a mail group member (EXPERIMENTAL) |
MR | 9 a mail rename domain name (EXPERIMENTAL) |
NULL | 10 a null RR (EXPERIMENTAL) |
WKS | 11 a well known service description |
PTR | 12 a domain name pointer |
HINFO | 13 host information |
MINFO | 14 mailbox or mail list information |
MX | 15 mail exchange |
TXT | 16 text strings |
AXFR | 252 A request for a transfer of an entire zone |
MAILB | 253 A request for mailbox-related records (MB, MG or MR) |
MAILA | 254 A request for mail agent RRs (Obsolete – see MX) |
* | 255 A request for all records |
QCLASS:表示查询的协议
类型 | 值和含义 |
---|---|
IN | 1 the Internet |
CS | 2 the CSNET class (Obsolete – used only for examples in some obsolete RFCs) |
CH | 3 the CHAOS class |
HS | 4 Hesiod [Dyer 87] |
常见的QTYPE为A,QCLASS为IN表示查询IP地址
1.3 Resource record格式
后三种报文,应答/授权/附加段统一格式,每种段包含的个数由头部对应的COUNT确定,资源计入格式如下:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ / // 记录包含的域名
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE | // 记录的类型
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS | // RDATA的类
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL | // 表示该记录能够进行缓存的时间,
| | // 0表示不能缓存
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH | // RDATA的长度
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA / // RDATA不定长数据,
/ / // 根据TYPE与CLASS指定含义
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
具体实例
本机ping www.baidu.com会先进行DNS请求,具体如下
响应报文如下
域名解析过程
从上到下依次进行查询,查到为止。
- 先在本地host文件中查找对应关系
- 若无则在本地DNS缓存是否存在这个关系
- 通过配置的TCP/IP中的DNS服务器进行查询
–> 假如由该DNS服务器解析:权威解析
–> 如果不由该DNS服务器解析,但该服务器缓存了映射关系:不具有权威性
在向DNS服务器进行查询过程中有两种模式:
递归模式: 假如DNS服务器不存在该地址,DNS服务器会向下一级DNS服务器进行询问,直到找到该地址或者确认无法找到,则向client返回该结果。
迭代模式: DNS服务器不存在该地址,向client返回下一级DNS服务器的地址,让client自己去进行查找。