概述
根据规范,一个 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
保留65535
RFC 6195
参考资料
DNS, Domain Name System - networksorcery.com
DNSSEC 原理、配置与布署简介 | 段海新( Haixin Duan ) @ Tsinghua University