【问题标题】:NAT, P2P and MultiplayerNAT、P2P 和多人游戏
【发布时间】:2009-11-21 19:19:03
【问题描述】:

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

【问题讨论】:

    标签: p2p nat


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 对不起,我的意思是没有传入连接,谢谢,您的解决方案是一个完美的答案。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      netstat -a
      

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

      【讨论】:

      • UPNP 是 LAN 协议,而不是 WAN。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-05
        • 1970-01-01
        • 2014-09-17
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多