Проектная лаборатория
Собственный DNS-сервер
Этап 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 go2. Откройте папку в IDE
cd ./my-dns-serverРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage uc8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.