Internet repose sur une base conceptuelle riche, avec de nombreuses idées passionnantes qui lui permettent de fonctionner tel que nous le connaissons. L’un des plus intéressants est le DNS. Avant son invention, tous les internautes – qui, certes, n'étaient pas très nombreux à ce stade – s'appuyaient sur un fichier partagé appelé HOSTS.TXT, géré par le Stanford Research Institute. Ce fichier était synchronisé manuellement via FTP, et à mesure que le nombre d'hôtes augmentait, le taux de changement et l'infaisabilité du système augmentaient également. En 1983, Paul Mockapetris a entrepris de trouver une solution à long terme au problème et a ensuite conçu et mis en œuvre le DNS. Le fait que sa création ait pu évoluer de quelques milliers d'ordinateurs jusqu'à Internet tel que nous le connaissons aujourd'hui témoigne de son génie.
Dans le but combiné d'acquérir une compréhension approfondie du DNS, de faire quelque chose d'intéressant avec Rust et de soulager certaines de mes propres démangeaisons, j'ai initialement décidé d'implémenter mon propre serveur DNS. Ce document n’est pas une chronique véridique de ce voyage, mais plutôt une version idéalisée de celui-ci, sans tous les détours que j’ai fini par faire. Nous mettrons progressivement en œuvre un serveur DNS complet, en partant des premiers principes.
Chaque chapitre a un exemple correspondant qui contient le code complet jusqu'à ce point dans le guide, nommé sample1.rs
à sample5.rs
. Ceux-ci peuvent être exécutés en utilisant, pour le premier chapitre, cargo run --example sample1
.
read_qname
qui permettait à un paquet malveillant de déclencher une boucle infinie. Modernisation du code pour se conformer aux pratiques actuelles en matière de rouille et correction de diverses inefficacités laides.