Эта статья предназначена для тех, кто уже шарит разбирается и имеет базовое представление о том, что же такое DNS, как он работает и понимает значение слов «резолвит», запрос, ответ и т.д. Итак, начнем!
Я буду описывать, а точнее, стараться описывать заголовок протокола DNS как можно более понятно для рядового пользователя, либо новичка, который хочет разобраться в структуре данного протокола.
- ID — данное поле используется как уникальный идентификатор транзакции. То бишь указывает на то, что пакет принадлежит одной и той же сессии «запросов-ответов» и занимает первое 2 байтовое слово.
- QR он же Query Response (1 бит) — данный бит служит для индентификации того, является ли пакет запросом (QR = 0) или ответом (QR = 1).
- Opcode (4 бита) — с помощью данного кода клиент может указать тип запроса, где обычное значение 0 — стандартный запрос, другие значения — это 1, то есть инверсный запрос, и 2 — запрос статуса сервера.
- AA (1 бит) — данное поле имеет смысл только в DNS-ответах от сервера и сообщает о том, является ли ответ авторитетным либо нет (Authority Answer).
- TC (1 бит) — данный флаг устанавливается в ответе от DNS-сервера, если оный не смог поместить всю информацию в UDP-дейтаграмму (Transaction).
- RD (1 бит) — он же Recursion Desired — этот однобитовый флаг устанавливается в запросе и копируется в ответ. Если он флаг устанавливается в запросе — это значит, что клиент просит сервер не сообщать ему промежуточных ответов, а вернуть только IP-адрес.
- RA (1 бит) — отправляется только в ответах, и сообщает о том, что сервер поддерживает рекурсию (RA = 1).
- Z (3 бита) — являются зарезервированными и всегда равны нулю.
- RCODE (4 бита) — это поле служит для уведомления клиентов о том, успешно ли выполнен запрос или с ошибкой.
RCODE = 0 — значит запрос прошел без ошибок;
RCODE = 1 — ошибка связана с тем, что сервер не смог понять форму запроса;
RCODE = 2 — эта ошибка с некорректной работой сервера имен;
RCODE = 3 — имя, которое разрешает клиент не существует в данном домене;
RCODE = 4 — сервер не может выполнить запрос данного типа;
RCODE = 5 — этот код означает, что сервер не может удовлетворить запроса клиента в силу административных ограничений безопасности.
Что же касательно секций DNS-запросов. Тот, кто знаком с командой dig в Linux могут узреть данные секций просто вписав в консоли что-то типа «dig <какое-нибудь доменное имя>» (у данной команды есть несколько ключей — это отдельная тема, поэтому, кому интересно — юзайте man dig). А от себя хочу просто расписать значения каждой секции из вывода:
Секции DNS-запросов
В общем и целом покопавшись в накопленных мной материалах, нашел очень интересную и понятную картинку:
Секция 1 — Question section — в этой секции DNS-клиент передает запросы DNS-серверу сообщая о том, для какого имени необходимо разрешить (зарезолвить) запись DNS, а также какого типа (NS, A, TXT и т.д.)
Секция 2 — Answer section — сервер сообщает клиенту ответ или несколько ответов на запрос, в котором сообщает вышеуказанные данные.
Секция 3 — Authoritative Section — эту секцию заполняет только DNS-сервер. Она содержит сведения о том, с помощью каких авторитетных серверов было получена информация включенная в секцию DNS-овтета.
Секция 4 — Additional Record Section — содержит информацию сопоставления IP-адресов с именами серверов ответственных за запрашиваемое доменное имя.
Что касается четырех полей «Number of ..» — эти 4 слова состоят из счетчиков, каждый из которых показывает кол-во записей в каждой секци DNS:
Number of Question Records — показывает количество записей в Question Section;
Number of Answer Records — в Answer Section;
Number of Authoritative Records — в Auth. Section, и Number of AR — в Additional Record соответственно.
Вот короткая информация о том, из чего состоит заголовок протокола DNS. Надеюсь данная статья была полезной, хоть и, возможно, «затертой до дыр». Однако повторение мать учения!
Автор: Леонид Якубович