J'ai vu la représentation textuelle d'une requête HTTP, mais à quoi ressemble une requête DNS? Où se trouve dans les données l'emplacement de l'URL que vous essayez de localiser? De plus, comment la réponse est-elle formatée?
Il s'agit d'un vidage brut de Wireshark d'une requête DNS.
La partie DNS commence par 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... ..
Et voici la répartition:
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)
Et la réponse, commençant à nouveau à 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
Panne:
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
Éditer:
Notez que si votre vraie question est "comment écrire un serveur DNS?", Alors il y a deux réponses appropriées:
Modifier (2):
La demande a été envoyée en utilisant Host
sur une boîte Linux:
Host www.google.com
Si vous êtes sous Windows, vous pouvez utiliser nslookup
nslookup www.google.com
La disposition des données de demande DNS est décrite dans RFC 1035 . Je pense qu'il est un peu inutile de copier le texte ici ...
Les requêtes et réponses DNS sont mieux examinées à l'aide d'un analyseur de protocole - Wireshark est un bon outil multiplateforme qui peut capturer et déconstruire les demandes et les réponses dans leurs différentes parties. Il y a une belle introduction à la structure des demandes et réponses DNS sur Firewall.cx ici .
Les demandes DNS contiennent des questions qui spécifient un nom (ou peut-être un champ de texte quelque peu arbitraire) et un type d'enregistrement - le contenu de la réponse variera selon le type. La plupart des demandes sont de simples recherches directes d'un nom de serveur à la recherche d'une adresse IP en réponse (Type A), mais certaines rechercheront plus d'informations sur les serveurs de noms eux-mêmes (Type NS), les enregistrements de messagerie (Type MX) et d'autres services (Type SRV qui renverra les noms, les ports, les poids et les priorités). Les réponses DNS contiennent des réponses à ces questions, éventuellement plusieurs si la demande l'exige et ne sont pas toujours des adresses IP.
Une autre clarification - DNS ne résout pas les URL - dans la plupart des scénarios impliquant des URL, DNS n'est utilisé que pour permettre au système côté client de trouver l'adresse IP de la partie serveur de l'URL, tout le reste est géré par d'autres protocoles.
Si vous pouvez accéder à une machine Linux, vous pouvez exécuter la commande Dig pour effectuer une recherche DNS. Cet utilitaire effectue une recherche et renvoie exactement la réponse du serveur de noms. Par exemple:
; <<>> 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
Tout ce qui commence par la section "HEADER" est ce qui est retourné par le serveur de noms. Je suppose que c'est ce que vous appelez le format de texte car ce n'est pas le format du paquet réel, mais c'est le texte qui est renvoyé.