0

0

DNS 查询的本质:理解 DNS 协议的二进制消息结构

碧海醫心

碧海醫心

发布时间:2026-01-10 11:59:38

|

948人浏览过

|

来源于php中文网

原创

dns 查询的本质:理解 dns 协议的二进制消息结构

dns 查询的本质:理解 dns 协议的二进制消息结构

DNS 协议工作在应用层,但与 HTTP 等文本协议截然不同——它不使用 ASCII 命令行语法,而是基于紧凑、定长+变长混合的二进制消息格式(定义于 RFC 1035)。这意味着你无法像发送 GET / HTTP/1.1 那样直接写出明文查询;相反,一个标准 DNS 查询是一个至少 12 字节的二进制数据包,由以下逻辑部分构成:

  • Header(12 字节):含事务 ID(2B)、标志位(2B,含 QR、Opcode、AA、TC、RD、RA 等)、问题数(2B)、回答数/授权数/附加数(各 2B);
  • Question Section(变长):包含查询域名(以“标签长度 + 标签”序列编码,如 google.com. 编码为 06google03com00)、查询类型(2B,如 A=1, AAAA=28, MX=15)、查询类(2B,通常为 IN=1)。

例如,查询 google.com 的 A 记录,其二进制 Question Section 并非 "google.com A",而是:

06 67 6f 6f 67 6c 65 03 63 6f 6d 00 00 01 00 01
↑───────── domain ─────────↑ ↑type=A↑ ↑class=IN↑
✅ 实践建议:在 Go 中开发 DNS 服务器,强烈推荐使用成熟的库(如 github.com/miekg/dns),而非手动拼接字节。它封装了完整的消息构建与解析逻辑,例如:
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn("google.com."), dns.TypeA)
m.RecursionDesired = true

// 序列化为二进制 []byte,可直接写入 UDP 连接
buf, err := m.Pack()
if err != nil { /* handle */ }

⚠️ 注意事项:

播记
播记

播客shownotes生成器 | 为播客创作者而生

下载
  • 域名必须以 FQDN 形式传递(末尾带点,如 "google.com."),否则库可能补全为相对域名;
  • DNS 默认使用 UDP 端口 53,单包大小限制为 512 字节(EDNS0 可扩展);
  • TCP 回退机制在响应超长或区域传输时启用;
  • 手动解析 Header 标志位需按位运算(如 msg.Header.Bits&0x8000 != 0 判断是否为响应)。

总结:DNS 查询是面向机器优化的二进制协议,其设计目标是高效、低开销和确定性解析。理解其结构是实现可靠 DNS 服务的基础,而借助专业库可避免底层字节错误,聚焦业务逻辑。

相关专题

更多
常见的编码方式
常见的编码方式

常见的编码方式有ASCII编码、Unicode编码、UTF-8编码、UTF-16编码、GBK编码等。想了解更多编码方式相关内容,可以阅读本专题下面的文章。

580

2023.10.24

a和A对应的ASCII码数值
a和A对应的ASCII码数值

a的ascii码是65,a的ascii码是97;ascii码表中,一个字母的大小写数值相差32,一般知道大写字母的ascii码数值,其对应的小写字母的ascii码数值就算出来了,是大写字母的ascii码数值“+32”。想了解更多相关的内容,可阅读本专题下面的相关文章。

2087

2024.10.24

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

321

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

398

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1512

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1901

2024.08.16

tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

118

2023.07.25

udp是什么协议
udp是什么协议

UDP是OSI参考模型中一种无连接的传输层协议。本专题为大家带来udp是什么协议的相关文章,免费提供给大家。

276

2023.08.08

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.6万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号