【问题标题】:strange characters in DNS answerDNS 回答中的奇怪字符
【发布时间】:2019-10-19 19:43:54
【问题描述】:

我在 c 中找到了 DNS 客户端的示例: https://www.binarytides.com/dns-query-code-in-c-with-linux-sockets/ 而且我不了解函数 ReadName() 中的一件事。 *reader 是指向 DNS 应答开头的指针,URL 是我们希望找到的 IP 地址。 我不明白那里的条件:

if(*reader>=192)
{
    offset = (*reader)*256 + *(reader+1) - 49152; //49152 = 11000000 00000000 ;)
    reader = buffer + offset - 1;
    jumped = 1; //we have jumped to another location so counting wont go up!
}
else
{
    name[p++]=*reader;
}

当 URL 的某些字符大于 192 时,这意味着什么?我们到底在做什么(在条件下)? 谢谢!

【问题讨论】:

    标签: pointers url dns


    【解决方案1】:

    DNS 中没有“奇怪”字符。

    您展示的代码与指针以及名称在 DNS 数据包中的压缩方式有关。

    您需要阅读RFC 1035,特别是§4.1.4“消息压缩”。

    如果一个两字节序列以设置的前两位开始(即一个字节的十进制值 128 + 64 = 192),则其余部分是指向消息中存储名称的另一个位置的指针。

    这正是上面的代码所做的。

    【讨论】:

      【解决方案2】:

      我们希望找到的 IP 地址在哪里

      主机名(DNS 确实处理 URL)是从标准输入输入的,并且是 ngethostbyname 函数的参数。

      与 192 的比较与非 ASCII 域名有关。

      【讨论】:

      • 我不确定我是否理解。为什么和 192 有比较呢?
      • "与192比较与非ASCII域名有关。"绝对不!首先没有“非 ASCII 域名”,因为所有域名都以 LDH 方式用 Punycode 编码,所以在 DNS 数据包中所有域名都是 ASCII(除了 LDH 之外可以出现其他字符,DNS 是 8 位干净的,它是只是对于主机名,它是 LDH)。然后在 RFC 中解释了 192 的这个特定值(有关详细信息,请参阅我的答案);这与名称压缩和指针有关,并且可能发生在任何名称上,无论是否为 ASCII。
      猜你喜欢
      • 1970-01-01
      • 2019-07-05
      • 2017-07-04
      • 2018-03-11
      • 2019-07-27
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多