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

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

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

Этап 05 · Основные этапы

Разбор раздела заголовка

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

До сих пор мы игнорировали содержимое полученного DNS-пакета и жёстко задавали идентификатор ответа равным 1234. На этом этапе вам нужно разобрать полученный DNS-пакет и вернуть ответ с тем же идентификатором. Кроме того, потребуется установить некоторые другие поля заголовка.

Как и на предыдущем этапе, тестирующая система запустит вашу программу следующим образом:

./your_program.sh

Затем она отправит на порт 2053 UDP-пакет с DNS-запросом.

Ваша программа должна отправить ответный DNS-пакет с заголовком, содержащим следующие значения:

Поле Размер Ожидаемое значение
Идентификатор пакета (ID) 16 бит Повторить 16-битный идентификатор из пакета запроса, отправленного тестирующей системой
Признак запроса/ответа (QR) 1 бит 1
Код операции (OPCODE) 4 бита Повторить значение OPCODE, отправленное тестирующей системой
Авторитетный ответ (AA) 1 бит 0
Усечение (TC) 1 бит 0
Запрошена рекурсия (RD) 1 бит Повторить значение RD, отправленное тестирующей системой
Рекурсия доступна (RA) 1 бит 0
Зарезервировано (Z) 3 бита 0
Код ответа (RCODE) 4 бита 0 (нет ошибки), если OPCODE равен 0 (стандартный запрос), иначе 4 (не реализовано)
Количество вопросов (QDCOUNT) 16 бит Любое допустимое значение
Количество записей ответов (ANCOUNT) 16 бит Любое допустимое значение
Количество записей полномочий (NSCOUNT) 16 бит Любое допустимое значение
Количество дополнительных записей (ARCOUNT) 16 бит Любое допустимое значение

Тестирующая система не проверяет содержимое после заголовка, если пакет в целом является корректным DNS-пакетом.

Примечание: ваш код по-прежнему должен проходить тесты предыдущих этапов. Больше не нужно жёстко задавать идентификатор запроса равным 1234, поскольку на предыдущих этапах тестирующая система отправляет идентификатор 1234. Если этот этап реализован правильно, тесты предыдущих этапов также должны проходить автоматически.

Проверка в вашей 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 uc8

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

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

go / ЛОКАЛЬНО

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

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

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

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