NAT后的UDP P2P连接

本文关键字:连接 P2P UDP 后的 NAT | 更新日期: 2023-09-27 17:54:13

我想在NAT后面的2个客户端之间建立P2P连接。我研究了使其工作的方法,我想尝试"UDP穿孔方法"。

所以…

我用PHP做了一个服务器,它可以按需发送连接细节给客户端(如远程IP,远程端口)。

源代码示例如下:http://pastebin.com/FdiKMSFq

接下来,我用c#做了一个客户端,它永久连接到服务器,并询问他关于另一个客户端的信息。客户端接收到另一个客户端的远程IP和远程端口(用于与服务器连接),并尝试连接。

完整的源代码在这里:http://pastebin.com/VUJyZivW

第一步(连接,询问细节)是OK的,但是当客户端(A)连接到另一个客户端(B)并发送一些数据(A->B)时,客户端B没有接收到任何数据。

我设置两个ipendpoint都使用端口2000。

的例子:

  • A: 192.168.1.11:2000,服务器收到32.14.15.16:56666
  • B: 192.168.1.5:2000,服务器收到32.99.15.16:56699
  • A尝试连接32.99.15.16:56699并发送一些数据

NAT后的UDP P2P连接

查看您的示例,B的NAT将丢弃用于其公共端点(地址和端口对)的数据包。这是因为B的NAT将此视为未经请求的请求。

为了让B的NAT允许来自A的数据包通过,它必须认为B事先与A通信过,从而考虑请求。NAT保留一个内部表来跟踪这个。

建立连接的方法是让B也将数据包发送到a的公共端点(32.14.15.16:56666)。这样做会在B的NAT中"打"一个洞。在你的例子中,a已经通过向B发送流量"打"了一个洞。

请记住,只有当至少一个nat始终如一地将私有源端点转换为公共源端点(无论目的地址如何)时,这才会起作用。这是因为服务器看到的公共端点可能与P2P对等体的NAT看到的端点不同,即使对等体使用相同的私有端点。