概述
根据规范,一个 DNS 包可以分为下面的几个部分。

其中,身份 ID 占 16 个位,标志符占 16 个位,下面的分别是请求数、回答数、权威域名服务器数、其他记录数,再下面一点的就是回答的内容了(请求、回答、权威域名服务器、其他记录)
可以对照下面这个 Wireshark 抓到的针对本站 imlonghao.com 的一次 DNS 请求进行理解

本博文主要讲述的是 DNS 包中的几个标志位
标志位
正如上面所提供的 Wireshark 的截图,我们可以看到一个名为 Flags 的栏目,这个就是我们今天要讲的标志位。
标志位总长 16 个位,也就是两个字符。
有相应值的位标记为 1,没有的则标记为 0。
最后这 16 个二进制的位通过进制转换即可变成十六进制的,在图中也就是 81 80
QR 1bit
0为客户端请求包1为服务器响应包
Opcode 4bits
0000为普通的 DNS 请求0001为 rDNS 请求0002为服务器状态0003无0004为通知 (Notify)0005为更新 (Update)0006 - 0015保留
AA 1bit
0为应答服务器不是该域名的权威解析服务器1为应答服务器是该域名的权威解析服务器
TC 1bit
0为报文未截断1为报文过长被截断 (只返回了前 512 个字节)
RD 1bit
0为不期望进行递归查询1为期望进行递归查询 (从域名服务器进行递归查询)
RA 1bit
0为应答服务器不支持递归查询1为应答服务器支持递归查询
Z 1bit
保留位
AD 1bit
0为应答服务器未验证了该查询相关的 DNSSEC 数字签名1为应答服务器已经验证了该查询相关的 DNSSEC 数字签名
CD 1bit
0为服务器已经进行了相关 DNSSEC 数字签名的验证1为服务器并未进行相关 DNSSEC 数字签名的验证
Rcode 4bits
0000为正常0001为格式错误 (NS 无法解析这个请求)0002为服务器错误 (NS 有问题所以无法进行这个请求)0003为名称错误 (请求中的地址并不存在)0004为未实施查询 (NS 服务器不支持这种查询)0005为拒绝 (由于策略原因拒绝执行这个错误)0006为域名出现了但是他不该出现0007为集合 RR 存在但是他不该存在0008为集合 RR 不存在但是他应该存在0009为服务器并不是这个区域的权威服务器0010为该名称并不包含在区域中0011 - 0015保留0016为错误的 OPT 版本或者 TSIG 签名无效0017为无法识别的密钥0018为签名不在时间范围内0019为错误的 TKEY 模式0020为重复的密钥名称0021为该算法不支持0022为错误的截断0023 - 3840保留3841 - 4095私人使用4096 - 65534保留65535RFC 6195
参考资料
DNS, Domain Name System - networksorcery.com
DNSSEC 原理、配置与布署简介 | 段海新 ( Haixin Duan ) @ Tsinghua University