关于C#:DNS查询结构

DNS Query Structure

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

我正在发送的DNS结构以十六进制形式显示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

然后,我翻转两个字节的任何字段的字节,以将其转换为网络格式的big endian。所以标题的每一行,然后是QTYPE和QCLASS ...


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

1
2
3
# nc a€"uip 53 > dnsreqdump
# dig www.example.com @localhost
# nc a€"u 8.8.8.8 53 <dnsreqdump >dnsrespdump

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


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

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


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

典型的C库实现提供htonl()函数家族,以执行从主机到网络顺序的转换,反之亦然。

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