来自Joel在Copilot的帖子:
直接联系!我们始终竭尽所能确保Fog Creek Copilot可以在任何网络环境中连接,无论防火墙或NAT到底是什么.为实现这一目标,双方都会与我们的服务器建立出站连接,该服务器代表他们转发流量.嗯,在许多情况下,这不是必要的.因此版本2.0做了一些相当聪明的事情:它通过我们的服务器建立初始连接,因此您可以立即获得100%可靠性的连接.但是,一旦你们全部连接起来,它就会在后台安静地寻找一种直接连接的方法.如果它不能,没什么大不了的:你只是通过我们的服务器继续中继.如果您可以建立直接的点对点连接,它会以静默方式将数据转移到直接连接上.
他们如何将服务器连接更改为P2P连接?
这很棘手有趣.我确定我有一些细节错了,但概述是这样的:
这些程序已经可以通过Joel的服务器相互通信,因此他们可以互相交换信息和Joel的服务器.此外,Joel拥有外部IP地址,并提供有关其内部IP地址的joel信息.
他们决定尝试这种打孔技术.计算机A使用B的外部IP地址启动与计算机B的TCP连接.它不会通过,但它的作用是告诉A的路由器它需要允许来自给定端口上的B的传入数据包.
计算机B做了同样的事情,但它的消息传到了A,因为A的路由器打开了一个与B发送的端口/ ip组合相匹配的端口(这里发生了一些端口魔法 - 这是非常重要的,但可行).
B的路由器记得B在给定的端口和IP上发起了与A的连接,因此A的数据包现在正好通过它们的路由器流入B.
所以它实际上非常直接,但实现有详细信息,特别是关于如何为新的TCP连接提供端口,以及NAT路由器通常如何处理TCP请求以及它们如何映射到外部端口.这些细节是有趣的,也是困难的.
-亚当