1

我正在尝试使用 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 数据包来打孔(但再次使用 direct server.send([..], [..], peerip, peerport))。我知道第一个数据包总是被丢弃,所以我每隔 100 毫秒发送 50 个数据包,而远程对等点做同样的事情。

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

PS: 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

PPS:我在 Virtual Box 中使用虚拟化 Windows。

4

1 回答 1

0

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

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

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

于 2013-05-09T19:41:27.597 回答