1

私は、DNSメッセージを受信し、適切な回答に応答するプログラムを作成しています(Aレコードのみに応答する単純なDNSサーバー)。
しかし、メッセージを受信すると、1035RFCで説明されている形式とは異なります。
たとえば、これはnslookupによって生成されたDNSクエリです。

'\xe1\x0c\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x06google\x03com\x00\x00\x01\x00\x01'

1035 RFCで定義されているDNSヘッダーとビットについて知っていますが、なぜ16進数にする必要があるのですか?
それらを16進数またはそれらのutf-8に相当するものと見なす必要がありますか?
私の回答もこの形式にする必要がありますか?

4

1 に答える 1

7

生のバイナリリクエストであるため16進数で出力されますが、おそらく文字列として出力しようとしています。これは、印刷に使用している文字が印刷できない文字を表示する方法と思われます。それらを16進シーケンスとしてエスケープします。

これを「16進数」またはUTF-8とはまったく解釈しません。RFCで記述されているバイナリ形式を解釈する必要があります。使用している言語について言及すると、私(または他の誰か)がこのようなバイナリ形式でデータを処理する方法を説明できる場合があります。

それまでは、 RFC 1035を見て、クエリを手動で解釈する方法を見てみましょう。

The header contains the following fields:

                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                      ID                       |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    QDCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ANCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    NSCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                    ARCOUNT                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

各行には16ビットがあるため、12バイトになります。最初の12バイトをそこに入力してみましょう。

                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                   ID = e10c                   |  \xe1 \x0c
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    | 0|  Opcode=0 | 0| 0| 1| 0| Z=0    |  RCODE=0  |  \x01 \x00
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                  QDCOUNT = 1                  |  \x00 \x01
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                  ANCOUNT = 0                  |  \x00 \x00
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                  NSCOUNT = 0                  |  \x00 \x00
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                  ARCOUNT = 0                  |  \x00 \x00
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

それで。ID = e10c(クライアントがクエリを応答と照合できるように任意の数)のクエリがあります。QR= 0はクエリであることを示し、opcode = 0は標準クエリであることを示し、AAとTCは応答用です。RD = 1は、再帰が必要であることを示します(ローカルネームサーバーに対して再帰クエリを実行しています)。Zは将来の使用のために予約されており、RCODEは応答の応答コードです。QDCOUNT = 1は、質問が1つあることを示し、残りはすべて、応答内のさまざまなタイプのレコードの数です。

今、私たちは質問に行きます。それぞれの形式は次のとおりです。

                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                                               |
    /                     QNAME                     /
    /                                               /
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     QTYPE                     |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                     QCLASS                    |
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

QNAMEは、クエリの名前です。形式は、ラベルの長さを示す1オクテットで、その後にラベルが続き、長さが0のラベルで終了します。

だから私たちは持っています:

                                    1  1  1  1  1  1
      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |       LEN = 6         |           g           |  \x06 g
    |           o           |           o           |  o    o
    |           g           |           l           |  g    l
    |           e           |       LEN = 3         |  e    \x03
    |           c           |           o           |  c    o
    |           m           |       LEN = 0         |  m    \x00
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                   QTYPE = 1                   |  \x00 \x01
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    |                  QCLASS = 1                   |  \x00 \x01
    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

これは、検索している名前がgoogle.com(場合によっては、と記述されgoogle.com.、最後に空のラベルが明示されている)ことを示しています。QTYPE = 1はA(IPv4アドレス)レコードです。QCLASS = 1はIN(インターネット)クエリです。つまり、これはgoogle.comのIPv4アドレスを要求しています。

于 2012-11-14T04:38:00.043 に答える