IRC中的最短路径如何保证?

Posted

技术标签:

【中文标题】IRC中的最短路径如何保证?【英文标题】:How is the shortest path in IRC ensured? 【发布时间】:2016-05-06 12:49:50 【问题描述】:

RFC 2810 对一对一的沟通说如下:

一对一的通信通常由客户执行, 因为大多数服务器到服务器的流量不是服务器通话的结果 只对彼此。为客户提供一种与每个人交谈的方式 其他,要求所有服务器都能够在沿着生成树的一个方向发送消息,以便到达任何 客户。因此,消息传递的路径是最短的 生成树上任意两点之间的路径。

(强调我的。)

这个“一个方向”是什么意思?只给一个客户?以及如何“到达任何客户端”并找到“任意两点 [IRC 网络上的主机] 之间的最短路径”? 为什么不简单地删除客户端的垃圾并存储 IP 地址,让 IP 完成它的工作呢?毕竟,IRC 是建立在 TCP/IP 之上的。

【问题讨论】:

【参考方案1】:

Johannes 提到了解决方案,但没有完全回答您的问题。然而,他是正确的,因为图论是答案的很大一部分。

因为EFnet和IRCnet的服务器映射中的每个子节点只有一个父节点,所以最短路径是图上两台服务器之间的only路径;如果没有回溯,同一顶点不能被访问两次。这称为生成树,所有节点都连接在一起,但不存在循环。

IRC 不一定是unicast,如 TCP/IP。它通过广播与不同服务器上的多个客户端进行通信。需要注意的重要一点是,客户端说“向#coding 上的每个人发送“嗨”,并且消息从客户端传输到连接的服务器。该服务器将消息传递给任何连接的服务器,然后这些服务器将其传递给订阅#coding 的任何客户端,然后再传递给任何连接的服务器。

没有真正意义上的“客户对客户”通信;一对一是通过向具有指定名称的用户发送消息来完成的;不是IP地址。 NickServs 有助于防止人们劫持姓名,并将昵称与 IP 临时关联,拒绝对其他 IP 地址进行身份验证,并在身份验证过期时使用密码保护昵称。

与发送频道消息的方式大致相同,用户向服务器发送消息“向@nicky 发送'hi'”,然后服务器简单地传递此消息,直到列出客户端@nicky作为连接到接收消息的服务器的客户端。 机器人为@nicky 提供了一种在离线时接收消息的方法;他们使用用户名登录。 编辑:IRC 实际上为客户与客户之间的交流打开了一个仅限邀请的个人频道。

本质上,最短路径保证是 IRC 广播策略的结果;消息在所需用户的服务器附近传播的那一刻,它被转发给所需的用户。如果服务器图表中有 个循环,则时间戳可能会阻止回显消息。

在架构部分,我们发现“生成树”的使用是正确的。服务器相互了解以便防止循环(保证最短路径)并有效连接:

6.1 可扩展性

人们普遍认为该协议无法扩展 在大型舞台上使用时足够好。主要问题来了 根据所有服务器都知道所有其他服务器的要求, 客户和渠道,并更新有关他们的信息 只要它发生变化。

下面这个是没有替代路径/弯路的结果

6.3 网络拥塞

另一个与可扩展性和可靠性问题相关的问题,如 以及生成树架构,是协议和 IRC 的架构非常容易受到网络拥塞的影响

IRC 网络设计为与 IP 无关,并遵循最短路径,因为消息会传播整个图,并在到达端点时停止。客户端和服务器有足够的信息来丢弃重复的广播。 IRC 是一个非常简单但有效的聊天协议,它不对安全性、IP 或硬件做任何假设。您实际上可以使用联网的电报机连接到 IRC。

【讨论】:

IRC 的服务器到服务器协议拒绝来自已经引入网络的服务器的连接,以及来自试图重新引入已经连接的服务器的服务器的连接,从而阻塞循环。紧急情况下的时间 - 因为服务器名称(或某些协议变体中的 SID)是一个必须全局唯一的密钥,行为不端的服务器可能会通过使用占位符服务器来占用它的名称而被锁定在网络之外,从而确保任何将该服务器引入网络的链接失败 - 一种称为“跳跃”服务器的技术。 另外值得注意的是,IRC 的生成树协议不保证最短路径,它保证当前建立的链接上的最短路径。这些链路可能以非最佳方式排列 - 例如,可以建立从北美到欧洲并返回的链路,这带来了管理挑战,因为运营商必须决定是否最好在一个更合乎逻辑的安排,从而暂时扰乱用户,或不理会这种情况,从而降低网络速度。 @Stephanie 这是一个很好的观察,但在这种情况下,我会为算法距离保留“短”这个词,为效率保留“最佳”这个词,为现实世界的距离保留“本地”。 你也可以得到在这方面不是最理想的链接——协议没有什么能阻止你创建比必要更长的链(当提供者同时运行一个专用的“集线器”时,这种情况经常发生" 和一个叶服务器 - 它们的集线器有时可能只用于将它们的“叶”连接到网络的其余部分,而它们的叶将只连接到 它们的集线器,从而为网络添加额外的跃点路径)【参考方案2】:

每个 IRC 服务器都连接到同一网络中的一个或多个服务器。客户端连接到其中一台服务器。假设我们有以下设置:

一个 / \ B C // \ D E F

假设服务器 A 上的客户端想要向服务器 E 上的用户发送消息。在这种情况下,服务器 A 只向服务器 C 发送一条消息,它会将这条消息发送给服务器 E,而不是发送给 F

如果 A 上的客户端向服务器 BE 上的用户发送消息到频道,则 A 会将消息发送到服务器 BCB将消息发送给该频道中连接到B的用户,C将消息发送给服务器E,它将消息发送给该频道中的客户端。

服务器 DF 永远不会看到该消息,因为该通道中没有人连接到它们,但 C 甚至会看到该消息如果该频道中没有人连接到 C,因为它必须将消息依赖于 E

【讨论】:

那么“一个方向”就意味着单播?但是,当 IP 为您提供这种非常单播的机制时,为什么还要重新发明***呢?你所描述的总是找到“最短路径”的原因是什么? 在处理发送到频道的消息时,它实际上是通过单播链接进行多播 - 服务器在每个方向上传递消息的单个副本,让用户通过在频道上“收听”,并且每个这些服务器将消息中继到该通道上直接连接的客户端。这使得 IRC 在可能存在瓶颈或高成本的链路上非常有效,例如跨洋或卫星链路 - 因为只有一个可能针对世界另一端的成百上千用户的消息副本必须遍历受限网络的一部分。

以上是关于IRC中的最短路径如何保证?的主要内容,如果未能解决你的问题,请参考以下文章

如何依次找到无向图的 前k k 条 最短路径

最短路径问题

干货最短路径问题

最短路径问题模型汇总

1091.二维矩阵中的最短路径

neo4j寻找节点间的最短路径