DNS 协议
DNS 协议
DNS(Domain Name System,域名系统)报文的格式是 DNS 协议的核心部分,用于在客户端和服务器之间传递查询和响应信息。DNS 报文由固定长度的头部和可变长度的主体组成。以下是 DNS 报文的详细格式说明:
DNS 报文结构
DNS 报文由以下部分组成:
Header(头部):固定 12 字节,包含控制信息。
Question(查询部分):可变长度,包含查询的域名和类型。
Answer(回答部分):可变长度,包含查询的响应记录。
Authority(授权部分):可变长度,包含授权服务器的记录。
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 报文的格式包括:
Header:固定 12 字节,包含控制信息。
Question:查询的域名和类型。
Answer:查询的响应记录。
Authority:授权服务器的记录。
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) |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
参考
最后更新于