UDP打洞解释

UDP hole-punch explanation

我想了解 UDP 打洞,但我不太明白。 从概念上看,这似乎很简单,但是当我付诸实践时,却无法实现。 据我了解,有一个 public 服务器,我们称之为打孔服务器。客户端向打孔服务器发出请求(这是 public)。打洞服务器吐出刚发出请求的客户端的 public ip 和端口。只要该端口处于打开状态,那么基本上任何随机客户端都可以使用该特定端口和 ip 向该客户端发出请求?

我想我遇到的问题是,客户端能够向服务器发出请求。服务器能够通过该 public 端口和 ip 将数据发送回客户端,但是当另一个客户端尝试使用相同的端口和 ip 向该客户端发送请求时,它不会通过,这就是令人困惑的地方我。如果服务器可以发出请求,为什么另一个随机客户端不能发出该请求?

关于 UDP 打洞需要了解的一点是,许多消费级互联网 routers/NAT-firewalls 都有类似“阻止任何传入的 UDP 数据包,除外[=15=”的策略] 对于来自用户本地计算机最近向其发送 UDP 数据包的 IP 地址的 UDP 数据包”;这个想法是,如果本地用户正在向特定 IP 地址发送数据包,那么从同一 IP 地址返回的数据包可能是 legitimate/desirable.

因此,为了让 UDP 数据包在两台 firewalled/NAT 的计算机之间流动,您必须让两台计算机中的每台计算机首先向另一台计算机发送 UDP 数据包;这有点像先有鸡还是先有蛋的问题,因为他们不知道在无法通信的情况下将 UDP 数据包发送到哪里; public 服务器解决了这个问题。由于该服务器是 public,两个客户端都可以与服务器通信(通过 UDP 或 TCP 或 HTTP 或其他方式),并且该服务器可以告诉每个客户端 IP 地址和端口以将其 UDP 数据包发送到。一旦每个客户端都向另一个客户端发送了一些初始数据包,它也应该(在大多数情况下)也能够从另一个客户端接收 UDP 数据包,此时服务器不再需要作为中间人。