当我向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 ......
答案 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.....|
我认为你的问题是数据包的第三个和第四个字节(flags
和rcode
)是两个单字节字段,而不是一个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来执行从主机到网络顺序的转换,反之亦然。
当然,如果没有看到代码,我就不能确定这是问题所在。