【问题标题】:Communication between two computers without opening ports, using a third computer to set up the connection两台电脑不开放端口通讯,使用第三台电脑建立连接
【发布时间】:2011-11-11 18:23:41
【问题描述】:

假设我有一个服务器,有两个客户端连接到它。 (通过TCP,不过没关系)

我的目标是允许这两个客户端之间的直接连接。这是为了允许两个玩家之间直接语音联系,例如,或者他们可能安装的任何其他不需要服务器交互的客户端插件(比如在两者之间玩某种随机游戏)。服务器可以在那里帮助建立连接。

从黄昏的回答中,我得到了几条线索:

http://en.wikipedia.org/wiki/STUN 描述了执行此操作的算法,以及
http://en.wikipedia.org/wiki/UDP_hole_punching

从中,我得到了更多的线索:

http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html
http://nutss.gforge.cis.cornell.edu/stunt.php -- 一个使用 TCP 的可能 STUN 实现

随着时间的推移,我肯定可以为我的程序制定一些东西。目前我正在使用 C++ 和 TCP(Qt 套接字或 Boost 套接字),但如果需要,我不介意在 C 中使用 UDP 并包装它。

任何有 C 和 C++ 经验的程序员都可以通过链接到示例程序、更新的库或任何其他有用的信息来提供使这更容易的提示。一个记录在案的、灵活且有效的 C++ TCP 实现将是最好的,但我会接受我得到的!

【问题讨论】:

  • 临时端口用于响应向众所周知的服务端口(即 HTTP、FTP 等)上的服务器发出的请求。这样服务器知名服务端口在响应请求时不会被阻塞,并且可以接受新的连接。例如,当您打开 FTP 连接时,初始请求通过端口 20,服务器接受连接请求并启动一个进程以在另一个端口(临时端口)上处理该会话。如果所有会话都通过同一个端口,则一次只能有一个会话保持连接。
  • @Xint0:这不太准确。 HTTP 根本不涉及“临时端口”。连接由本地 ip、本地端口、远程 ip 和远程端口的唯一元组标识。只要远程 ip 或远程端口对于任何给定的不同连接对不同,就可以在单个本地 ip 和端口上容纳操作系统可以处理的尽可能多的连接。
  • @R.. 当我写 HTTP 时,我指的是端口号 80,它是 HTTP 服务器众所周知的服务端口。 HTTP 是应用层的协议。临时端口用于传输层(TCP、UDP 等)
  • 也许您可以澄清一下,但是当我阅读您的评论时,这是错误的。具体来说,“如果所有会话都通过同一个端口,则一次只能有一个会话保持连接”这句话。不是真的。
  • 另一个重要信息可能是用 TCP 套接字替换 UDP 套接字的可能性,如果路由器没有检测到并阻止它。

标签: c++ c p2p hole-punching


【解决方案1】:

有时/经常可以在 NAT 中打出 TCP 漏洞(这取决于 NAT 的行为)。这不是一个简单的学习主题,而是阅读 Practical JXTA II(可在 Scribd 上在线获得)中有关 NAT 遍历的相应章节,以了解要解决的问题的性质。

然后,阅读this。它来自写道:http://nutss.gforge.cis.cornell.edu/stunt.php(您问题中的链接之一)的人。

我不是 C/C++ 专家,但要解决的问题与语言无关。只要您可以从代码库访问 TCP,就足够了。请记住,实现 UDP 遍历比 TCP 更容易。

希望这些提示有所帮助。

P.S.:我不知道解决方案的 C/C++ 实现。康奈尔链接中提到的代码不经作者确认可操作。我试图自己恢复它,但他让我知道它完全是为了研究目的而调整的,远未准备好生产。

【讨论】:

    【解决方案2】:

    我不知道有什么方法可以可靠地穿透 TCP 防火墙,但是有一种用于 UDP 流量的类似方法,有很好的文档记录:

    【讨论】:

    • UDP 打孔是一种使用网络地址转换器在专用网络中的 Internet 主机之间建立双向 UDP 连接的方法。该技术不适用于所有场景或所有类型的 NAT,因为 NAT 操作特性未标准化。 ——就在现场!我会稍等一下,看看其他回复
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      您正在寻找用于 NAT 打孔的 会合服务器:可公开访问的服务器(不在 NAT/防火墙后面或已正确配置)以帮助 NAT/防火墙后面的计算机建立对等点对等连接。

      UDP 在 NAT 穿孔中更受欢迎,因为它提供的结果比 TCP 好得多。 UDP NAT打孔的清晰而翔实的描述可以找到here

      如果您需要可靠的通信,可以使用基于 UDP 的可靠协议:

      1. SCTP (libraries) - 标准化的,或
      2. 许多自定义协议之一,例如RakNet(我用过这个库,它非常成熟,功能丰富,并且有 NAT 打孔实现),Enetmany others (Q8)

      【讨论】:

        【解决方案5】:

        临时端口不会神奇地消除通过服务器进行中继的需要,因为它们仅在通过众所周知的服务端口打开的会话期间有效。基本上,临时端口依赖于服务器会话。

        您需要使用服务器来中继两个客户端之间的通信,即充当代理服务器。一种选择是通过 SSH 代理服务器设置 SSH 隧道,从而增加安全性。

        但这并不能保证防火墙不会阻止连接。这取决于防火墙类型和配置。大多数充当防火墙的住宅路由器默认阻止所有传入连接。这通常很好,因为大多数时候防火墙后面的计算机仅充当客户端,它们启动与外部的连接。而且这个设置会有所不同,因为有些限制只对众所周知的服务端口发起连接,如 HTTP、HTTPS、FTP、SFTP、SSH 等,如果您的代理服务器使用非知名服务端口,那么连接将是被屏蔽了。

        但也可以设置防火墙来阻止传出流量,这在企业网络中最常见,甚至不允许直接连接到 Web 服务器并通过代理服务器路由所有内容,以控制资源使用。

        您也可以研究使用UPnP动态打开端口。

        【讨论】:

        • 谢谢,似乎临时端口不起作用。虽然我想知道临时端口是如何处理的,但如果服务器会话的建立或延续不是由操作系统直接管理而是由低级代码管理,那么就有希望找到一个允许对其进行调整的库。无论如何,duskwuff 的帖子证明它在 UDP 中是可能的,所以肯定有办法做到这一点,即使我需要更多地研究它,也许它没有使用临时端口。
        猜你喜欢
        • 1970-01-01
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多