2013-05-02 113 views
1

我需要在NAT后面实现一个简单的P2P应用程序。它应该通过可靠和安全的连接发送数据(TCP上的加密数据)。从理论背景我知道在几个RFC(5389,5769和5780)中描述了几种NAT穿透技术(例如用于NAT的会话遍历实用程序)。P2P连接的NAT遍历实现

虽然在实践中我找不到需要的工具/库来实现这样的系统(最好用C++编程语言)。我已经通过谷歌搜索盲目地发现身边:ICETURNlibnicelibjingleSTUNTMAN

下面的图像描述它应该是什么样子。我有一个有效IP地址的VPS,一个位于NAT后面的PC和位于另一个NAT后面的传感器。他们有私人IP。我想让我的传感器连接到服务器,找到监视器并向它发送连接请求。连接建立后,不应该使用中继服务器来引导数据流量。我希望我的传感器和监测使用此路径进行通信:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} <--> R2 <--> Monitor 

目前,所有数据通过VPS传输:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} R1 <--> 
VPS <--> R1 <--> {THE INTERNET} <--> R2 <--> Monitor 

Network

+0

我知道我甚至不应该问,但是端口转发或UPnP支持是没有问题的? – 2013-05-02 14:59:49

+0

@AnthonyAccioly不,我只是忘了提及。我完全困惑。不能转动我的头并找到一个起点...... – 2013-05-02 15:02:10

回答

2

基本上,如果你可以port forward,那么这是一个比编程更基础设施的问题。您只需将路由器配置为将来自公共IP /端口的流量引导至专用IP /端口,例如:

R2: Port 500 - TCP -> Laptop-PT - Port 500 
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500 

如果你想获得幻想和你的路由器支持UPnP,只是诉诸实现库中的IGD protocol(例如,MiniUPnP),为了使您的应用程序控制端口映射。 This article提供了一个很好的起点以及一些示例代码(尽管我真的会推荐一个强大的库)。

+0

我需要访问路由器配置吗? – 2013-05-02 15:49:29

+0

是的。无论是手动(如@chris指出,通过它的管理界面配置路由器),或者如果路由器通过UPnP库支持UPnP(并启用它)。看看我的回答中的文章,我认为它会说清楚。 – 2013-05-02 15:55:10

+0

我读过那篇文章。现在我可以考虑使用UPnP进行端口转发。那么,现实世界中的路由器如何?我是否应该担心在所有数据路径路由器中缺乏UPnP支持? – 2013-05-02 16:02:38

2

因为你最终想要的中继服务器被完全删除,并希望监视器和终端直接进行通信 - 你真的试图解决直接通信的问题NAT之间的两台服务器之间的通信。

所以有两个问题需要解决:

1)允许传感器以获得监控系统的公共IP地址。

2)允许TCP连接的SYN数据包通过Router-PT R2上的NAT中继到您的监视器。

继电器可以提供帮助的第一个问题:您可以使用TURN通过服务器转发消息,以将监视器的公共IP地址传送到传感器。

然而,第二个问题我没有意识到任何广义的解决方案,因为它真的归结为路由器上的配置。路由器需要知道NAT后面的许多系统中的哪一个来转发SYN。它不能将它转发给所有人:他们都会回应。

大多数支持NAT的路由器都具有配置设置,允许您配置要将传入数据包路由到的主机。查看是否使笔记本电脑监控系统成为DMZ,或将特定TCP端口的流量导向您所需的系统。但是,每个路由器都会以不同的方式处理此配置我没有注意到这种配置的标准化。

希望有所帮助。

+1

是的,但是由于TCP连接是点对点的,并且您不希望通过中继服务器转发数据,所以它无法帮助建立连接(除了,正如我所说的,在获取显示器的公共IP地址时) – chris 2013-05-02 15:46:31

+1

换句话说,中继可以帮助传送建立TCP连接的参数,但它不能帮助实际的TCP连接进行任何数据传输;包括最难的部分 - 发送给TCP连接的第一个数据包:SYN数据包。 – chris 2013-05-02 15:48:40