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

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

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

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

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

cd ./my-dns-server

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

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

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

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

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

go / ЛОКАЛЬНО

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

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

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

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