2011-04-16 27 views
1

我想创建一个简单的Java聊天程序,它可以在p2p的基础上工作。使用公共服务器仅启动连接。但我甚至不确定这是可能的。使用服务器绕过路由器发起连接

我成功地实现聊天解决方案在Java中工作,如果至少具有一个PC转发了正确的端口。我还设法使用外部服务器,而不必在客户端转发端口。

所以我虽然,甚至会可能以某种方式使用公共服务器发起连接,并且比客户端之间发送数据的恰到好处,带负荷关闭服务器?

我不是很熟悉路由器是如何工作的,但我希望,当你从内部IP呼叫公共服务器,路由器记得通话,然后从公共IP传入响应不是发送到您的PC。所以我想,也许如果第一个客户端连接到服务器,服务器比传递信息到第二个客户端,可能比他们可以以某种方式直接沟通?如果路由器中的规则是由服务器建立的?

我希望我解释清楚。如果不是,请原谅我。我甚至不知道如何做到这一点,我只想知道我的概念是否正确,我必须努力学习,并有机会运作。谢谢。

+0

你只使用tcp进行通信,对吗? – 2011-04-16 17:26:50

回答

-2

编辑:在评论(并阅读链接的页面)后,我应该撤消我的建议。我不删除它,为好的图形,但改变了最后一部分。


如果我理解正确的,你有两个客户端都在NAT防火墙,它允许传出连接,但不向前入流的连接,如果没有专门配置做这样的(因为他们不知道背后其中它注定的本地主机)。

原则,在其整个存在时间的TCP连接总是在这些地址(例如,我们有保持不变四位数字)连接两个相同的IP地址和端口号。在NAT的情况下,你实际上有两个连接,但这不是从客户端计算机A(也没有从服务器S)可见:

Client A -------(LAN)------ NAT B  ------ (Internet) -------- Server S 
    IP A     IP B1 | IP B2        IP S 
    Port a      | Port b        Port s 

的TCP分组具有[A:A/S:S](或[S:s/A:a])地址和Internet部分上的[B2:b/S:s](或[S:s/B2:b])地址。这个连接由这个[IP:port/IP:port]四元组标识,所以如果你试图改变这四个数字中的一个,这必须是一个新连接(否则数据包将被丢弃)。

所以,如果你第一次与你的服务器来说,你不能继续向其他客户讲同样的连接上,除非服务器转发的内容。

UDP数据包的情况实际上是一样的,区别在于没有连接,并且NAT必须是智能的并且猜测哪个数据包是对其他数据包的答案,并且因此将其转发给正确的方向。

正如指出的意见和其他的答案,这里就是NAT可以被欺骗了一点:我们首先发送一个UDP包到其他客户端,这将是由NAT获得扔掉那里。但是另一个客户端发送的应答数据包对传出数据包不是真正的答案(因为这个数据包从来没有被其他客户端的NAT收到),但是IP地址和端口号相匹配,它仍然可以通过。如果NAT也转换端口号,这可能会变得更加复杂。

对于TCP,它可以工作类似,如果两个NAT都没有真正保持打开的连接,而只是在发送之前发送SYN时转发(更改)了数据包。它更加复杂,因为TCP序列号也必须在这里匹配。

+1

你错了,这是可能的,请参阅http://en.wikipedia.org/wiki/Hole_punching – mabn 2011-04-16 18:01:24

+1

@Paulo,首先请使用'packet',而不是'package' ......当你尝试解释时,你立即失去信誉这与包,但这并不是我投票的原因。我拒绝了,因为他**不需要创建一个新的协议。 UDP(假设有问题的端口允许通过任何防火墙)是好的。想想看,如何Skype(一个peer2peer应用程序)[通过防火墙获取udp](http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197。 HTML)? – 2011-04-16 18:09:04

+1

@Mike:谢谢你的评论,今天我学到了一些新东西。关于Skype,我从来没有真正想过它的点对点本质。 (我曾经用其他非防火墙客户端作为网关阅读了一些内容。) – 2011-04-16 19:03:38

5

我觉得TeleHash是一个新的项目,可以做这样的事情。我只是最近才发现它,所以我不太了解它。

我回答这个问题的社区wiki,以便其他人可以更新它来解释如何使用TeleHash。

+0

Telehash的+1,这是我听说的第一个 – 2011-04-16 18:14:19

+1

Telehash正在积极开发(2013-2014)。我正在研究Go的实现。 Telehash支持NAT穿越,前向保密,基于身份的路由等等。 – simonmenke 2014-02-18 14:38:21

相关问题