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 打孔 - 无法到达目的地的主要内容,如果未能解决你的问题,请参考以下文章