6

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

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

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

其他假设:

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

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

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

4

4 回答 4

4

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

于 2013-05-29T11:03:45.497 回答
3

一个简短的回答是:这是不可能的。

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

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

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

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

于 2013-05-29T11:06:30.927 回答
2

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

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

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

我希望这会有所帮助。

于 2013-06-04T12:23:25.140 回答
1

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

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

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

于 2013-05-29T11:11:46.000 回答