在谈论UDP时,我知道“连接”这个词并不合适,但是......
服务器(具有已知IP的服务器)如何通过Internet将其UDP数据包发送到NAT后面的客户端?
例如:假设客户端使用TCP上的某些消息传递连接并对服务器进行身份验证。此时,服务器已准备好通过UDP开始将数据流传输到客户端,但服务器如何知道在哪里寻址UDP数据包,以便他们能够通过任何NAT路由器找到客户端?
如果客户端拳头通过UDP发送“我已准备好流媒体请”消息,NAT路由器是否会保持端口打开,以便服务器可以使用其UDP数据流进行响应?
或者我在这里偏离轨道?
答案 0 :(得分:4)
忽略在路由器(提供NAT)中提供已知端口转换(即此端口上的数据转到此地址),您可以使用{{3 }}
我假设你不是在谈论UDP Hole Punching,其中每个对等体加入一个组并向有关各方(在这种情况下是路由器)宣布,然后可以执行适当的路由。虽然这通常用于有效地将流量路由到多个主机,但是逐个路由机制可以用于上面描述。
答案 1 :(得分:1)
通常,TCP级别的客户端前面的NAT将能够确定UDP的连接是否已创建。话虽如此,客户端的NAT必须配置为接受来自SRC服务器端口的UDP数据包,然后将它们转发到内部目标IP(客户端)。重要的是要记住,如果NAT是谁是呼叫者,谁是被呼叫者。 NAT在实现和功能上有所不同,因此根据您的需要,您可能希望实现一个易于实现的通用解决方案。
我认为,在您的情况下,客户端将无法接收信息中的UDP流,这是正确的。在您的情况下,您的客户端必须将其WAN IP发送到您的服务器以启动UDP连接。寻找您的客户WAN IP可能会非常棘手,但有些网站可以通过在文本页面中返回来帮助您确定WAN IP。
如果在TCP连接之后通过服务器向客户端打开到已知UDP端口的套接字创建UDP连接,则UPnP可能值得查看它将允许您在NAT上自动设置端口转发,只有你的NAT支持UPnP,就像DSL路由器一样。
一个圆形的工作方式是客户端打开服务器的TCP和UDP套接字。由于NAT后面的客户端启动了连接,TCP和UDP连接的状态将被添加到NAT的连接表中。
答案 2 :(得分:1)
如果您正在谈论SIP或RTSP等流媒体协议,那么它的工作方式是客户端希望服务器发送到的UDP端口在呼叫建立请求中指定。
服务器将发送到该端口,流量可能会或可能不会通过客户端,具体取决于NAT是否已将端口选择转换为其他数字。
当服务器从客户端收到它的第一个UDP流数据包时,如果它在与它发送的端口不同的端口上,那么它将切换到它。这使得来自服务器的UDP可以通过NAT,因为客户端已经通过发送到服务器来创建NAT映射。