Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ P2P连接的NAT穿越实现_C++_Linux_Networking_Nat - Fatal编程技术网

C++ P2P连接的NAT穿越实现

C++ P2P连接的NAT穿越实现,c++,linux,networking,nat,C++,Linux,Networking,Nat,我需要在NAT后面实现一个简单的P2P应用程序。它应该通过可靠和安全的连接(通过TCP加密数据)发送数据。从理论背景来看,我知道在几个RFC(5389、5769和5780)中描述了几种NAT遍历技术(例如NAT的会话遍历实用程序) 虽然在实践中我找不到需要的工具/库来实现这样的系统(最好是C++编程语言)。通过盲目地在谷歌上搜索,我已经发现了:, , , 及 下图描述了它应该是什么样子。我有一个具有有效IP地址的VPS,一个NAT后面有一台PC,另一个NAT后面有一个传感器。他们有私人IP。我希

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

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

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

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} <--> R2 <--> Monitor
传感器AP0 R3{互联网}R2监视器
目前所有数据均通过VPS传输:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} R1 <--> 
VPS <--> R1 <--> {THE INTERNET} <--> R2 <--> Monitor
传感器AP0 R3{互联网}R1 VPS R1{互联网}R2监视器


因为您最终希望完全删除中继服务器,并希望监视器和端点直接通信,所以您确实在试图解决NAT后面的两台服务器之间的直接通信问题

因此有两个问题需要解决:

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

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

中继可以帮助解决的第一个问题是:您可以使用TURN通过服务器中继消息,将监视器的公共IP地址传递给传感器

然而,第二个问题,我不知道任何通用的解决方案,因为它实际上涉及到路由器上的配置。路由器需要知道NAT后面的许多系统中要将SYN转发到哪个系统。它不能把它转发给所有人:他们都会回应

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


希望这会有所帮助。

因为您最终希望完全删除中继服务器,并希望监视器和端点直接通信-您确实在试图解决NAT后面的两台服务器之间的直接通信问题

因此有两个问题需要解决:

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

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

中继可以帮助解决的第一个问题是:您可以使用TURN通过服务器中继消息,将监视器的公共IP地址传递给传感器

然而,第二个问题,我不知道任何通用的解决方案,因为它实际上涉及到路由器上的配置。路由器需要知道NAT后面的许多系统中要将SYN转发到哪个系统。它不能把它转发给所有人:他们都会回应

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

希望这会有所帮助。

基本上,如果可以的话,这更像是一个基础设施问题,而不是编程问题。您只需配置路由器,将流量从公用IP/端口定向到专用IP/端口,例如:

R2: Port 500 - TCP -> Laptop-PT - Port 500
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500
如果您想获得更高的性能和路由器支持,只需求助于实现的库(例如),以使您的应用程序控制端口映射。提供了一个很好的起点和一些示例代码(尽管我真的建议使用一个健壮的库)。

基本上,如果可以的话,这是一个基础架构问题,而不是编程问题。您只需配置路由器,将流量从公用IP/端口定向到专用IP/端口,例如:

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

如果您想获得更高的性能和路由器支持,只需求助于实现的库(例如),以使您的应用程序控制端口映射。提供了一个很好的起点和一些示例代码(尽管我真的建议使用一个健壮的库)。

我知道我甚至不应该问,但端口转发或UPnP支持是不可能的?@AnthonyAccioly不,我只是忘了提一下。我完全糊涂了。不能回头找一个起点…我知道我甚至不应该问,但端口转发或UPnP支持是不可能的吗?@AnthonyAccioly不,我只是忘了提一下。我完全糊涂了。无法回头寻找起点…是的,但由于TCP连接是点对点的,并且您不希望通过中继服务器转发数据,因此它无法帮助建立连接(如我所说,在获取监视器的公共IP地址时除外);中继器可以帮助传送用于建立TCP连接的参数,但不能帮助实际TCP连接的任何数据传输;包括最难的部分-为TCP连接发送的第一个数据包:SYN数据包。是的,但因为TCP连接是点对点的,您不希望数据被删除