如何生成DNS Wire Format?解析www.example.com对应编码的生成逻辑
解析DNS over HTTP中查询字符串的生成逻辑
你遇到的核心问题是:这个Base64字符串不是域名的直接编码,而是完整DNS查询报文的URL安全Base64编码。下面拆解生成逻辑:
一、DNS查询报文的基本结构
完整的DNS查询报文分为两部分:头部(12字节) + 问题段(域名+查询类型+查询类)。示例中的Base64字符串就是这两部分二进制数据的编码结果。
1. 头部结构(固定12字节)
示例头部的Base64是AAABAAABAAAAAAAA,对应二进制的核心字段:
- 事务ID(2字节):
0x0001(标识查询请求,可自定义) - 标志位(2字节):
0x0000(标准查询,无特殊标志) - 问题数(2字节):
0x0001(表示仅1个查询问题) - 回答数/授权数/附加数(各2字节):均为
0x0000(查询阶段无需返回这些内容)
2. 问题段结构
问题段包含三部分:编码后的域名、查询类型、查询类,示例中对应3d3dwdleGFtcGxlA2NvbQAAAQAB。
(1)域名的DNS特殊编码
DNS对域名的编码不是直接用点分隔,而是采用「长度前缀+标签内容」的格式,最后用0x00结尾:
- 拆分
www.example.com为三个标签:www、example、com - 每个标签前加1字节的长度值(十六进制):
www长度为3 →0x03,example长度为7 →0x07,com长度为3 →0x03 - 最后添加
0x00表示域名结束
最终编码后的域名二进制为:03 77 77 77 07 65 78 61 6D 70 6C 65 03 63 6F 6D 00
(注:终端解码时,长度前缀是不可打印字符,所以你看到的是wwwexamplecom)
(2)查询类型与查询类
- 查询类型:
0x0001(对应A记录,即IPv4地址查询) - 查询类:
0x0001(对应IN类,互联网标准地址)
这两部分共4字节,二进制为00 01 00 01。
二、完整生成流程
- 构造12字节的DNS查询头部,设置好事务ID、标志位和问题数
- 对目标域名进行DNS标签编码(长度前缀+标签+结束符)
- 追加查询类型和查询类的二进制数据
- 将整个二进制报文进行URL安全的Base64编码(替换
+为-、/为_,去掉末尾的=)
你直接Base64编码域名的方式忽略了DNS报文的头部结构和域名的特殊编码规则,所以结果和示例不符。
内容的提问来源于stack exchange,提问作者Bhakta Raghavan
相关产品推荐
相关产品推荐

