【问题标题】:UDP Hole Punching - Destination unreachableUDP 打孔 - 无法到达目的地
【发布时间】: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 - 在第二个虚拟机上使用 VPN

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

【问题讨论】:

    标签: c# udp p2p


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-28
      • 2012-02-12
      • 2011-06-14
      • 2014-10-17
      • 2014-01-19
      • 2014-09-21
      • 2019-04-11
      • 2012-11-30
      • 2019-01-13
      相关资源
      最近更新 更多