【问题标题】:How to initiate direct connection between clients connected to a server如何在连接到服务器的客户端之间启动直接连接
【发布时间】:2013-05-24 14:19:39
【问题描述】:

假设我有一个服务器并且客户端连接到服务器。可以通过公共 ip 访问服务器。

我想“转发”连接,以便客户端可以直接相互连接,而不需要中间的服务器。

我根本不知道这是否可行,我自己也找不到办法。

其他假设:

  • 两个客户端都没有公共 IP,两个客户端都在 NAT 后面
  • 如有必要,可以启动更多连接

我正在寻找一个严格的软件解决方案,无需重新配置路由器、开放端口等。

我想实现这一点的原因是为了减少服务器上的负载。一旦两个客户端关联在一起,就没有真正的需要(除了技术客户端)继续使用服务器作为代理。直接客户端连接也将减少连接的延迟。

【问题讨论】:

    标签: networking tcp network-programming connection


    【解决方案1】:

    看看http://en.wikipedia.org/wiki/UDP_hole_punching。如果两台机器都没有公共 IP,并且您无法打开端口,并且您不希望所有数据都通过服务器,那么这可能是唯一的其他潜在选择。如果这对您不起作用,您可能会遇到所有通过服务器的数据。如果您可以设置端口转发,那将是一个更好的解决方案,那么只需使用服务器来交换 IP 和端口信息(因为它在建立连接时就存在)。

    【讨论】:

    • 我们将如何协商连接?假设客户端到服务器的连接具有很强的安全性,那么简单地在客户端之间交换 IP 地址和端口来建立连接似乎违反了安全规范。是否有一种协议可以让客户端使用通过服务器交换的秘密来协商连接?还是我们必须自己实现?
    【解决方案2】:

    简短的回答是:不可能。

    主要问题之一是路由器不知道将来自服务器(或其他客户端)的请求重定向到哪里。只是一个案例:您有一个路由器,它后面有多个设备(计算机,手机......)。它得到一个请求,但不知道,谁想得到这个请求。

    有一种解决方法,但它不可靠(并不总是有效。)如果可能,一些公司会使用它,但如果它失败,他们总是有替代方法(如通过服务器进行通信)。它被称为 nat 打孔。更多细节在这里:http://en.wikipedia.org/wiki/TCP_hole_punching

    我不知道您需要什么原因。如果您需要它用于客户端服务器连接,您可以使用长轮询之类的方法,回调......

    否则需要设置路由器,或者通过服务器走路由。

    【讨论】:

    • 我授予您赏金,因为我认为您的回答涵盖了该主题的大部分内容。但是,我会在接受之前再等一会儿,希望会有另一个答案。
    【解决方案3】:

    部分家用路由器支持upnp,可以被指令打开某个端口,转发给局域网中的某个客户端。

    您可以在 GNU/Linux 上使用 upnpc 来打开路由器上的端口。它还有一个库可以从 C 代码中执行此操作(但文档记录不是很好)。

    但是,此方法可能不适用于所有家用设备,因此在这种情况下,请参阅其他答案。

    【讨论】:

      【解决方案4】:

      你可以做两件事一是打孔http://en.wikipedia.org/wiki/TCP_hole_punching 因此这将允许您响应位于 NAT 后面的客户端(您可以将客户端配置为发送 NAT 使用的私有 ip 和端口号来回复它们)。

      您可以做的其他事情是像 Skype 一样创建一个点对点网络,并将其中一个客户端作为中继网络,并跟踪活动中继并定期更新它们。 (见http://en.wikipedia.org/wiki/Skype_protocol

      因此,现在您的服务器必须充当代理和管理员,管理所有连接,但通过它的信息量最少。

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 1970-01-01
        • 2016-02-16
        • 2018-01-14
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        相关资源
        最近更新 更多