附加段与胶水记录
DNS 响应的附加段(Additional Section)用来携带与本次查询相关、但不在直接答案里的记录,最常见的用途是「胶水」:返回 NS 记录时把名字服务器的地址一起带上,返回 SRV 记录时把目标主机的地址一起带上。有了它,客户端不必再发一轮查询,解析总耗时会少一个往返。附加段缺失或未被使用,就会在抓包里看到额外的查询。
基本信息
| 抓包字段 | dns.count.additional 为附加段记录数,dns.additional 为具体记录 |
|---|---|
| 问题段字段 | dns.qry.name 为被查询的名字,dns.qry.type 为查询类型 |
| 常见携带场景 | NS 查询附带地址、SRV 查询附带目标地址、MX 查询附带邮件服务器地址 |
| 判读方向 | 先看响应带了几条附加记录,再看后续是否存在多余查询 |
| 不保证使用 | 附加段内容是提示性质,客户端可以忽略并自行再查 |
| 体积风险 | 附加记录多会推高响应体积,接近上限时有被截断的可能 |
典型使用场景
- 解析耗时分析:判断一次解析为什么产生两轮查询,是否因缺少胶水记录
- 服务发现排查:SRV 解析后客户端还要再查一次地址,影响服务启动速度
- DNS 服务器比对:不同递归服务器返回的附加段策略不同,影响客户端耗时
- 容量评估:附加记录多导致响应变大,评估 UDP 截断与切换 TCP 的概率
- 迁移验证:域名服务器变更后确认胶水记录仍然正确指向新地址
查看与统计
查看与统计
# 找出附加段非空的响应, 看被查询的名字与记录数
tshark -r a.pcap -Y 'dns.count.additional > 0' -T fields -e frame.number -e dns.qry.name -e dns.count.answers -e dns.count.additional | head -20
# 观察同一名字是否出现两轮查询(第一轮缺胶水的典型表现)
tshark -r a.pcap -Y 'dns.flags.response == 0' -T fields -e frame.number -e dns.qry.name -e dns.qry.type | head -30
tshark -r a.pcap -Y 'dns.qry.type == 33' -T fields -e frame.number -e dns.qry.name -e dns.count.additional # SRV 类查询记录类型与胶水作用
| 查询类型 | 典型附加记录 | 缺失后的表现 |
|---|---|---|
| NS | 名字服务器的地址记录 | 客户端或递归服务器需再查一次地址 |
| SRV | 目标主机地址 | 服务发现多一个往返, 启动变慢 |
| MX | 邮件服务器地址 | 投递路径解析多一轮查询 |
| CNAME 链 | 链上中间名字的记录 | 部分客户端需要逐级再查 |
| 普通 A/AAAA | 通常没有附加记录 | 属正常, 不必视为缺失 |
附加段里的内容不保证被客户端采用:不同解析库、不同操作系统的处理策略差别很大,判断「有没有起到减少往返的作用」要看后续是否真的又发了查询。
统计解析行为时如果只看问题段的记录数,会低估实际传输的记录量;涉及体积与截断风险的评估要连附加段一起算。