Demandant des enregistrements A et AAAA dans la requête DNS
Je suis en train de travailler sur une requête DNS mise en œuvre en C et souhaitez faire une demande à la fois A et AAAA (IPv4 et IPv6) les dossiers dans un seul paquet de requête, mais je ne reçois pas les réponses du serveur de noms quand j'ai mis les deux requêtes dans un paquet comme ça. J'ai essayé d'envoyer la requête à plusieurs serveurs de noms (à la fois locale et 8.8.8.8) avec pas de chance. Est-ce quelque chose qui ne fonctionne pas, ou est-il probable que mon paquet de requête est mal formé?
Mon algorithme de base pour l'ajout de la AAAA requête (à un existant, Un paquet de demande) est l'augmentation de la QDCOUNT champ dans l'en-tête de paquet, puis ajouter un RR de requête avec jeu de TYPE AAAA et le NOM comme un pointeur vers le nom d'hôte dans l'existant d'Une requête (octets 0xC0 0x0C pour un décalage de 12 octets à partir du début du paquet). Cela vous parait-il correct?
Pour info, tout fonctionne très bien avec juste Une requête dans le paquet.
Edit: Apparemment mes requêtes ont tous été légèrement mal formé (je n'étais pas au courant que les requêtes à la différence de réponses n'ont pas de TTL et RDLENGTH/RDATA champs). Lors de la fixation de ce, je suis de retour RCODE=1 erreur de format de réponses qui reconnaissent la présence des 2 requêtes. Est-ce à dire plusieurs requêtes par paquet sont tout simplement pas pris en charge?
Edit 2: Voici un hexdump de recherche pour www.google.com
:
d8 32 01 00 00 02 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 1c 00 01
Je ne vois rien de mal à cela.
- Ni ne Wireshark, qui est généralement un bon signe que vous avez lu la spec correctement.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas au courant de tout serveurs de noms qui prennent en charge plusieurs questions en une seule requête.
Il y a du potentiel pour l'ambiguïté d'une telle requête, car il y a par paquet de drapeaux (comme AA) qui pourrait s'appliquer à une seule des questions. Si vous demandez à deux questions et le serveur faisant autorité, pour un seul de ces domaines, si le serveur le drapeau ou pas? Je soupçonne que de telles questions ont dissuadé les réalisateurs.
Il y a eu un certain nombre de propositions pour résoudre le problème dont vous parlez (comme cette proposition visant à introduire un QTYPE qui combine A et AAAA, et Paul Vixie de répété les tentatives de d'introduire un EDNS forme de questions à choix multiples), mais à l'heure actuelle des programmes de soutien à la fois IPv4 et 6 ont tendance à effectuer deux requêtes distinctes, soit AAAA suivi (après un délai d'attente) par Un, ou les deux simultanément.
Je suppose qu'il y a aussi les "tous" QTYPE, mais il peut aussi revenir beaucoup plus de données que vous avez besoin.
Edit: à partir d'une requête.c dans la liaison source:
Edit: aussi, à partir de résolution.c dans la liaison source:
ANY
est que quand un talon de résolveurs envoie unANY
requête à un serveur récursif, le serveur n'a qu'à répondre avec ce qui est dans son cache à l'époque (bien qu'il va envoyer la requête en amont si il n'y a rien dans le cache). Si leA
est dans le cache, mais leAAAA
n'est pas le cas, vous obtenez seulement laA
.Tandis que le format de paquet techniquement prend en charge plus d'un enregistrement dans la section question (voir §4.1.2 de RFC 1035), dans la pratique, il ne fonctionne tout simplement pas, comme vous l'avez trouvé.
En particulier, personne n'a jamais réussi à définir la sémantique correcte pour quoi faire si les deux questions ont abouti à deux RCODEs.
J'ai essayé de définir ceux de la sémantique à l'IETF mais qui n'a pas obtenu de très loin.
Dans mon propre paquet DNS analyse de code que j'ai toujours rejeter des paquets.
A
etAAAA
les requêtes peuvent être compined dans un seul paquet, donc je suppose que votre paquet est toujours incorrect, d'une certaine façon, surtout en considérant que les requêtes ne pas utiliser les décalages dans les uns des autres données. Je voudrais vraiment de l'aide si vous pourriez montrer votre code, ou au moins les premières octets que vous envoyez.