P2P应用程序中的直接TCP / IP连接
时间:2020-03-05 18:47:44 来源:igfitidea点击:
从Joel在Copilot上的帖子中:
Direct Connect! We’ve always done everything we can to make sure that Fog Creek Copilot can connect in any networking situation, no matter what firewalls or NATs are in place. To make this happen, both parties make outbound connections to our server, which relays traffic on their behalf. Well, in many cases, this isn’t necessary. So version 2.0 does something rather clever: it sets up the initial connection through our servers, so you get connected right away with 100% reliability. But then once you’re all connected, it quietly, in the background, looks for a way to make a direct connection. If it can’t, no big deal: you just keep relaying through our server. If you can make a direct peer-to-peer connection, it silently shifts your data onto the direct connection. You won’t notice anything except, probably, much faster communication.
他们如何将服务器连接更改为P2P连接?
解决方案
回答
有一种称为"打孔"的技术可与"圆锥" NAT很好地配合使用(圆锥是路由器的技术家族)。这不是100%可靠的技术,今天,它可以在大约80%的路由器上与UDP一起很好地工作。
有一些库的实现可以实现打孔:STUN(维基百科)
回答
这非常棘手且有趣。我确定我有一些细节错误,但是概述是这样的:
这些程序已经可以通过Joel的服务器相互通信,因此它们可以与Joel的服务器相互交换信息。此外,Joel具有其外部IP地址,并且它们提供有关其内部IP地址的joel信息。
他们决定尝试这种打孔技术。计算机A使用计算机B的外部IP地址启动与计算机B的TCP连接。它不会通过,但是它的作用是告诉A的路由器它需要允许在给定端口上从B传入的数据包。
计算机B做同样的事情,但是由于A的路由器打开了一个与B发送的端口/ IP组合相匹配的端口/ ip组合,因此它的消息传递到了A(这里发生了一些端口魔术,这很简单,但是可行)。
B的路由器记得B在给定的端口和IP上发起了与A的连接,因此A的数据包现在也正确地通过其路由器流入B。
因此,这实际上很简单,但是实现过程中有很多细节,尤其是有关如何将端口分配给新的TCP连接,NAT路由器通常如何处理TCP请求以及它们如何映射到外部端口的细节。这些细节是有趣且困难的。
-亚当
回答
我相信简单的版本是他们断开服务器连接,并用P2P连接代替它。
类似于以下内容:
- Machine1连接到副驾驶员的服务器。
- Machine1连接到副驾驶员的服务器。
- Machine1连接到副驾驶员的服务器。
- Machine2随后进行连接,并且它们开始屏幕共享。
- Machine2打开用于Machine1连接的端口。
- Machine1尝试连接到Machine2上现在打开的端口。
如果建立了此连接:
- 与副驾驶员服务器的连接已断开。
- 而是通过两台计算机之间的直接(P2P)连接传输数据。