Проектная лаборатория
Собственный DNS-сервер
Этап 02 · Основные этапы
Запись раздела заголовка
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
Все данные в протоколе DNS передаются в едином формате, называемом «сообщением». Каждое сообщение состоит из 5 разделов: заголовок, вопросы, ответы, полномочия и дополнительный раздел.
На этом этапе мы сосредоточимся на заголовке. Остальные разделы рассмотрим на следующих этапах.
Структура заголовка
Заголовок DNS-сообщения содержит следующие поля (в таблице также приведены значения, которые тестирующая система ожидает на этом этапе):
| Поле | Размер | Описание |
|---|---|---|
| Идентификатор пакета (ID) | 16 бит | Случайный идентификатор, присваиваемый пакету запроса. Пакет ответа должен содержать тот же идентификатор. Ожидаемое значение: 1234. |
| Признак запроса/ответа (QR) | 1 бит | 1 для пакета ответа, 0 для пакета запроса. Ожидаемое значение: 1. |
| Код операции (OPCODE) | 4 бита | Задаёт вид запроса в сообщении. Ожидаемое значение: 0. |
| Авторитетный ответ (AA) | 1 бит | 1, если отвечающий сервер «владеет» запрошенным доменом, то есть является авторитетным для него. Ожидаемое значение: 0. |
| Усечение (TC) | 1 бит | 1, если сообщение превышает 512 байт.Ожидаемое значение: 0. |
| Запрошена рекурсия (RD) | 1 бит | Отправитель устанавливает 1, если сервер должен рекурсивно разрешить запрос, иначе 0. Ожидаемое значение: 0. |
| Рекурсия доступна (RA) | 1 бит | Сервер устанавливает 1, чтобы сообщить о доступности рекурсии. Ожидаемое значение: 0. |
| Зарезервировано (Z) | 3 бита | Используется запросами DNSSEC. Изначально было зарезервировано для будущего использования. Ожидаемое значение: 0. |
| Код ответа (RCODE) | 4 бита | Код, обозначающий состояние ответа. Ожидаемое значение: 0 (нет ошибки). |
| Количество вопросов (QDCOUNT) | 16 бит | Количество вопросов в разделе вопросов. Ожидаемое значение: 0. |
| Количество записей ответов (ANCOUNT) | 16 бит | Количество записей в разделе ответов. Ожидаемое значение: 0. |
| Количество записей полномочий (NSCOUNT) | 16 бит | Количество записей в разделе полномочий. Ожидаемое значение: 0. |
| Количество дополнительных записей (ARCOUNT) | 16 бит | Количество записей в дополнительном разделе. Ожидаемое значение: 0. |
Длина заголовка всегда составляет 12 байт. Целые числа кодируются с порядком байтов big-endian.
Подробнее о полном формате DNS-пакета можно прочитать в Википедии или в RFC 1035. По этой ссылке находится хорошее руководство, подробно разбирающее формат DNS-пакета.
Тесты
Тестирующая система запустит вашу программу следующим образом:
$ ./your_program.shЗатем она отправит на порт 2053 UDP-пакет с DNS-запросом. Ваша программа должна отправить ответный DNS-пакет с описанным выше заголовком.
Рекомендуем создать в коде внутреннюю структуру для «DNS-сообщения»: на следующих этапах мы будем её развивать.
Примечание: в начале тестирования каждого этапа тестирующая система отправляет дополнительный пакет. Его можно игнорировать.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init dns-server ./my-dns-server --language go2. Откройте папку в IDE
cd ./my-dns-serverРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage tz1Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.