【问题标题】:DNS Query StructureDNS 查询结构
【发布时间】:2009-11-23 21:29:22
【问题描述】:

当我向 DNS 发送 DNS 查询时,它会返回设置了格式位的标头。 表示格式存在问题,但我看不到它是什么。可能我误解了 RFC,或者误读了它,但现在我似乎无法解决它。

我发送的 DNS 结构在十六进制中如下所示。

Header

00 01   - ID = 1
01 00   - RD = 1
00 01   - QD = 1
00 00   - AN
00 00   - NS
00 00   - NR


   Question  for www.google.com

   03 77   - 3 w
   77 77   - w w
   06 67   - 6 g
   6f 6f   - o o
   67 6c   - g l
   65 03   - e 3
   63 6f   - c o
   6d 00   - m 0
   00 01   - QTYPE
   00 01   - QCLASS

然后我翻转任何两个字节的字段的字节,以转换为网络格式的大端序。所以每一行的表头,然后是 QTYPE 和 QCLASS ...

【问题讨论】:

  • 在wireshark中捕获您的流量可能会有所帮助。

标签: c sockets dns


【解决方案1】:

这是该查询数据包的逐字节十六进制转储应该是什么样子(经过测试并且可以正常工作!):

00000000  00 01 01 00 00 01 00 00  00 00 00 00 03 77 77 77  |.............www|
00000010  06 67 6f 6f 67 6c 65 03  63 6f 6d 00 00 01 00 01  |.google.com.....|

我认为您的问题是数据包的第三和第四字节(flagsrcode)是两个单字节字段,而不是一个 2 字节字段 - 看起来您可能将其视为16 位整数和交换字节?

【讨论】:

  • 对不起,我实际上看不出你的 hexdump 和我发送的内容之间的区别:S
  • 嗯,这个数据包确实有效——所以问题一定是你没有发送你认为你发送的东西。尝试使用 netcat 作为测试“服务器”将数据包捕获到磁盘并进行检查。
【解决方案2】:

要获得这些,您可以使用 netcat 和 dig。

# nc –uip 53 > dnsreqdump
# dig www.example.com @localhost
# nc –u 8.8.8.8 53 <dnsreqdump >dnsrespdump

现在您可以在 hexedit 或您最喜欢的十六进制编辑器中检查它们。

【讨论】:

    【解决方案3】:

    我倾向于认为您的问题取决于您实际上如何“翻转位以转换为网络格式”。

    典型的 C 库实现提供 htonl() function family 来执行从主机到网络顺序的转换,反之亦然。

    当然,没有看到代码,我不能确定这是问题所在。

    【讨论】:

    • 我用 C 语言编写它,在每个两个字节的字段上使用 htons()。但是我没有在 QName 上使用它,因为我假设它将被逐字节读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2010-12-01
    • 2014-08-20
    相关资源
    最近更新 更多