标志位是干什么的
DNS 报文头里的标志位是一组可独立读取的布尔量:QR 区分查询与响应,AA 表示答复来自权威服务器,TC 表示响应被截断,RD 是查询方期望递归,RA 是服务器声明自己提供递归,rcode 给出本次查询的结果码。把这几位串起来读,就能回答四个问题:谁在答、答得是否权威、回答是否完整、要不要换一个解析器。抓包里它们都以 dns.flags.* 字段暴露,可单独过滤。
基本信息
| 适用平台 | Wireshark / tshark,任何解析 DNS 的环境 |
|---|---|
| 字段前缀 | dns.flags.<name>,如 response、authoritative、truncated |
| 结果码 | dns.flags.rcode,0 成功 2 服务器失败 3 名字不存在 5 拒绝 |
| 典型端口 | UDP 53 与 TCP 53,组播 DNS 为 5353 |
典型使用场景
- 判断某个响应是缓存或转发给出的,还是权威服务器直接给出的
- 确认响应是否因尺寸超限被截断,避免按不完整内容下结论
- 识别只发查询不收回应的单向现象,用于定位链路过滤
- 排查「解析器不提供递归」类故障,看 RD 与 RA 的配对关系
- 按结果码快速分流失败原因,缩小到上游或本地策略
- 在 DNSSEC 相关故障中确认是否需要额外关注 DO 位
常用过滤
常用过滤
dns.flags.response == 0 # 只看查询
dns.flags.response == 1 # 只看响应
dns.flags.truncated == 1 # 被截断的响应
dns.flags.authoritative == 0 # 非权威答复(缓存或转发)
dns.flags.rcode == 3 # NXDOMAIN
dns.flags.rcode != 0 # 所有失败结果标志位逐位读法
| 标志位 | 含义 | 怎么用 |
|---|---|---|
| QR | 0 查询、1 响应 | 先分流再分析,避免把查询当答复读 |
| AA | 答复来自权威服务器 | 置 0 说明来自缓存或转发,不代表答案错误 |
| TC | 响应被截断 | 置 1 时内容可能只有部分记录,先别下结论 |
| RD | 查询方期望递归 | 常态为 1,客户端可据此要求解析器代为查询 |
| RA | 服务器提供递归 | RD 置 1 而 RA 置 0 说明对方不代查,需换解析器 |
| rcode | 结果码 | 非 0 时按码点分流,0 但答案段为空属于 NODATA |
AA 缺失本身不是故障信号:企业内网解析器通常转发上游答案,此时答复的权威性由上游决定,本地看到的 AA 自然为 0。
结果码为 0 但答案段为空的应答(NODATA)是常见形态,例如域名存在但没有所查类型的记录,不能一律当作成功。