DNS 协议

DNS 协议

DNS(Domain Name System,域名系统)报文的格式是 DNS 协议的核心部分,用于在客户端和服务器之间传递查询和响应信息。DNS 报文由固定长度的头部可变长度的主体组成。以下是 DNS 报文的详细格式说明:


DNS 报文结构

DNS 报文由以下部分组成:

  1. Header(头部):固定 12 字节,包含控制信息。

  2. Question(查询部分):可变长度,包含查询的域名和类型。

  3. Answer(回答部分):可变长度,包含查询的响应记录。

  4. Authority(授权部分):可变长度,包含授权服务器的记录。

  5. Additional(附加部分):可变长度,包含额外的相关信息。


1. Header(头部)

头部固定为 12 字节,包含以下字段:

字段名
长度(字节)
描述

Transaction ID

2

事务 ID,用于匹配查询和响应。

Flags

2

标志字段,包含控制信息(如查询/响应、操作码、状态码等)。

Questions

2

问题计数,表示查询部分的问题数量。

Answer RRs

2

回答资源记录数,表示回答部分的记录数量。

Authority RRs

2

授权资源记录数,表示授权部分的记录数量。

Additional RRs

2

附加资源记录数,表示附加部分的记录数量。

Flags 字段的详细结构

描述

QR

1 位,表示报文类型(0 = 查询,1 = 响应)。

Opcode

4 位,操作码(0 = 标准查询,1 = 反向查询,2 = 服务器状态请求)。

AA

1 位,授权回答(表示响应是否来自授权服务器)。

TC

1 位,截断标志(表示响应是否被截断)。

RD

1 位,递归期望(表示客户端是否希望服务器递归查询)。

RA

1 位,递归可用(表示服务器是否支持递归查询)。

Z

3 位,保留字段,必须为 0。

Rcode

4 位,响应码(0 = 无错误,1 = 格式错误,2 = 服务器失败,3 = 域名不存在等)。


2. Question(查询部分)

查询部分包含客户端查询的域名和类型。每个查询记录的格式如下:

字段名
长度(字节)
描述

QNAME

可变

查询的域名,使用标签序列表示(如 www.example.com)。

QTYPE

2

查询类型(如 A = 1,表示 IPv4 地址;AAAA = 28,表示 IPv6 地址)。

QCLASS

2

查询类(通常为 1,表示 Internet)。

QNAME 的编码规则

  • 域名被编码为一系列标签,每个标签以长度字节开头,后跟标签内容。

  • 0x00 结束。

  • 例如,www.example.com 编码为:

    3 w w w 7 e x a m p l e 3 c o m 0

3. Answer(回答部分)

回答部分包含 DNS 服务器返回的资源记录(RR)。每个资源记录的格式如下:

字段名
长度(字节)
描述

NAME

可变

资源记录的名称,通常与查询的域名相同。

TYPE

2

资源记录的类型(如 A = 1,AAAA = 28,CNAME = 5 等)。

CLASS

2

资源记录的类(通常为 1,表示 Internet)。

TTL

4

生存时间(Time to Live),表示记录的有效时间(秒)。

RDLENGTH

2

资源数据的长度。

RDATA

可变

资源数据(如 IP 地址、CNAME 等)。


4. Authority(授权部分)

授权部分包含授权服务器的资源记录,格式与回答部分相同。


5. Additional(附加部分)

附加部分包含额外的资源记录,格式与回答部分相同。


DNS 报文示例

以下是一个 DNS 查询报文的示例(十六进制表示):

Header:
00 01  # Transaction ID
01 00  # Flags (标准查询,递归期望)
00 01  # Questions = 1
00 00  # Answer RRs = 0
00 00  # Authority RRs = 0
00 00  # Additional RRs = 0

Question:
03 77 77 77 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00  # QNAME = www.example.com
00 01  # QTYPE = A (IPv4 地址)
00 01  # QCLASS = 1 (Internet)

DNS 响应报文示例

以下是一个 DNS 响应报文的示例(十六进制表示):

Header:
00 01  # Transaction ID
81 80  # Flags (响应,递归可用)
00 01  # Questions = 1
00 01  # Answer RRs = 1
00 00  # Authority RRs = 0
00 00  # Additional RRs = 0

Question:
03 77 77 77 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00  # QNAME = www.example.com
00 01  # QTYPE = A (IPv4 地址)
00 01  # QCLASS = 1 (Internet)

Answer:
c0 0c  # NAME = www.example.com (指针压缩)
00 01  # TYPE = A (IPv4 地址)
00 01  # CLASS = 1 (Internet)
00 00 0e 10  # TTL = 3600 秒
00 04  # RDLENGTH = 4
5d b8 d8 22  # RDATA = 93.184.216.34

总结

DNS 报文的格式包括:

  1. Header:固定 12 字节,包含控制信息。

  2. Question:查询的域名和类型。

  3. Answer:查询的响应记录。

  4. Authority:授权服务器的记录。

  5. Additional:额外的相关信息。

通过理解 DNS 报文的格式,可以更好地分析 DNS 通信过程,编写 DNS 解析工具,或进行网络流量分析。如果有进一步的问题,欢迎继续讨论!

+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
|          Header (12 bytes)                                                                                               |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| Transaction ID (2 bytes)      | Flags (2 bytes)               | Questions (2 bytes)           | Answer RRs (2 bytes)          |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| Authority RRs (2 bytes)       | Additional RRs (2 bytes)      |                                                                 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
|        Question (variable)                                                                                                |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| QNAME (variable)                                                                                                          |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| QTYPE (2 bytes)               | QCLASS (2 bytes)              |                                                                 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
|        Answer (variable)                                                                                                  |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| NAME (variable)                                                                                                           |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| TYPE (2 bytes)                | CLASS (2 bytes)               | TTL (4 bytes)                                                |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| RDLENGTH (2 bytes)            | RDATA (variable)                                                                           |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
|      Authority (variable)                                                                                                 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| NAME (variable)                                                                                                           |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| TYPE (2 bytes)                | CLASS (2 bytes)               | TTL (4 bytes)                                                |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| RDLENGTH (2 bytes)            | RDATA (variable)                                                                           |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
|      Additional (variable)                                                                                                |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| NAME (variable)                                                                                                           |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| TYPE (2 bytes)                | CLASS (2 bytes)               | TTL (4 bytes)                                                |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| RDLENGTH (2 bytes)            | RDATA (variable)                                                                           |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+

参考

rfc1035: DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION

最后更新于