UDP穿透解释

5
我正在尝试理解UDP打洞,但我还没有完全掌握它。在概念上,它似乎很简单,但当我实践时,我无法成功。据我所知,有一个公共服务器,我们称之为打洞服务器。客户端向打洞服务器发出请求(这是公开的)。打洞服务器会返回刚刚发出请求的客户端的公共IP和端口。只要该端口打开,任何随机客户端都可以使用该特定端口和IP向该客户端发出请求,对吗?
我遇到的问题是,客户端能够向服务器发出请求。服务器能够在公共端口和IP上向客户端发送数据,但是当另一个客户端尝试使用同样的端口和IP向该客户端发送请求时,它就无法通过,这让我感到困惑。如果服务器可以发出请求,为什么另一个随机客户端不能发出请求呢?
1个回答

22
关于UDP打洞需要知道的是许多消费级互联网路由器/网络地址转换(NAT)防火墙有如下策略:“阻止任何来自外部的UDP包,除非这些UDP包是来自用户本地计算机最近发送过UDP包的IP地址”; 这样做的想法是,如果本地用户正在向特定IP地址发送数据包,则来自该同一IP地址的回传数据包可能是合法/期望的。
因此,为了在两台防火墙/NAT设备保护下的计算机之间使UDP包流动,必须先让两台计算机中每台都向另一台发送UDP包。这是一个鸡生蛋的问题,因为它们无法在没有通信的情况下知道要发送UDP包到哪里;公共服务器就是解决这个问题的方法。由于该服务器是公共的,因此客户端可以使用UDP或TCP或HTTP等与服务器进行通信,并且该服务器可以告诉每个客户端将其UDP包发送到的IP地址和端口号。一旦每个客户端向对方发送了一些初始数据包,它还应该(在大多数情况下)能够从对方接收UDP数据包,此时服务器就不再需要作为中间人。

谢谢您的解释!那么我的问题是,我是否应该为新的公共地址和端口创建一个新的套接字,还是保留我用于与服务器通信的同一套接字?或者这没有关系吗? - Kayla
对于UDP,一个套接字就足以使用sendto()和recvfrom()从任何地方发送和接收数据。而对于TCP,您需要为每个要连接的主机使用单独的套接字。 - Jeremy Friesner
@Jeremy,我只是想完全理解。也许我考虑了一种特殊的技术解决方案,其中数据报套接字用于中介通信,并且这些套接字应该已经在防火墙上打开了端口,以便用于点对点通信。也许我的假设在不对称路由和你的情况下仍然适用。 - undefined
确实,数据报套接字可以重用来从任何地方发送/接收数据包;但是防火墙并不知道/关心哪个套接字用于发送UDP数据包;它们仅根据接收到的UDP数据包的源和目的字段进行过滤。 - undefined
这正是关键所在:一些(NAT)防火墙仅通过端口进行过滤,而其他一些还关心远程端点。 - undefined
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接