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

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

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

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

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

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

На этом этапе вы расширите DNS-сервер, чтобы он возвращал раздел вопросов — второй раздел DNS-сообщения.

Структура раздела вопросов

Раздел вопросов содержит список вопросов (обычно всего 1), которые отправитель хочет задать получателю. Этот раздел присутствует как в запросах, так и в ответах.

Каждый вопрос имеет следующую структуру:

  • Name: доменное имя в виде последовательности «меток» (подробнее ниже).
  • Type: 2-байтовое целое число; тип записи (1 для записи A, 5 для CNAME и т. д.; полный список — здесь).
  • Class: 2-байтовое целое число; обычно имеет значение 1 (полный список — здесь).

В разделе 4.1.2 RFC подробно описан формат раздела вопросов. В разделе 3.2 приведены дополнительные сведения о типе и классе.

Кодирование доменных имён

В DNS-пакетах доменные имена кодируются последовательностью меток.

Метки кодируются как <length><content>, где <length> — один байт, задающий длину метки, а <content> — её содержимое. Последовательность меток завершается нулевым байтом (\x00).

Например:

  • google.com кодируется как \x06google\x03com\x00 (в шестнадцатеричном виде: 06 67 6f 6f 67 6c 65 03 63 6f 6d 00).
    • \x06google — первая метка.
      • \x06 — один байт с длиной метки.
      • google — содержимое метки.
    • \x03com — вторая метка.
      • \x03 — один байт с длиной метки.
      • com — содержимое метки.
    • \x00 — нулевой байт, завершающий доменное имя.

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

./your_program.sh

Затем она отправит на порт 2053 UDP-пакет с DNS-запросом. Ваша программа должна отправить ответный DNS-пакет, содержащий описанный выше раздел вопросов (вместе с разделом заголовка из предыдущего этапа).

Ожидаемые значения раздела вопросов:

Поле Ожидаемое значение
Name \x0ccodecrafters\x02io, за которым следует нулевой байт (это codecrafters.io, закодированное последовательностью меток)
Type 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует типу записи «A»)
Class 1, закодированное как 2-байтовое целое число с порядком байтов big-endian (соответствует классу записи «IN»)

Не забудьте соответствующим образом обновить поле QDCOUNT в заголовке и установить идентификатор в 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 bf2

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

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

go / ЛОКАЛЬНО

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

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

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

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