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

Joel’s post on 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连接?

最佳答案
这很棘手有趣.我确定我有一些细节错了,但概述是这样的:

这些程序已经可以通过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请求以及它们如何映射到外部端口.这些细节是有趣的,也是困难的.

-亚当

转载注明原文:网络 – P2P应用程序中的直接TCP / IP连接 - 代码日志