HTTPリクエストのテキスト表現が何であるかを見てきましたが、DNSリクエストはどのように見えますか?データのどこに、検索しようとしているURLの場所がありますか?また、応答はどのようにフォーマットされますか?
これは、DNSクエリのWiresharkからの生のダンプです。
DNS部分は24 1aで始まります。
0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 ........ ......E.
0010 00 3c 51 e3 40 00 40 11 ea cb 7f 00 00 01 7f 00 .<Q.@.@. ........
0020 00 01 ec ed 00 35 00 28 fe 3b 24 1a 01 00 00 01 .....5.( .;$.....
0030 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c .......w ww.googl
0040 65 03 63 6f 6d 00 00 01 00 01 e.com... ..
そしてここに内訳があります:
Domain Name System (query)
[Response In: 1852]
Transaction ID: 0x241a
Flags: 0x0100 (Standard query)
0... .... .... .... = Response: Message is a query
.000 0... .... .... = Opcode: Standard query (0)
.... ..0. .... .... = Truncated: Message is not truncated
.... ...1 .... .... = Recursion desired: Do query recursively
.... .... .0.. .... = Z: reserved (0)
.... .... ...0 .... = Non-authenticated data OK: Non-authenticated data is unacceptable
Questions: 1
Answer RRs: 0
Authority RRs: 0
Additional RRs: 0
Queries
www.google.com: type A, class IN
Name: www.google.com
Type: A (Host address)
Class: IN (0x0001)
そして応答は、再び24 1aから始まります:
0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 ........ ......E.
0010 00 7a 00 00 40 00 40 11 3c 71 7f 00 00 01 7f 00 .z..@.@. <q......
0020 00 01 00 35 ec ed 00 66 fe 79 24 1a 81 80 00 01 ...5...f .y$.....
0030 00 03 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c .......w ww.googl
0040 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 05 00 01 e.com... ........
0050 00 05 28 39 00 12 03 77 77 77 01 6c 06 67 6f 6f ..(9...w ww.l.goo
0060 67 6c 65 03 63 6f 6d 00 c0 2c 00 01 00 01 00 00 gle.com. .,......
0070 00 e3 00 04 42 f9 59 63 c0 2c 00 01 00 01 00 00 ....B.Yc .,......
0080 00 e3 00 04 42 f9 59 68 ....B.Yh
壊す:
Domain Name System (response)
[Request In: 1851]
[Time: 0.000125000 seconds]
Transaction ID: 0x241a
Flags: 0x8180 (Standard query response, No error)
1... .... .... .... = Response: Message is a response
.000 0... .... .... = Opcode: Standard query (0)
.... .0.. .... .... = Authoritative: Server is not an authority for domain
.... ..0. .... .... = Truncated: Message is not truncated
.... ...1 .... .... = Recursion desired: Do query recursively
.... .... 1... .... = Recursion available: Server can do recursive queries
.... .... .0.. .... = Z: reserved (0)
.... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server
.... .... .... 0000 = Reply code: No error (0)
Questions: 1
Answer RRs: 3
Authority RRs: 0
Additional RRs: 0
Queries
www.google.com: type A, class IN
Name: www.google.com
Type: A (Host address)
Class: IN (0x0001)
Answers
www.google.com: type CNAME, class IN, cname www.l.google.com
Name: www.google.com
Type: CNAME (Canonical name for an alias)
Class: IN (0x0001)
Time to live: 3 days, 21 hours, 52 minutes, 57 seconds
Data length: 18
Primary name: www.l.google.com
www.l.google.com: type A, class IN, addr 66.249.89.99
Name: www.l.google.com
Type: A (Host address)
Class: IN (0x0001)
Time to live: 3 minutes, 47 seconds
Data length: 4
Addr: 66.249.89.99
www.l.google.com: type A, class IN, addr 66.249.89.104
Name: www.l.google.com
Type: A (Host address)
Class: IN (0x0001)
Time to live: 3 minutes, 47 seconds
Data length: 4
Addr: 66.249.89.104
編集:
あなたの本当の質問が「DNSサーバーをどのように書くのですか?」である場合、2つの適切な答えがあることに注意してください:
編集(2):
リクエストはLinuxボックスでHost
を使用して送信されました:
Host www.google.com
Windowsを使用している場合は、nslookup
を使用できます
nslookup www.google.com
DNS要求データのレイアウトは RFC 1035 で説明されています。ここにテキストをコピーするのは少し無意味だと思います...
DNSクエリと応答は、プロトコルアナライザーを使用して最もよく見ることができます。 Wireshark は、要求と応答をキャプチャしてさまざまな部分に分解できる優れたクロスプラットフォームツールです。 Firewall.cx here に、DNSリクエストとDNSレスポンスの構造に関する素晴らしい紹介があります。
DNSリクエストには、名前(または多分いくぶん任意のテキストフィールド)とレコードタイプを指定する質問が含まれています。応答の内容はタイプによって異なります。ほとんどのリクエストは、応答でIPアドレスを探すサーバー名の単純な直接検索(タイプA)ですが、ネームサーバー自体(タイプNS)、メールレコード(タイプMX)およびその他のサービス(タイプ名前、ポート、重み、優先度を返すSRV)。 DNS応答には、これらの質問への回答が含まれています。要求で必要な場合は、複数の回答が返される可能性があり、必ずしもIPアドレスだけではありません。
もう1つの明確化-DNSはURLを解決しない-URLを含むほとんどのシナリオでは、DNSはクライアント側システムがURLのサーバー部分のIPアドレスを見つけられるようにするためにのみ使用され、その他はすべて他のプロトコルによって処理されます。
Linuxマシンにアクセスできる場合は、 Dig コマンドを実行してDNSルックアップを実行できます。このユーティリティはルックアップを実行し、ネームサーバーが応答したものを正確に返します。例えば:
; <<>> Dig 9.6.1-P2 <<>> serverfault.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32383
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;serverfault.com. IN A
;; ANSWER SECTION:
serverfault.com. 55961 IN A 69.59.196.211
;; Query time: 21 msec
;; SERVER: 68.87.64.150#53(68.87.64.150)
;; WHEN: Sun Aug 22 09:21:35 2010
;; MSG SIZE rcvd: 49
「HEADER」セクションで始まるすべてのものは、ネームサーバーから返されるものです。これは実際のパケットの形式ではないため、テキスト形式と呼んでいますが、返されるのはテキストです。