Короткая история
В сентябре 2017 года в компании, где я работала, пошли разговоры о том, что планируется создание доменного регистратора. Как очень молодой специалист (20 лет и начало 3 курса бакалавриата), я быстро распознала в нём проект, который может дать мне проявить себя. И к моему счастью, то ли в меня настолько поверили, то ли проект не посчитали перспективным, но он достался именно мне, почти целиком и полностью. На момент начала работы я предполагала, что материала будет мало даже для бакалаврского диплома. Я никогда так не ошибалась. Всё, начиная от понимания схемы работы системы, до её проектирования и написания, заняло очень много времени. Было переосмыслено много теории по Сетям, паттернам проектирования и вообще о работе.
Что такое домен?
Думаю, очень многие представляют себе, что такое домен, или доменное имя. Это некоторое слово, которое заменяет настоящий адрес интернет-сервера. Например, "habr.com" - доменное имя, состоящее из домена верхнего уровня "com" и домена второго уровня "habr".
Каждой доменной зоной кто-то владеет и заведует. Доменная зона .com принадлежит компании Virisign (ранее Network Solutions). Это означает, что эта компания выдаёт разрешения на пользование доменами .com, в том числе habr.com. При покупке домена на год (в реальности аренде), запрос в конечном итоге уходит на сервера данной компании.
В данной статье мы будем рассматривать другую доменную зону - .ru и .рф. Администратором этих зон является Координационный центр национального домена сети Интернет. Это особый, национальный домен, и это накладывает некоторые ограничения на то, кто может покупать поддомены в этой области.
Доменные регистраторы
Если доменными зонами кто-то владеет, почему они не продают их людям? Потому что этим занимаются доменные регистраторы.
Доменный регистратор - посредник между пользователем и администратором зоны. Изучая этот вопрос, я нашла прекрасную документацию к чешской системе регистрации доменных имён FRED. И хотя она не дала полного представления о том, как должен работать доменный регистратор, тем не менее объяснила процесс в целом и то, как должна выглядеть система регистрации (в моей модели FRED - аналог координационного центра, я должна была направлять туда свои запросы).
На данной картинке доменный регистратор - человечек слева. Казалось бы, пара видов запросов и получение уведомлений.
Что касается российской системы - там тоже представлена документация, но сильно менее подробная и ориентированная на подготовленного пользователя.
Чтобы стать доменным регистратором, надо получить аккредитацию у администратора доменной зоны и пройти специальные технические испытания, доказывающие, что инструмент рабочий. После получения аккредитации компания появляется в списке аккредитованных регистраторов. Если это звание не подтвердить в течение определённого срока успешным прохождением технических испытаний, организация лишается аккредитации.
Профит
Выгоду от работы доменного регистратора можно получить очень даже хорошую. Дело в том, что все домены стоят одинаково при отдаче денег администратору доменной зоны - что vk.com, что mihail-petrovich-santehnik.ru, и стоят не много. Цены же у доменных регистраторов варьируются от 0 до миллионов рублей. Очевидно, если домен стоит 200 рублей, а за него взяли несколько миллионов, разница будет приятна. Однако это не деньги из воздуха.
Аукцион доменов
Многие хотят получить "красивое" доменное имя, ведь оно хорошо запоминается, что для бизнеса крайне важно. Например, "vk.com" является лакомым кусочком, ведь он состоит из двух символов. За короткие и красивые домены идёт борьба.
Как видим, желаемый bank.ru уже занят, а какой-то банк.рус (?) стоит уже 3млн. Домен bank.ru однажды освободится, и тогда на него будет много желающих.
Каждый месяц ТЦИ вывешивает список освобождающихся доменов. И в определённый час любой доменный регистратор может подать заявку на покупку освободившегося домена.
Если у вас один клиент, который хочет один домен, вы легко заполучите желаемое, отправив самым первым запрос на покупку. В данном случае успех операции зависит лишь от того, будет ли ещё какой-нибудь регистратор ломиться первым за данным доменом. Если нет - домен ваш.
Однако если у вас несколько клиентов и несколько доменов, задача усложняется. Вы сначала отправите запрос на покупку A.ru, потом cat.ru, и так далее. Шансы на успех покупки каждого последующего домена уменьшаются, так как кто-то мог поставить для себя покупку домена cat.ru первым приоритетом. Тогда этот домен достанется ему, а вы вернёте деньги покупателю и разочаруете его.
По этой причине нужно выстраивать приоритет покупок - какой домен из востребованных будет запрошен первым, какой вторым и так далее. Очевидный способ регулировать это - аукцион. Если пользователь предложит большое вознаграждение за товар, это будет наивысший приоритет для доменного регистратора.
Что касается высоких цен на свободные домены - их определяет исключительно спрос.
Взаимодействие с Системой регистрации
В упрощённом виде взаимодействие выглядит примерно так. Есть стандартный веб-сайт, через который пользователь может обращаться за услугами регистрации/продления/трансфера. Веб-сайт обращается к своим базам данных, чтобы не слишком нагружать сеть и запрашивать всё у регистратора, а также обращается к Системе регистрации, чтобы совершать операции по изменению объектов в реестре.
Регистратор отправляет запросы в реестр, используя EPP поверх TCP. Команды формируются с помощью XML. ПО Регистратора должно как составлять XML-запросы, так и иметь синтаксический анализатор XML для интерпретации ответов от Реестра. EPP в свою очередь функционирует только через аутентификацию Регистратора для безопасности, которая достигается путём использования TLS в шифровании сессии. Можно использовать как коммерческую, так и свободную реализацию TLS, например, OpenSSL.
Система также общается с банком, но данный момент будет упущен в статье для упрощения.
Объекты реестра
Основные объекты реестра - Контакт, Домен, Хост и Регистратор. Регистратор - это мы. Отправляя все запросы на покупки и регистрации, мы оставим там свой след - id своего регистратора.
Наиболее интересным объектом реестра является Домен. Он имеет свой жизненный цикл, и за операции с ним тратятся деньги.
Когда домен зарегистрирован, можно спокойно жить 11 месяцев. После чего есть время на продление без потери прав обладания, затем права теряются, однако домен ещё не освобождён, даётся шанс на его перепокупку. Если и этот шанс упущен - домен удаляется и становится доступным для всех желающих.
К счастью, Система регистрации отправляет уведомления регистратору о том, что скоро истекает срок регистрации, а регистратор в свою очередь напоминает об этом пользователю.
Также интересна операция трансфера домена от доменного регистратора. При попытке другого доменного регистратора забрать наш домен, генерируется специальный пароль, который пользователь должен ввести как в одном, так и в другом сервисе. Этим он подтверждает чистоту своих намерений.
Проектирование библиотеки
Registry
Взаимодействие со всей библиотекой происходит через класс-регистратуру. В ней создаются объекты для взаимодействия с любым классом системы. Конструктор реализован паттерном Singleton (Одиночка) для максимального переиспользования как объектов Домен/Контакт/Хост, так и для поддержания сохранности доменной зоны, id клиента, пароля, ssl-сертификата и его ключа, а также языка взаимодействия, объекта curl для отправки запросов.
В этом же классе реализованы функции для работы с XML. Реализация каждого из двух методов составила около 20 строк, что значительно легче готовых библиотек для работы с XML. Более того, это обеспечило гибкость – появилась возможность собственного представления вложенных структур для объектов, которые легко собираются в XML.
Registrar, Host, Domain, Contact
Основные классы реестра - прослойка логики между входом (регистратурой) и отправкой запросов. Тут выбирается метод, который необходимо вызвать у объекта, проверяются входные POST-параметры. Если параметры не валидные, выбрасывается исключение. Помимо данных методов в каждом классе хранятся регулярные выражения, которые не используют другие классы (например, флаги о закрытой информации для Контакта-организации, больше они нигде не нужны).
Poll
Поскольку, например, в случае трансфера домена, инициатором общения с Реестром становился он сам, был необходим также класс для обработки сообщений от него. Помимо данных сообщений Реестр может присылать сообщения об окончании срока регистрации или об удалении домена. Данные сообщения представляют собой очередь. Регистратор может получить только верхнее сообщение из очереди. Чтобы получить следующие сообщения, необходимо пометить прочитанным текущее.
R
Классы R (от англ. Regexp) – классы проверки, в основном на регулярных выражениях. В них проходит та самая валидация, которая вызывается в основных классах. Есть R в пространстве имён RU – это те функции и выражения, которые не понадобятся в других зонах. Например, номер телефона и ИНН (телефон в РФ особенный, ИНН существует только в РФ). R в пространстве имён Registrar будет применим ко всем будущим доменным зонам и к текущей.
Base
В базовых классах реализован логин в системе регистрации и сохранение сессии. Также тут генерируется XML со всеми необходимыми параметрами, поступившими из основных классов. Тут же получается ответ от системы и проверяется на успешность операции.
Хранение данных
Как упоминалось выше, все объекты пришлось хранить и у себя в системе для адекватной работы.
Данные хранятся в двух системах управления базами данных. Основная информация содержится в MariaDB. В ней хранятся все контакты, хосты и домены, а также ведётся журнал транзакций для отслеживания успешности всех процедур. Примечательным является то, что для хранения данных используется тип text, который на самом деле является типом JSON. По данному полю можно свободно совершать поиск без временных потерь, хоть данный тип оптимизирован не так хорошо, как в MySQL. Данное решение позволило увеличить гибкость хранимых данных и значительно ускорило скорость разработки.
В СУБД ClickHouse находятся логи всех операций. Регистратор обязан хранить все операции, совершённые им за весь период деятельности. Схема данной таблицы слишком проста, поэтому не будет тут представлена. Это тело запроса, ответа, время и пользователь. ClickHouse был выбран для данной задачи из-за высокой степени сжатия, которая не отнимает качества поиска.
Технические испытания
Технические испытания можно проходить, ещё не имея адекватной интерфейсной части. Проверяется способность регистратора реагировать на сообщения системы. На сайте ТЦИ находится пример тестов для технических испытаний. Это очень похоже на контрольную работу. В указанное время вы получаете задания, выполняете их, и система сама проверяет, правильно ли вы их выполнили.
Заключение
Проект был сдан вовремя, и сейчас успешно представлен на рынке. А благодаря талантливейшему дизайнеру, он ещё и самый красивый из всех ныне существующих.
Очень редкая компания в наши дни входит в эту игру. Ниша уже хорошо занята гигантами, и попасть в этот бизнес довольно-таки трудно. Однако я надеюсь, что скоро мы увидим всё новые компании, которые стали аккредитованными доменными регистраторами, и напишут для этого своё ПО. Моя же статья поможет им в начале этого нелёгкого пути.
Желаю удачи!
donpadlo
Хороший, почти без воды научпоп ;)
Sadie Автор
Спасибо!