Начнем с расшифровки, DNS расшифровывается Система Доменных Имен (Domain Name System). Часто люди сравнивают принцип работы DNS c «телефонной книгой», в которой каждому имени соответствует номер телефона, например запись в телефонной книге может быть следующей: «Маша Белова» — 721-55-31.
В системе DNS все происходит почти также, только вместо «имени» — указывается «доменное имя», а вместо телефона IP – адрес компьютера, например запись DNS может быть следующей:
«www.example.com» — 134.231.362.33
на самом деле все немного сложнее, мы еще вернемся к этому позднее.Для чего же вообще нужна вся эта система? Все очень просто, для того чтобы не хранить в памяти 10-12 численные номера, согласитесь example.com запоминается намного легче чем 134.231.362.33. В данный момент эта система широко используется и является важнейшим компонентом в функциональности интернета.
История.
Доменная система имен была изобретена Полом Макпэтрисом по просьбе Джона Постэла в 1983 году, он же и выполнил первую ее реализацию. В 1984 году 4 студента из Беркли – Дуглас Тэрри, Марк Пэинтер, Дэвид Риггл и Содни Зу написали первую UNIX реализацию, которую они назвали Интернет Сервер Доменных Имен Беркли (Berkeley Internet Name Domain Server или сокращенно BIND). В 1985 году код этой реализации был существенно переписан Кевином Данлэпом, а в 1990 она была портирована на Windows NT. На данный момент BIND является самым используемым DNS сервером в мире.
Теперь, когда мы уже имеем немножко представления о том, что такое DNS и зачем он нужен, давайте рассмотрим подробно как происходит перекодирование DNS-имени в IP-адрес.
Вся DNS система построена на технологии клиент-сервер. Это значит, что существуют DNS-сервера, которые ждут запросов от пользователей, и есть DNS-клиенты, которые эти запросы посылают. Во всех браузерах имеется встроенный DNS-клиент, который и ответственен за перекодирование DNS имени в IP-адрес. После того как вы набираете что либо в адресной строке и нажимаете enter у него появляется работа. Изначально он знает о доменном имени не больше чем вы, поэтому-то он и начинает спрашивать. Рассмотрим процедуру получение ip-адреса на основе доменного имени www.habrahabr.ru Вначале DNS-клиент разбивает имя, полученное от браузера, на насколько частей habrahabr.ru (домен 2го уровня) и .ru (домен 1го уровня). В клиенте находится список предопределенных корневых серверов (их всего 13) он обращается к одному из них с вопросом о том кто ответственен за домен 1-го уровня в данном случае «кто ответственен за зону .ru» и получает ответ например 194.85.105.17 , далее как можно догадаться он начинает спрашивать у сервера 194.85.105.17 кто ответственен за домен 2-го уровна в данном случае habrahabr.ru и получает ответ 212.158.166.234 это и есть IP-адрес Хабра. Эта процедура может продолжатся и дальше все зависит от того, какого уровня доменного имя.
Рассмотрим теперь тоже самое на практике, запросы будем производить через DNS – клиент DIG.
Можете попробовать сами на этом сайте, в верхнее поле нужно ввести доменное имя, IP-адрес которого вы хотите найти, в среднее имя DNS-сервера, с помощью которого вы хотите выполнить поиск, и в последнее, что вы хотите искать, если хотите посмотреть как происходил поиск подробно нужно еще отметить галочку Trace.
Также можно воспользоваться программой nslookup, которая доступна через командную строку, запрос нужно писать в формате nslookup habrahabr.ru.
Наберем в верхнее поле habrahabr.ru среднее оставим пустым в нижнем отметим что будем искать IP-адрес отметим галочку Trace и нажмем кнопку Look it up.
Вот что мы увидим далее (жирным отмечен найденый ip-адрес хабра):
; <<>> DiG 9.3.2 <<>> habrahabr.ru A +trace
;; global options: printcmd
. 408663 IN NS f.root-servers.net.
. 408663 IN NS g.root-servers.net.
. 408663 IN NS h.root-servers.net.
. 408663 IN NS i.root-servers.net.
. 408663 IN NS j.root-servers.net.
. 408663 IN NS k.root-servers.net.
. 408663 IN NS l.root-servers.net.
. 408663 IN NS m.root-servers.net.
. 408663 IN NS a.root-servers.net.
. 408663 IN NS b.root-servers.net.
. 408663 IN NS c.root-servers.net.
. 408663 IN NS d.root-servers.net.
. 408663 IN NS e.root-servers.net.
;; Received 228 bytes from 127.0.0.1#53(127.0.0.1) in 0 ms
ru. 172800 IN NS ns2.nic.fr.
ru. 172800 IN NS ns.ripn.net.
ru. 172800 IN NS f.dns.ripn.net.
ru. 172800 IN NS ns5.msk-ix.net.
ru. 172800 IN NS ns2.ripn.net.
ru. 172800 IN NS e.dns.ripn.net.
ru. 172800 IN NS ns9.ripn.net.
;; Received 456 bytes from 192.5.5.241#53(f.root-servers.net) in 123 ms
habrahabr.ru. 345600 IN NS ns1.habralab.ru.
habrahabr.ru. 345600 IN NS ns2.habralab.ru.
;; Received 119 bytes from 192.93.0.4#53(ns2.nic.fr) in 20 ms
habrahabr.ru. 7200 IN A 212.158.166.234
habrahabr.ru. 7200 IN NS ns2.habralab.ru.
habrahabr.ru. 7200 IN NS ns1.habralab.ru.
;; Received 123 bytes from 212.158.166.235#53(ns1.habralab.ru) in 53 ms
Давайте разберем подробнее, что все это значит. Прежде всего, что значит каждое из этих обозначений на примере случайной строки
ru. (1) 172800(2) IN NS(3) ns2.nic.fr.(4)
Итак первое поле это доменное имя, в данном случае это поле занимает значение ru, второе поле это TTL (Time To Live рус. Время жизни), его занимает число 172800 — это время в течении которого можно хранить эти данные в кэше, да dns-серверы используют кэширование и после того как вы найдете IP-адрес хабра он будет сохранен в кэше чтобы потом заново не производить поиск, а выдать сразу готовый результат. Третье поле тип ресурсной записи определяет вид ресурсной записи (Resource Record) т.е вид четвертого поля, в данный момент это поле занимает запись NS (NAME SERVER) и мы видим, что 4-е поле RR (Resource Record) имеет вид
f.root-servers.net, а если бы в третем поле было бы значение A то в поле Resource Record было бы уже 192.5.5.241 т.е указывался бы ip-адрес сервера а не его имя. Если хотите посмотреть какие еще бывают типы ресурсных записей перейдите по этой ссылке. Теперь давайте рассмотрим как происходил непосредственно наш поиск :
Вначале мы видим список тех 13 корневых серверов, о которых я упоминал раньше, и давайте сразу остановимся на том, почему доменное имя которое спрашивает DNS-клиент . а не ru, а это потому что формально клиенту нужно вначале запросить список корневых серверов чтобы затем у них спросить про зону ru. На самом деле нужно после каждого доменного имени в адресной строке браузера ставить точку т.е например так habrahabr.ru. или example.com., но ничего страшного не происходит если мы ее опускаем, так как DNS-клиент потом автоматически дописывает ее самостоятельно...
; <<>> DiG 9.3.2 <<>> habrahabr.ru A +trace
;; global options: printcmd
. 408663 IN NS f.root-servers.net.
. 408663 IN NS g.root-servers.net.
. 408663 IN NS h.root-servers.net.
. 408663 IN NS i.root-servers.net.
. 408663 IN NS j.root-servers.net.
. 408663 IN NS k.root-servers.net.
. 408663 IN NS l.root-servers.net.
. 408663 IN NS m.root-servers.net.
. 408663 IN NS a.root-servers.net.
. 408663 IN NS b.root-servers.net.
. 408663 IN NS c.root-servers.net.
. 408663 IN NS d.root-servers.net.
. 408663 IN NS e.root-servers.net.
Далее, судя по последней строке (она выделена жирным шрифтом), мы видим что клиент запросил информацию о зоне ru у сервера f .root-servers.net и мы видим что он выдал 7 серверов ответственных за зону ru (т.е из 13 корневых серверов к которым можно было обратится выбрал 6й, выбор как вы догадались, происходит случайным образом, и тот сервер который был выбран ставится верхним в списке) .
ru. 172800 IN NS ns2.nic.fr.
ru. 172800 IN NS ns.ripn.net.
ru. 172800 IN NS f.dns.ripn.net.
ru. 172800 IN NS ns5.msk-ix.net.
ru. 172800 IN NS ns2.ripn.net.
ru. 172800 IN NS e.dns.ripn.net.
ru. 172800 IN NS ns9.ripn.net.
;; Received 456 bytes from 192.5.5.241#53(f.root-servers.net) in 123 ms
Далее клиент спрашивает у ns2.nic.fr о домене habrahabr.ru получает ответ:
habrahabr.ru. 345600 IN NS ns1.habralab.ru.
habrahabr.ru. 345600 IN NS ns2.habralab.ru.
;; Received 119 bytes from 192.93.0.4#53(ns2.nic.fr) in 20 ms
И на конец спрашивая ns1.habralab.ru получает ip-адрес хабра 212.158.166.234 (заметьте какой вид теперь имеет поле типа ресурсной записи. А вместо NS).
habrahabr.ru. 7200 IN A 212.158.166.234
habrahabr.ru. 7200 IN NS ns2.habralab.ru.
habrahabr.ru. 7200 IN NS ns1.habralab.ru.
;; Received 123 bytes from 212.158.166.235#53(ns1.habralab.ru) in 53 ms
На этом я заканчиваю свое повествование о DNS надеюсь то, что написано выше легко читалось, и было интересно…
Обращаю внимание на то, что в статье были рассмотрены далеко не все тонкости функционирование DNS системы, упор делался на понятность и доступность.