UDP 打孔 - 无法到达目的地

Posted

技术标签:

【中文标题】UDP 打孔 - 无法到达目的地【英文标题】:UDP Hole Punching - Destination unreachable 【发布时间】:2013-04-21 23:15:34 【问题描述】:

我正在尝试使用 UDP 打孔方法建立 p2p 连接,但我总是收到目标不可达状态的 ICMP 数据包。

首先,创建一个到服务器的 UDP 连接:

        send = new IPEndPoint(IPAddress.Any, 0);
        server = new UdpClient(send);
        server.AllowNatTraversal(true);

没有任何直接连接(没有 ip,没有端口,只是随机端口上的端点)。

我在服务器的 ip 和端口上使用直接server.send([..],[..],serverip,serverport) 向服务器发送一些数据包,并获取有关另一个对等方的信息(远程 IP、用于连接服务器的端口)

现在我正在尝试通过使用服务器连接在对等方的 IP:PORT 上发送简单的 UDP 数据包来打孔(但再次使用直接server.send([..], [..], peerip, peerport))。我知道第一个数据包总是被丢弃,所以我以 100 毫秒的间隔发送 50 个数据包,而远程对等点做同样的事情。

如果我了解 UDP 打孔方法,从第一个对等点 (A) 发送数据包会在 A 的 NAT 中打开 NAT 记录,并被 B 丢弃 的 NAT,因为 NAT 中没有记录。因此,当 B 向 A 发送数据包时,A 的第一个数据包(针对 B)创建的 NAT 中有记录,并且数据包应该被 B 接收强>。 B 的 NAT 中的 NAT 记录已创建。 A 应该成功地向 B 发送另一个数据包。

P.S.:http://nattest.net.in.tum.de/test.php 测试成功 http://nattest.net.in.tum.de/individualResult.php?hash=a5f229d156d4f5409a305c37729d9510 http://nattest.net.in.tum.de/individualResult.php?hash=3fd60e888721908a9480cd12836b97af - 在第二个虚拟机上使用 ***

P.P.S.:我在 Virtual Box 中使用虚拟化 Windows。

【问题讨论】:

【参考方案1】:

您应该从两个端点获取网络捕获跟踪并研究结果。密切注意各方面的端口号,因为端口号和 IP 地址可能会被重新映射。

很难推断你在问什么。如果您收到 ICMP 错误,则可能是 NAT 或端点尚未准备好接收您的 UDP 数据包。再重复几次打孔测试可能会解决这个问题。

我怀疑您认为远程对等方正在侦听的端口号的映射与您认为的不同。如果您使用的是对称 NAT,就会出现这种情况,这在虚拟机上使用 *** 是很有可能的。

【讨论】:

以上是关于UDP 打孔 - 无法到达目的地的主要内容,如果未能解决你的问题,请参考以下文章

UDP打孔无法外接

移动提供商无法进行 UDP 打孔

UDP打孔:无法从服务器发送到客户端

需要帮助设置用于 p2p 数据传输的 udp 打孔。无法让 STUN 工作

UDP 打孔 (c++/winsock)

UDP 打孔在非对称 NAT 上失败