DNS查询结构

时间:2009-11-23 21:29:22

标签: c sockets dns

当我向DNS发送DNS查询时,它会返回格式为bit set的标头。 表明格式存在问题,但我没看到它是什么。它可能我误解了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 ......

3 个答案:

答案 0 :(得分:1)

以下是该查询数据包的逐字节hexdump应该是什么样的(经过测试和工作!):<​​/ p>

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位整数并交换字节?

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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