0

如何设计一个应用程序,使两个对等方可以直接相互通信(假设双方都知道对方的 IP),但没有传出连接?也就是说,不会打开任何端口。例如,Bitorrent 就可以做到,但多人游戏(据我所知)需要端口转发。

4

4 回答 4

2

我不确定您所说的没有传出连接是什么意思,我会像其他人一样假设您没有传入连接(它们位于 NAT/FW/etc 后面)。

到目前为止提到的最常见的是UPNP,在这种情况下,它是一种协议,它允许您作为计算机与网关交谈并说转发我这个端口,因为我希望外面的人能够与我交谈。UPNP 也是为其他事物而设计的,但这是家庭网络的常见事物(实际上它是许多定义之一)。

如果您不拥有网络,还有更常见且稍微更可靠的方法。最常见的称为STUN,但如果我没记错的话,还有一些变体。基本上,您使用允许传入连接尝试和协调通信通道的第三方服务器。基本上,您所做的是向您的对等方发送一个 UDP 数据包,这将打开您的 NAT 以获得响应,但在您的对等方的 NAT 上被丢弃(因为尚不存在转发规则)。通过与中介的连接,他们被告知做同样的事情,现在打开他们的 NAT,并匹配你是 NAT 中的现有规则。现在可以进行通信了。它们是一个变体,它也允许 TCP/IP 连接,通过发送 SYN 和 SYN-ACK 消息并进行一些协调。

我链接到的 Wikipedia 文章具有指向这些协议的相关 rfc 的链接,以了解它们的工作原理。本质上归结为,没有一个简单的答案,因为这是一个非常以网络为中心的问题。

于 2009-11-21T20:20:43.100 回答
0

您需要网络中某处的“会面点”:参与者在某种“网关”处“会面”,并且所述“网关功能”负责转发。

至少这是一种方法:我不会尝试评论 Bittorrent 的细节......我相信你可以在谷歌上搜索链接。

于 2009-11-21T19:21:58.073 回答
0

UPNP 主要在最近几年处理这个问题,但需要打开端口是因为应用程序已被编码为侦听特定端口以获取响应。

1024 以下的端口被称为“已注册”,因为它们被分配了一个端口号,因为公司为此付费。这并不意味着您不能将端口 53 用于网络服务器或 SSH,只是大多数人在看到它时会认为他们正在处理 DNS。1024 以上的端口未注册,因此没有关联 - 您的 Web 浏览器,无论是 Internet Explorer/Firefox/等,正在使用未注册的端口将请求发送到端口 80 上的 StackOverflow 网络服务器。您可以使用:

netstat -a

..在 windows 主机上查看当前建立了哪些网络连接,包括所涉及的端口。

于 2009-11-21T19:30:11.080 回答
0

UPNP 可用于与路由器协商以打开端口并将其转发到您的应用程序。即使是 bit-torrent 也需要至少一个对等方有一个开放的端口来启用 p2p 连接。但是,两个对等点都不需要开放端口,因为它们都与同一个服务器(跟踪器)进行通信,这使它们可以协商并确定谁拥有开放端口。

另一种选择是互联网上某个地方的回声服务器/中继服务器,双方都信任,并让它中继所有流量。这个解决方案的“问题”是回显服务器需要有大量带宽来容纳所有连接的对等方,因为它中继所有流量而不是建立 p2p 连接。

查看 EchoWare: http: //www.echogent.com/tech.htm

于 2009-11-21T19:54:16.523 回答