UDP打洞解释

Kay*_*yla 7 networking udp hole-punching

我正在尝试了解 UDP 打洞,但我不太明白。从概念上看,这似乎很简单,但当我付诸实践时,我却无法做到这一点。据我了解,有一个公共服务器,我们称之为打孔服务器。客户端向打孔服务器发出请求(这是公开的)。打孔服务器会输出刚刚发出请求的客户端的公共 IP 和端口。只要该端口打开,那么基本上任何随机客户端都可以使用该特定端口和 IP 向该客户端发出请求?

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

Jer*_*ner 24

关于 UDP 打洞,需要了解的是,许多消费级 Internet 路由器/NAT 防火墙都有一项策略,即“阻止任何传入的 UDP 数据包,来自用户本地计算机具有的 IP 地址的 UDP 数据包除外”。最近发送了一个 UDP 数据包到“;这个想法是,如果本地用户将数据包发送到特定的 IP 地址,那么从同一 IP 地址返回的数据包可能是合法/所需的。

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