Проводя небольшой рефакторинг кода, свазаного с работой DNS, решил больше узнать о нем и поделиться со всеми полезной (или не очень) информацией.
DNS (Domain Name Service) - служба доменных имен. С ним (DNS) все сталкивались, но далеко не все знают как он работает и что может. В простейшем случае - это сервис, который переводит доменное имя в IP адрес, а вот что у него внутри - читайте ниже.
Как и большинство протоколов, DNS имеет свою спецификацию, описанную в RFC 1035 и RFC 1706.
DNS имеет иерархическую структуру:
Корневые DNS серверы (“.”, root name servers, http://en.wikipedia.org/wiki/Root_name_server) отвечают за информазию о доменах верхнего (1-го) уровня, таких как .com, .net, .info и так далее. За ними идут DNS серверы второго уровня, которые содержат информацию о доменах 2-го уровня (поддомены). И так далее по иерархии
Записи в DNS имеют разны значения и время жизни (TTL, time to live). TTL означает то, сколько времени будет храниться кеш об DNS записи, что-бы DNS-сервере не нужно было лишний раз образаться с запросом к вышестоящему DNS.
Поля DNS записей:
- NAME - собственно само доменное имя;
- TYPE - тип домена;
- CLASS - класс записи; в стандате RFC прописано, что DNS может работать не только в сетях по TCP/IP, класс записи определяет тип сети;
- RDLEN, RDATA - длина и формат с данными о домене.
Типы записей DNS (с чем чаще всего приходится работать):
- A record - определяет соответствие домена IP-адресу;
- AAAA - тоже самое, что и A, но для IPv6;
- CNAME - каноническое имя, alias домена, используется для редиректов на другое (под)домен;
- MX - mail exchage, указывает адреса серверов, которые отвечают за работу с email’ами для данного домена;
- PTR - pointer, нужен для обратных (reverse) DNS-запросов, которые по IP адресу возвращают FQDN.
Отдельно стоит сказать про FQDN - fullly qualified domain name, полное уникальное имя домена, включаещее также корневой домен и завершается точкой (“.”): blog.e0ne.info.
Если спуститься на уровень протокола, то формат сообщения между DNS сервером и клиентом выглядит так:
Идентификатор:
Запрос:
A:
T:
R:
V:
B:
RCode:
Счетчик вопросов:
Счетчик ответов:
Счетчик Authority:
Счетчик дополнений: