P2P应用程序中的直接TCP / IP连接

时间:2008-09-04 17:14:00

标签: networking tcp p2p

来自Joel's post on Copilot

  

直接连接!我们一直都这样做   我们可以确保的一切   Fog Creek Copilot可以连接任何   网络情况,无论如何   防火墙或NAT已到位。至   让双方都做到这一点   到我们服务器的出站连接,   代表他们转发流量。   嗯,在很多情况下,事实并非如此   必要。所以2.0版就可以了   一些相当聪明的东西:它成立了   通过我们的初始连接   服务器,所以你连接正确   100%可靠性。但是之后   一旦你全部连接起来,它就会安静地   在后台,寻找一种方法   直接连接。如果不能,   没什么大不了的:你只是继续传递   通过我们的服务器如果你可以做一个   它是直接的点对点连接   默默地将数据转移到   直接连接。你不会注意到   除了,可能,更快的任何事情   通信。

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

3 个答案:

答案 0 :(得分:9)

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

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

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

计算机B执行相同的操作,但是它的消息传递到A,因为A的路由器打开了一个与B发送的端口/ ip组合匹配的端口(这里发生了一些端口魔法 - 这是非常重要的,但可行)。 / p>

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

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

- 亚当

答案 1 :(得分:1)

有一种名为“Hole Punching”的技术适用于“锥形”NAT(Cone是路由器的技术家族)。这不是一种100%肯定的技术,今天,它在UDP的大约80%的路由器上运行良好。

有一些库的实现可以实现打孔:STUNwikipedia

答案 2 :(得分:1)

我认为简单的版本是他们删除服务器连接并用P2P连接替换它。

有些事情:

  1. Machine1连接到copilot的服务器。
  2. Machine1连接到copilot的服务器。
  3. Machine1连接到copilot的服务器。
  4. Machine2随后连接,并开始共享屏幕。
  5. Machine2打开一个用于Machine1连接的端口。
  6. Machine1尝试连接到Machine2上现在打开的端口。
  7. 如果建立了此连接:

    1. 与副驾驶服务器的连接被切断。
    2. 数据转而通过两台机器之间的直接(P2P)连接进行传输。