2009-11-23 118 views
2

當我向DNS發送DNS查詢時,它將返回格式位設置的標題。 指示格式有問題,但我無法看到它是什麼。它可能是我誤解了RFC,或誤解了它,但現在我似乎無法解決它。DNS查詢結構

我發送的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

在wireshark中捕獲您的流量可能會有幫助。 – Jason 2009-11-30 20:42:59

回答

0

我傾向於認爲你的問題取決於你如何實際「翻轉位轉換爲網絡格式」。

典型的C庫實現提供htonl()function family做從主機到網絡順序的轉換,反之亦然。

當然,沒有看到代碼,我不能確定這是問題所在。

+0

即時通訊編寫它在C,使用htons()每個字段是兩個字節。但即時通訊不使用它在QName作爲即時通訊假設將逐字節閱讀。 – Alistair 2009-11-23 22:30:32

1

下面是查詢報文的逐字節hexdump都應該是什麼樣子(測試工作!):

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位整數並交換字節?

+0

對不起,我實際上看不到你的hexdump和發送的內容之間的區別:S – Alistair 2009-11-24 18:16:06

+0

那麼,這個包肯定有效 - 所以問題一定是你沒有發出你認爲你發出的東西。嘗試使用netcat作爲測試「服務器」來將數據包捕獲到磁盤並對其進行檢查。 – caf 2009-11-24 23:59:08

1

爲了得到這些,你可以使用netcat並挖掘。

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

現在,您可以在hexedit或您最喜歡的十六進制編輯器中檢查它們。