1. 简介
+---------------------+
| Header |
+---------------------+
| Question | the question for the name server
+---------------------+
| Answer | RRs answering the question
+---------------------+
| Authority | RRs pointing toward an authority
+---------------------+
| Additional | RRs holding additional information
+---------------------+
如上可知,DNS消息主要由五部分组成:
- Header:消息头是固定的12字节
- Question:请求部分,变长
- Answer:响应部分,变长,
- Authority:指向权威的资源记录,变长
- Additional:附加信息的资源记录,变长
2. Header
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- ID:事务标识符
- QR:0表示请求消息;1表示响应消息
- Opcode:表示请求的类型
- 0:标准查询
- 1:反向查询
- 2:查询服务器状态
- 5:更新DNS域请求
- AA:仅在response中有效。表示响应的域名服务器是否为权威域名服务器。
- 1:表示权威域名服务器
- 0:表示非权威域名服务器
- TC:表示该消息是否被截断。若超过标准长度512字节,则被设置为1,表示消息被截断;否则未被截断
- RD:是否递归查询
- 1:表示域名服务器会递归查询域名(如果域名服务器支持递归查询则有效)
- RA:在响应消息中被设置。1表示域名服务器支持递归查询
- Z:保留待后续使用
- RCODE:仅在response中有效,表示response消息类型
- 0:成功响应
- 1:请求格式错误,DNS服务器无法解析
- 2:服务器错误
- 3:名字错误,仅在权威域名服务器response中有效
- 4:未实现,服务器不支持
- 5:拒绝
- QDCOUNT:表示请求消息的个数
- ANCOUNT:表示响应消息的个数
- NSCOUNT:表示权威域名服务器的资源个数
- ARCOUNT:表示附加信息的个数
3. Question
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- QNAME:请求的域名,变长,通过标签标识DNS名字(具体详情见下一章)
- QTYPE:表示查询类型,常见请求类型如下:
- 0x01:A记录
- 0x02:NS记录
- 0x05:CNAME记录(别名记录)
- 0x06:SOA记录
- 0x0C:PRT记录
- 0x21:SRV记录
- 0x26:AAAA记录
- QCLASS:表示查询类
- 1:Internet
- 2:CSNET
- 3:CHAOS
- 4:Hesiod
4. Answer
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- NAME:DNS名字,变长
- TYPE:表示响应的类型
- 0x01:A记录
- 0x02:NS记录
- 0x05:CNAME记录(别名记录)
- 0x06:SOA记录
- 0x0C:PRT记录
- 0x21:SRV记录
- 0x26:AAAA记录
- CLASS:表示响应类
- 1:Internet
- 2:CSNET
- 3:CHAOS
- 4:Hesiod
- TTL:表示该记录被服务器缓存的时间,即生命周期
- RDLENGTH:表示消息RDATA的长度
- RDATA:response的内容