You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成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。

二、完整生成流程

  1. 构造12字节的DNS查询头部,设置好事务ID、标志位和问题数
  2. 对目标域名进行DNS标签编码(长度前缀+标签+结束符)
  3. 追加查询类型和查询类的二进制数据
  4. 将整个二进制报文进行URL安全的Base64编码(替换+为-、/为_,去掉末尾的=)

你直接Base64编码域名的方式忽略了DNS报文的头部结构和域名的特殊编码规则,所以结果和示例不符。

内容的提问来源于stack exchange,提问作者Bhakta Raghavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:43:10