DNS消息格式详解
本文最后更新于:2024年12月26日 下午
DNS消息格式规范 [RFC1035]
DNS(Domain Name System,域名系统)消息用于查询和应答域名解析服务,消息格式分为以下五个部分:
- Header(头部)
- Question(问题部分)
- Answer(回答部分)
- Authority(授权信息部分)
- Additional(附加信息部分)
1. Header(头部)
头部部分占用 12 字节,定义了消息的基础属性、状态以及数量信息。
Header字段解析:
缩写 | 全称 | 位数 | 描述 |
---|---|---|---|
ID | Identifier | 16bit | 查询或应答的唯一标识符,查询与应答的 ID 必须一致。 |
QR | Query/Response Flag | 1bit | 消息类型标识:0 为查询,1 为应答。 |
Opcode | Operation Code | 4bit | 查询操作码,表示查询类型:0 (标准查询),1 (反向查询),2 (状态请求)。 |
AA | Authoritative Answer Flag | 1bit | 指示应答是否由权威 DNS 服务器生成,1 为权威应答。 |
TC | Truncation Flag | 1bit | 指示消息是否被截断,1 表示消息过长被截断。 |
RD | Recursion Desired Flag | 1bit | 指示客户端是否需要递归查询,1 表示需要递归查询。 |
RA | Recursion Available Flag | 1bit | 指示服务器是否支持递归查询,1 表示支持。 |
Z | Reserved Flag | 3bit | 保留字段,必须为 0 。 |
Rcode | Response Code | 4bit | 应答码,表示查询结果状态:无错误(0 ),格式错误(1 ),服务器错误(2 )等。 |
计数字段(各占 16bit)
- QDCOUNT: Question 部分的条目数量。
- ANCOUNT: Answer 部分的资源记录数量。
- NSCOUNT: Authority 部分的资源记录数量。
- ARCOUNT: Additional 部分的资源记录数量。
2. Question(问题部分)
Question 部分包含查询的核心内容,定义了查询的目标域名和相关信息。
字段解析:
字段名称 | 描述 |
---|---|
QNAME | 查询的域名,采用标签(Label)形式表示。例如,www.example.com
表示为:3www7example3com0 。 |
QTYPE | 查询的记录类型(16bit):如 1 (A
记录),5 (CNAME 记录)。 |
QCLASS | 查询的类(16bit):如 1 (IN,表示 Internet 类)。 |
3. Answer / Authority / Additional(回答/授权信息/附加信息部分)
这三个部分都以资源记录(Resource Record, RR)的形式存储,结构相同。
RR字段解析:
字段名称 | 描述 |
---|---|
NAME | 与 Question 部分的 QNAME 类似,表示资源记录对应的域名。 |
TYPE | 记录类型(16bit):如 1 (A 记录),15 (MX
记录)。 |
CLASS | 记录的类(16bit):如 1 (IN,表示 Internet 类)。 |
TTL | 生存时间(32bit),以秒为单位,表示记录的缓存时间。 |
RDLENGTH | RDATA 的长度(16bit),以字节为单位。 |
RDATA | 资源数据,根据记录类型决定具体内容:例如 A 记录的 IPv4 地址(4 字节)。 |
4. 标志字段详细说明
缩写 | 描述 |
---|---|
QR | 消息类型:0 为查询,1 为应答。 |
Opcode | 查询操作类型:标准查询(0 )、反向查询(1 )、状态请求(2 )。 |
AA | 权威应答标志:1 表示应答来自权威服务器。 |
TC | 截断标志:1 表示消息长度超过限制被截断。 |
RD | 递归查询请求:1 表示客户端希望递归查询。 |
RA | 递归查询可用:1 表示服务器支持递归查询。 |
Z | 保留字段,必须为 0 。 |
Rcode | 应答代码,表示查询结果状态: |
0 - 无错误,1 - 格式错误,2 -
服务器失败,3 - 名字错误等。 |
5. 查询与应答流程
- 查询消息 包含 Header 和 Question 两部分:
- Header 中的 QR=0 表示查询。
- Question 中指定域名(QNAME)、记录类型(QTYPE)等信息。
- 应答消息 包含
Header、Question、Answer、Authority、Additional 五部分:
- Header 中的 QR=1 表示应答。
- Answer 部分包含查询结果。
- Authority 部分提供权威 DNS 服务器的信息。
- Additional 部分提供附加数据,如权威服务器的 IP 地址。
常见记录类型及描述
类型代码 | 名称 | 描述 |
---|---|---|
1 |
A | IPv4 地址记录。 |
5 |
CNAME | 别名记录。 |
15 |
MX | 邮件交换记录,指示邮件服务器优先级。 |
2 |
NS | 权威名称服务器记录。 |
28 |
AAAA | IPv6 地址记录。 |
通过这种统一的消息格式,DNS 系统实现了灵活、高效的域名解析功能。
DNS 协议总结
类别 | 优点 | 缺点 |
---|---|---|
传统 DNS | 速度快,实现广泛 | 传输透明,容易嗅探和审计 |
DoT | 基于 TCP + TLS 层,因为标准化比较早,支持相对广泛 | 默认端口可能是一个明显的特征。可能存在的 SNI 阻断(这个端口还阻断就过分了吧) |
DoH | 可以做强鉴权,而且隐藏于 HTTPS 流量中,特征不明显 | 基于 HTTPS,部署开销较大,而且首次响应速度较慢,不过借助于 keep-alive,之后速度较快。可能 SNI 阻断。 |
H3 | 使用 QUIC 协议,基于 UDP 传输,速度较快,性能较好 | 仍然基于 HTTPS,开销略大,会被 SNI 阻断,UDP QoS |
DoQ | 使用 QUIC 协议,基于 UDP 传输,速度最快(理论),最接近于传统 DNS 的速度 | 暂时没发现缺点,如果有的话,那就是 UDP QoS 以及可能存在的 SNI 阻断(这个端口还阻断就过分了吧) |
DNS消息格式详解
https://cdro.tech/notes/CS/dns-rfc/