Проектная лаборатория
Собственный DNS-сервер
Этап 04 · Основные этапы
Запись раздела ответов
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы расширите DNS-сервер, чтобы он возвращал раздел ответов — третий раздел DNS-сообщения.
Структура раздела ответов
Раздел ответов содержит список ресурсных записей RR (Resource Records), отвечающих на вопросы из раздела вопросов.
Каждая RR имеет следующую структуру:
| Поле | Тип | Описание |
|---|---|---|
| Name | Последовательность меток | Доменное имя, закодированное последовательностью меток. |
| Type | 2-байтовое целое число | 1 для записи A, 5 для CNAME и т. д.; полный список — здесь. |
| Class | 2-байтовое целое число | Обычно имеет значение 1 (полный список — здесь). |
| TTL (время жизни) | 4-байтовое целое число | Время в секундах, в течение которого запись можно хранить в кэше до повторного запроса. |
Длина (RDLENGTH) |
2-байтовое целое число | Длина поля RDATA в байтах. |
Данные (RDATA) |
Переменный | Данные, зависящие от типа записи. |
В разделе 3.2.1 RFC подробно описан формат раздела ответов.
На этом этапе мы будем работать только с записями типа «A», которые сопоставляют доменное имя IPv4-адресу. Поле RDATA записи типа «A» — это 4-байтовое целое число, представляющее IPv4-адрес.
Как и на предыдущем этапе, тестирующая система запустит вашу программу следующим образом:
./your_program.shЗатем она отправит на порт 2053 UDP-пакет с DNS-запросом.
Ваша программа должна отправить ответный DNS-пакет, содержащий:
- раздел заголовка (как на этапе №2);
- раздел вопросов (как на этапе №3);
- раздел ответов (новое на этом этапе!).
Раздел ответов должен содержать одну RR со следующими значениями:
| Поле | Ожидаемое значение |
|---|---|
| Name | \x0ccodecrafters\x02io, за которым следует нулевой байт (это codecrafters.io, закодированное последовательностью меток) |
| Type | 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует типу записи «A») |
| Class | 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует классу записи «IN») |
| TTL | Любое значение, закодированное как 4-байтовое целое число с порядком байтов big-endian. Например: 60. |
| Length | 4, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует длине поля RDATA) |
| Data | Любой IP-адрес, закодированный как 4-байтовое целое число с порядком байтов big-endian. Например: \x08\x08\x08\x08 (это 8.8.8.8, закодированный как 4-байтовое целое число) |
Не забудьте соответствующим образом обновить поле ANCOUNT в заголовке и установить идентификатор в 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 xm2Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.