В этом билете необходимо будет реализовать сериализацию и десериализацию части пакета DNS.
В этом репозитории находится незавершенный исходный код примитивного DNS-сервера, который на все запросы должен отвечать NXDOMAIN (Non-eXistent Domain, домена не существует).
Этот DNS сервер работает с двумя типами DNS пакетов:
- query;
- response.
Первые 12 байт обоих этих пакетов занимает заголовок DNS header. Его структура в данном билете не важна, вся работа с заголовком уже реализована.
В DNS query и DNS response с NXDOMAIN далее идет секция переменной длины, называемая question. Если response является ответом на query, то эта секция должна в них быть одинакова.
Question состоит из 3 полей:
- name (доменное имя, переменная длина);
- type (2 байта);
- class (2 байта).
Основную сложность для сериализации/десериализации представляет поле name. Оно структурировано и разделено на поддомены. Длина каждого поддомена находится перед поддоменом. Завершается поле name нуль-терминатором.
Например, если клиент отправляет запрос на поиск домена "my.domain.ru", то в DNS question в поле name будут байты в следующей последовательности:
0x02 'm' 'y' 0x06 'd' 'o' 'm' 'a' 'i' 'n' 0x02 'r' 'u' 0x00
-
Проект не кроссплатформенный, соберется только под POSIX-совместимую операционную систему.
-
Сервер принимает только запросы с одним доменным именем.
Для сборки проекта выполните:
cmake -B build/
cmake --build build/Вручную проект можно протестировать в терминале.
Потребуется утилита dig (или любая утилита, способная
отправлять DNS запросы типа A на произвольный IP адрес и порт).
В одном окне терминала запустите сервер на каком-либо порту (в примере 9000):
./build/dns_server 5300
Listening on port 5300
...В другом окне терминала отправьте DNS запрос:
dig @127.0.0.1 -p 5300 my.cool.domain.ru A
;; Warning: Message parser reports malformed message packet.
; <<>> DiG 9.20.15 <<>> @127.0.0.1 -p 5300 my.cool.domain.ru A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: RESERVED12, id: 64404
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; Query time: 0 msec
;; SERVER: 127.0.0.1#5300(127.0.0.1) (UDP)
;; WHEN: Mon Jan 19 15:34:11 +05 2026
;; MSG SIZE rcvd: 12Поскольку в текущей реализации сервер незавершен, dig сообщает
o том, что ответный пакет испорчен.
В логах самого сервера добавились строки:
Processing query with:
Transaction ID: 64404
Number of Questions: 1
Question name:
Сервер корректно прочитал заголовок, определил идентификатор транзакции, количество questions и т.д. Но доменное имя из question он прочитать не смог.
Завершить работу обеих программ можно нажав Ctrl+C.
Что уже реализовано:
- разбор аргументов командной строки;
- UDP сервер (прием команд, отправка ответов);
- система сборки;
- сериализация и десериализация заголовка DNS пакета;
- подготовка DNS response с ответом NXDOMAIN.
Что нужно реализовать:
- десериализацию секции question из DNS query;
- сериализацию секции question из DNS response.
Места, где в коде нужно внести изменения, помечены комментариями TODO:
// TODO: добавьте сериализациюПо желанию можно написать юнит-тесты.