Das Internet verfügt über ein reichhaltiges konzeptionelles Fundament mit vielen spannenden Ideen, die es ermöglichen, so zu funktionieren, wie wir es kennen. Eines der wirklich coolen ist DNS. Bevor es erfunden wurde, verließ sich jeder im Internet – zu diesem Zeitpunkt waren es zugegebenermaßen noch nicht so viele – auf eine gemeinsame Datei namens HOSTS.TXT, die vom Stanford Research Institute verwaltet wurde. Diese Datei wurde manuell über FTP synchronisiert, und mit zunehmender Anzahl an Hosts wuchs auch die Änderungsrate und die Undurchführbarkeit des Systems. Im Jahr 1983 machte sich Paul Mockapetris daran, eine langfristige Lösung für das Problem zu finden und entwarf und implementierte DNS. Es ist ein Beweis für sein Genie, dass seine Schöpfung von ein paar tausend Computern auf das Internet, wie wir es heute kennen, ausgeweitet werden konnte.
Mit dem gemeinsamen Ziel, ein tiefes Verständnis von DNS zu erlangen, etwas Interessantes mit Rust zu machen und einige meiner eigenen Probleme zu lindern, machte ich mich ursprünglich daran, meinen eigenen DNS-Server zu implementieren. Dieses Dokument ist keine wahrheitsgetreue Chronik dieser Reise, sondern vielmehr eine idealisierte Version davon, ohne alle Umwege, die ich letztendlich genommen habe. Wir werden nach und nach einen vollständigen DNS-Server implementieren, beginnend mit den Grundprinzipien.
Zu jedem Kapitel gibt es ein entsprechendes Beispiel mit den Namen sample1.rs
bis sample5.rs
, das den vollständigen Code bis zu diesem Punkt im Handbuch enthält. Diese können für das erste Kapitel mit cargo run --example sample1
ausgeführt werden.
read_qname
behoben, die es einem bösartigen Paket ermöglichte, eine Endlosschleife auszulösen. Der Code wurde modernisiert, um ihn an aktuelle Rostpraktiken anzupassen, und verschiedene hässliche Ineffizienzen wurden behoben.