代码之家  ›  专栏  ›  技术社区  ›  FreeMemory

如何使用“自有”昵称实现IRC服务器?

  •  3
  • FreeMemory  · 技术社区  · 16 年前

    最近,我一直在阅读IRC协议(RFC14592810-2813),我正在考虑实现我自己的服务器。

    我不一定要认真遵守IRC协议(毕竟我这样做是为了好玩),但我喜欢的一点是,网络可以透明地由多个服务器组成。

    关于协议或IRC规范,我有很多不喜欢的地方。第一个问题是昵称不属于自己。尽管存在nickserv这样的服务,但它们不是官方协议的一部分。上 其他 手,实现类似nickserv的东西 适当地 有点破坏了分发的目的(也就是说,有一个地方运行nickserv,还有一个数据存储)。

    我希望有一种方法可以在每台服务器上管理昵称。问题在于,如果有两个服务器有一些注册的昵称,然后它们链接起来,那么可能会发生冲突。

    有没有一种方法可以避免这种情况,而不使用一个中央数据存储?也就是说:有没有可能保持服务器的松散连接(这样它们每个都作为一个独立的实体存在,但也可以彼此连接)并保持昵称之间的唯一性?

    我知道这个问题很模糊,但我想不出更好的措辞。我在寻找更多的建议,而不是实际的是/不是答案。因此,如果有人对如何在保持服务器独立性的同时实现网络中昵称的唯一性有任何想法,我会感兴趣的。请注意,严格遵守IRC协议一点也不必要;我可以根据自己的目的改变事情。:)

    5 回复  |  直到 16 年前
        1
  •  3
  •   mipadi    16 年前

    有一个简单的解决方案 如果 你不在乎 严格地 实现一个IRC服务器,而不是实现一个分布式消息系统, 喜欢 IRC,但不是 确切地 IRC。

    简单的解决方案是使用昵称的形式“nick@host”,很像电子邮件。因此,我的绰号不是“mipadi”,而是“mipadi@free memorys server.net”。所以我只注册你的服务器,但是当你的服务器与其他人连接形成另一个大的OLE聊天网络时,你可以很容易地将所有的用户名联合在一起。在otherserver.net上可能有一个“mipadi”,但是我们的昵称变成了“mipadi@free-memorys-server.net”和“mipadi@otherserver.net”,一切都很酷。

    当然,这与IRC有很大的不同。:)

        2
  •  0
  •   user54650    16 年前

    他们必须互相了解。如果没有,就不能阻止共享昵称。如果是,您只需在后端传输更新。为了防止同时注册,您需要一个事务系统来阻止、请求所有其他服务器的权限并作出响应。

    为了防止在停机期间同时注册,您别无选择,只能对注册进行时间戳,并删除除最后一个(或真正同时删除的一个随机)注册的尼克副本以外的所有副本。

    考虑到这些服务器最初并没有合并,这不是很好。

        3
  •  0
  •   Joachim Sauer    16 年前

    你仍然可以在没有中心实例的情况下实现nick所有权, 如果 您的服务器实例相互信任。

    • 当用户注册一个nick时,它会注册到他所连接的当前服务器上。
    • 当服务器接收到它不知道的注册时,它会将该信息转发给所有其他还不知道的服务器(可能需要一个智能算法来避免网络垃圾邮件)。
    • 当一台服务器重新连接到另一台服务器时,它会尝试同步已注册的昵称列表,以及哪个服务器处理哪个昵称。
    • 如果在同步期间发生冲突,则使用旧的注册,而新的注册标记为无效

    如果您不能信任您的服务器,那么它将变得更加困难,因为服务器可以轻松地声明每个用户名,甚至为每个用户名声明最早的注册。

        4
  •  0
  •   Zoredache    16 年前

    由于您正试图想出一些新的想法,所以在服务器外部进行通信时,您会突然想到服务器的独特之处,它是昵称的一部分。因此,如果您想在其他服务器上向用户发送消息,您可能会得到类似于user@server的消息。

    如果不需要它们完全分离,您可能需要考虑创建某种类型的多主复制帐户数据库。其中,每个服务器都存储帐户数据库的完整副本,并且每个服务器都可以创建新帐户,这些帐户将尽可能复制到其他服务器。不过,有时你可能还得处理碰撞。

        5
  •  0
  •   Oli    16 年前

    尽管存在nickserv这样的服务,但它们不是官方协议的一部分。

    服务不是官方协议的一部分,因为它们与协议无关。他们是有权限的机器人。没有理由不能在每台服务器上运行一个服务器,但这确实会使它们更难维护。

    如果您沿着这条路径走下去,我可能会建议使用常用的“多主”数据库复制技术。如果收到一个写入(在您的情况下,创建或更新一个新用户等),它会将数据发送到所有其他节点。不过你得小心点。如果一个节点在其他节点得到更新时处于脱机状态,则需要知道在重新连接时重新同步。

    另一种方法是如上所述,但相反。数据只在需要时在节点之间交换。例如,如果一个用户试图登录一个没有数据的节点,它将查询其他节点并发出一个移动命令,以获取该节点的所有数据。这可能比复制版本的痛苦要小,但是如果有人在一个与包断开连接的节点上注册了一个重复的尼克,netsplits中可能会出现严重的问题。

    消除netsplit问题的一种技术是使聊天节点及其僵尸netsplit感知。当它们被拆分时,它们可能不允许任何写操作…但这可能会影响你的网络,如果你分割很多。

    你还得问问这有多安全。IRC网络节点的分布是为了提高性能,但它们并不“安全”。因此,服务机器人程序通常集中运行,以保持对其运行的最终控制。如果您分发了僵尸和远程节点,它们可能会访问整个用户数据库(取决于模型)。