Интернет имеет богатую концептуальную основу и множество интересных идей, которые позволяют ему функционировать так, как мы его знаем. Один из действительно крутых — DNS. До того, как он был изобретен, все пользователи Интернета — а их на тот момент, по общему признанию, было не так много — полагались на общий файл HOSTS.TXT, поддерживаемый Стэнфордским исследовательским институтом. Этот файл синхронизировался вручную через FTP, и по мере роста числа хостов росла скорость изменений и неосуществимость системы. В 1983 году Пол Мокапетрис решил найти долгосрочное решение проблемы и приступил к разработке и внедрению DNS. Свидетельством его гениальности является то, что его творение смогло масштабироваться от нескольких тысяч компьютеров до Интернета, каким мы его знаем сегодня.
С общей целью получить глубокое понимание DNS, сделать что-нибудь интересное с помощью Rust и избавиться от некоторых своих проблем, я изначально решил реализовать свой собственный DNS-сервер. Этот документ не является правдивой хроникой этого путешествия, а, скорее, его идеализированной версией, без всех обходных путей, которые я в конечном итоге выбрал. Мы постепенно внедрим полноценный DNS-сервер, начиная с первых принципов.
В каждой главе есть соответствующий образец, содержащий полный код до этого момента в руководстве, с именами от sample1.rs
до sample5.rs
. Их можно запустить, используя, в первой главе, cargo run --example sample1
.
read_qname
, которая позволяла вредоносному пакету запускать бесконечный цикл. Модернизировали код, чтобы он соответствовал текущим практикам ржавчины, и исправили различные неприятные недостатки.