2008-09-04 98 views
3

Joel's post on Copilot直接TCP/P2P中的IP连接应用程式

直接连接!我们一直都在做 我们所能做的一切,以确保 Fog Creek Copilot可以在任何 网络连接情况下连接,不管 有哪些防火墙或NAT。若要 发生这种情况,双方将向我们的服务器 出站连接, 代表它们中继流量。那么,在很多情况下,这不是 必要的。所以2.0版本的确很巧妙:它通过我们的 服务器设置了 的初始连接,因此您可以以100%的可靠性正确连接 。但是当 一旦你全部连通,它就悄悄地,在后台 ,寻找一种方式,以 作出直接连接。如果它不能, 没什么大不了的:你只需通过我们的服务器继续传送 。如果您可以直接建立 对等连接,则它将以无提示方式将您的数据转移到 直接连接上。你不会注意到 任何东西,除了可能更快的通讯。

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

回答

9

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

程序已经可以通过Joel的服务器彼此交谈,所以他们可以彼此交换信息和Joel的服务器。此外,Joel有他们的外部IP地址,他们给joel关于他们的内部IP地址的信息。

他们决定尝试这种打孔技术。计算机A使用B的外部IP地址启动与计算机B的TCP连接。它不会经过,但是它告诉A的路由器它需要允许来自给定端口上的B的输入分组。因为A的路由器打开了一个与B发送的端口/ IP组合相匹配的端口/ IP组合(这里有一些端口魔法 - 这不是微不足道的,但是可行的)。

B的路由器记得B在一个给定的端口和IP上发起了与A的连接,因此A的数据包现在也正确地流入B并通过其路由器。所以它实际上非常简单,但是实现具有细节,尤其是关于端口如何被赋予新的TCP连接,以及NAT路由器如何处理TCP请求以及它们如何映射到外部端口。这些细节是有趣而且困难的一点。

- 亚当

+0

因此,当A获得B的IP时,它是否打开一个新的套接字连接到B?或使用它用于连接到中央服务器的相同套接字?我希望后者不是这种情况,因为他们必须同步seq和ack数字。 – 2016-04-05 06:02:12

1

有一种名为“Hole Punching”的技术,可与“Cone”NAT(Cone是路由器的技术家族)很好地配合使用。这不是一个100%肯定的技术,今天,它在大约路由器80%的UDP上运行良好。

有图书馆的一些实现实现打孔:STUNwikipedia

1

我相信简单的说法是,他们放弃与服务器的连接,并与P2P连接代替它。

线沿线的东西:

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

如果建立了连接:

  1. 到副驾驶的服务器连接将被切断。
  2. 数据被转移到两台机器之间的直接(P2P)连接上。