如何正确格式化原始 DNS 查询?

How to properly format a raw DNS query?

我正在创建一个 Lua 库来帮助处理发送和接收 DNS 请求,目前正在阅读 this(DNS 协议 RFC),但我不知道如何正确格式化要求。例如,我是否必须指定消息的长度?我该怎么做?

我了解到,从我的 Wireshark 检查中,我应该还包括之后的选项。我还在响应中看到 0x00;这是否意味着我只需在添加值之前简单地以零终止请求名称?

我具体说的部分是RFC的4.1.3。

一些注意事项:我用个人服务器对此进行了测试,并在查询部分获得了这些值:06 61 6c 69 73 73 61 04 69 6e 66 6f 0000 特别让我感兴趣,它在 WireShark 中突出显示,这意味着它很重要。我认为这意味着这些值是空终止的?然后是关于类型和 class 的选项?

当4.1.3节提到"NAME"时,它指的是3.1节中的定义,其中指定域名由一系列标签组成,每个标签由一个长度规范组成八位位组和一些八位位组。最后的标签总是根区域,它有一个零长度的名称,因此只包含一个长度为零的八位字节。所以,是的,整个名称以零八位字节结尾,但它不是通常的 C 字符串意义上的 "zero-terminated"。

另请注意,长度八位字节中只有低六位是长度数据,最高两位是标志。