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. 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 查询报文的示例(十六进制表示):


DNS 响应报文示例

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


总结

DNS 报文的格式包括:

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

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

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

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

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

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

参考

rfc1035: DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION

最后更新于