Как я могу внедрить IRC-сервер с собственными псевдонимами? - PullRequest
3 голосов
/ 13 января 2009

Недавно я читал протокол IRC (RFC 1459, 2810-2813) и думал о реализации своего собственного сервера.

Я не обязательно тщательно следую протоколу IRC (в конце концов, я делаю это ради забавы), но мне нравится то, что сеть может состоять из нескольких серверов прозрачно.

Есть ряд вещей, которые мне не нравятся в протоколе или спецификации IRC. Во-первых, псевдонимы не принадлежат. Хотя такие сервисы, как NickServ, существуют, они не являются частью официального протокола. С другой стороны, другая реализация чего-то вроде NickServ должным образом отчасти отрицает цель распространения (т. Е. Было бы одно место, где работает NickServ, и одно хранилище для него).

Я надеялся, что найдется способ управлять псевдонимами для каждого сервера. Проблема в том, что если у вас есть два сервера с несколькими зарегистрированными псевдонимами, и они затем соединяются, вы можете столкнуться.

Есть ли способ избежать этого без использования одного центрального хранилища данных? То есть: возможно ли сохранить серверы свободно подключенными (так, чтобы каждый из них существовал как независимый объект, но также мог соединяться друг с другом) и поддерживать уникальность среди псевдонимов?

Я понимаю, что этот вопрос неопределенный, но я не могу придумать лучшего способа его формулировки. Я ищу больше предложений, чем реальных ответов да / нет. Поэтому, если у кого-то есть идеи относительно того, как добиться уникальности псевдонима в сети, сохраняя независимость от сервера, мне было бы интересно услышать это. Обратите внимание, что строго придерживаться протокола IRC вовсе не обязательно; У меня нет проблем с изменением вещей в соответствии с моими целями. :)

Ответы [ 5 ]

3 голосов
/ 13 января 2009

Существует простое решение , если вас не волнует строго реализация IRC-сервера, а скорее реализация системы распределенных сообщений, которая похожа на IRC, но не точно IRC.

Простое решение - использовать псевдонимы в форме "ник @ хост", очень похожие на электронную почту. Таким образом, вместо того, чтобы просто быть «мипади», мой псевдоним мог бы быть «mipadi@free-memorys-server.net». Поэтому я регистрируюсь только на вашем сервере, но когда ваш сервер соединяется с другими, чтобы сформировать еще одну большую чат-сеть, вы можете легко объединить все имена пользователей вместе. На otherserver.net может быть «mipadi», но тогда наши псевдонимы станут «mipadi@free-memorys-server.net» и «mipadi@otherserver.net», и все круто.

Конечно, это сильно отличается от IRC. :)

0 голосов
/ 13 января 2009

Хотя такие службы, как NickServ, существуют, они не являются частью официального протокола.

Сервисы не являются частью официального протокола, потому что они не имеют ничего общего с протоколом. Они боты с разрешениями. Нет никаких причин, по которым вы не можете запустить один на каждом сервере, но это усложняет их обслуживание.

Если бы вы пошли по этому пути, я бы, вероятно, предложил бы общепринятую технику репликации базы данных с несколькими хозяевами. Если кто-то получает запись (в вашем случае создается или обновляется новый пользователь и т. Д.), Он отправляет данные всем остальным узлам. Вы должны быть осторожны, хотя. Если один узел находится в автономном режиме, когда другие получают обновление, он должен знать, чтобы выполнить повторную синхронизацию при переподключении.

Другая техника будет такой же, как указано выше, но в обратном порядке. Данные обмениваются между узлами только тогда, когда это необходимо. Например, если пользователь пытается войти в систему на узле, для которого нет данных, он запросит других и выдаст команду на перемещение, чтобы получить все данные для этого одного узла. Это потенциально менее болезненно, чем версия репликации, но в netsplits могут возникнуть серьезные проблемы, если кто-то зарегистрирует узел, отсоединенный от пакета, для получения дублирующего ник.

Одной из техник, позволяющих свести на нет проблемы netsplits, было бы сделать узлы чата и их ботов осведомленными о netsplit. Когда они разделены, им, вероятно, не следует разрешать какие-либо действия записи ... Но это может повлиять на вашу сеть, если вы разделяете много.

Вы также должны спросить, насколько это может быть безопасным или нет. Узлы сети IRC распределены по производительности, но они не "безопасны". Из-за этого служебные боты обычно работают централизованно, чтобы полностью контролировать их работу. Если вы распространите ботов, и удаленный узел будет взломан, у них потенциально будет доступ ко всей базе данных пользователей (в зависимости от модели).

0 голосов
/ 13 января 2009

Поскольку вы пытаетесь придумать что-то новое, идея, которая приходит на ум, просто включает в себя нечто уникальное о сервере как часть псевдонима при общении вне сервера. Поэтому, если вы хотите отправить сообщение пользователю на другом сервере, у вас может быть что-то вроде user @ server

Если вам не нужно, чтобы они были полностью разделены, вы можете рассмотреть возможность создания некоторой базы данных учетных записей с несколькими основными репликаторами. Где каждый сервер хранит полную копию базы данных учетных записей, и каждый сервер может создавать новые учетные записи, которые будут реплицироваться на другие серверы, насколько это возможно. Возможно, вам все равно придется столкнуться с столкновениями.

0 голосов
/ 13 января 2009

Вы все еще можете реализовать никнейм без центрального экземпляра, , если экземпляры вашего сервера доверяют друг другу.

  • Когда пользователь регистрирует ник, он регистрируется на текущем сервере, к которому он подключен
  • Когда сервер получает регистрацию, о которой он не знает, он передает эту информацию всем другим серверам, которые еще не знают ее (может потребоваться умный алгоритм для предотвращения спама в сети)
  • Когда сервер повторно подключается к другому серверу, он пытается синхронизировать список зарегистрированных ников и какой сервер обрабатывает какой ник
  • Если во время этой синхронизации произошла коллизия, используется более старая регистрация, а новая помечается как недействительная

Если вы не можете доверять своим серверам, тогда это станет намного сложнее, поскольку серверы могут легко требовать каждое имя пользователя и даже запрашивать самую старую регистрацию для каждого.

0 голосов
/ 13 января 2009

Они должны знать друг друга. Если нет, вы не можете предотвратить совместное использование псевдонимов. Если они есть, вам просто нужно перенести обновления на сервер. Чтобы предотвратить одновременную регистрацию, вам нужна система транзакций, которая блокирует, запрашивает разрешение у всех других серверов и отвечает.

Чтобы предотвратить одновременную регистрацию во время отключений, у вас нет выбора, кроме как поставить отметку времени регистрации и удалить все, кроме последней (или случайной для действительно одновременной) зарегистрированной копии ник.

Это не очень красиво, учитывая, что эти серверы изначально не объединены.

...