【问题标题】:How to properly format a raw DNS query?如何正确格式化原始 DNS 查询?
【发布时间】:2015-11-01 21:56:05
【问题描述】:

我正在创建一个 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 中突出显示,这意味着它很重要。我认为这意味着这些值是空终止的?那么关于类型和类的选项如下?

【问题讨论】:

    标签: dns network-programming


    【解决方案1】:

    当第 4.1.3 节提到“名称”时,它是在引用第 3.1 节中的定义,该定义指定域名由一系列标签组成,每个标签由一个长度规范八位字节和一个数字组成八位字节。最终标签始终是根区域,它的名称长度为零,因此仅包含一个长度为 0 的八位字节。所以,是的,整个名称以零八位字节结尾,但它不是通常 C 字符串意义上的“零结尾”。

    还要注意,只有长度字节中的低六位是长度数据,最高两位是标志。

    【讨论】:

    • 谢谢。我正在阅读规范,我看到了关于这两个标志的注释,但我不记得它是用于哪个部分的。这有助于解决问题;当时看3.1的时候还没有完全看懂。再次感谢。这肯定会有所帮助。我想我可以使用 size & ~(2^7+2^6) 来摆脱前两个前导位并获得大小。
    • @AlissaSquared - 这家伙给了你一个很好的答案,为什么不接受呢?
    • 很抱歉,我一定是在此期间修复了它,但没有收到通知电子邮件。是的,这是一个可行的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多