NAT 后面的 UDP P2P 连接

Posted

技术标签:

【中文标题】NAT 后面的 UDP P2P 连接【英文标题】:UDP P2P connection behind NAT 【发布时间】:2012-12-31 13:52:45 【问题描述】:

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

所以...

我用 php 做了一个服务器,它可以根据需要向客户端发送连接详细信息(如远程 IP、远程端口)。

示例源代码在这里:http://pastebin.com/FdiKMSFq

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

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

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

我将两个 IPEndPoints 都设置为使用端口 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 并发送一些数据

【问题讨论】:

【参考方案1】:

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

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

建立连接的方法是让 B 也将数据包发送到 A 的公共端点 (32.14.15.16:56666)。这样做会在 B 的 NAT 上“打孔”。在您的示例中,A 已经通过向 B 发送流量来“打孔”。

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

【讨论】:

完美诠释了“打孔”技术。在这里查看整个故事的报道:brynosaurus.com/pub/net/p2pnat

以上是关于NAT 后面的 UDP P2P 连接的主要内容,如果未能解决你的问题,请参考以下文章

NAT 后面的 TCP 连接

UDP、NAT 和设置“连接”

NAT 后面到 NAT 连接后面

如何在 2 个 nat 后面执行 p2p?

解决 P2P 上的 NAT 问题

P2P技术详解:P2P中的NAT穿越(打洞)方案详解