Проектная лаборатория

Собственный DNS-сервер

0 / 8этапов пройдено

Этап 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 go

2. Откройте папку в IDE

cd ./my-dns-server

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage tz1

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста