4

来自Joel 在 Copilot 上的帖子

直接联系!我们总是尽我们所能确保 Fog Creek Copilot 可以在任何网络情况下连接,无论有什么防火墙或 NAT 就位。为了实现这一点,双方都与我们的服务器建立出站连接,该服务器代表他们中继流量。好吧,在许多情况下,这不是必需的。所以 2.0 版做了一些相当聪明的事情:它通过我们的服务器建立了初始连接,因此您可以立即以 100% 的可靠性连接。但是一旦你们都连接起来,它就会在后台悄悄地寻找一种直接连接的方法。如果不能,没什么大不了的:您只需继续通过我们的服务器进行中继。如果您可以建立直接的点对点连接,它会默默地将您的数据转移到直接连接上。

他们如何将服务器连接更改为 P2P 连接?

4

3 回答 3

10

这非常棘手和有趣。我确定我有一些细节错误,但概述是这样的:

这些程序已经可以通过 Joel 的服务器相互通信,因此它们可以相互交换信息以及与 Joel 的服务器交换信息。此外,Joel 有他们的外部 IP 地址,并且他们向 joel 提供有关其内部 IP 地址的信息。

他们决定尝试这种打孔技术。计算机 A 使用 B 的外部 IP 地址启动与计算机 B 的 TCP 连接。它不会通过,但它所做的是告诉 A 的路由器它需要允许在给定端口上来自 B 的传入数据包。

计算机 B 做同样的事情,但由于 A 的路由器打开了与 B 发送的内容相匹配的端口/IP 组合,因此它的消息通过了 A(这里发生了一些端口魔术 - 这不是微不足道的,但可行)。

B 的路由器记得 B 在给定的端口和 IP 上发起了与 A 的连接,因此 A 的数据包现在也正确地通过其路由器流入 B。

所以它实际上很简单,但是实现有细节,特别是关于如何为新的 TCP 连接提供端口,以及 NAT 路由器通常如何处理 TCP 请求以及它们如何映射到外部端口。这些细节是有趣且困难的一点。

-亚当

于 2008-09-04T17:26:12.340 回答
1

有一种称为“打孔”的技术可以很好地与“Cone” NAT(Cone 是路由器的技术家族)配合使用。这不是一个 100% 确定的技术,今天,它在大约 80% 的路由器上与 UDP 配合得很好。

有一些库实现打孔:STUN维基百科

于 2008-09-04T17:15:32.537 回答
1

我相信简单的版本是他们放弃服务器连接并用 P2P 连接替换它。

类似于以下内容:

  1. Machine1 连接到副驾驶的服务器。
  2. Machine1 连接到副驾驶的服务器。
  3. Machine1 连接到副驾驶的服务器。
  4. Machine2 随后连接,并开始屏幕共享。
  5. Machine2 打开一个供 Machine1 连接的端口。
  6. Machine1 尝试连接到 Machine2 上现在打开的端口。

如果建立此连接:

  1. 与副驾驶服务器的连接被切断。
  2. 相反,数据通过两台机器之间的直接 (P2P) 连接传输。
于 2008-09-04T17:33:20.013 回答