UDP、NAT及建立“连接”的设置

13

我知道在谈论UDP时,使用“连接”这个词并不太合适,但是...

服务器(已知IP地址的服务器)如何通过互联网将其UDP数据包传递到位于NAT后面的客户端?

例如:假设客户端通过TCP连接和身份验证连接到服务器。此时,服务器准备开始通过UDP向客户端流式传输数据,但是,服务器如何知道在哪里寻址UDP数据包,以便它们可以穿过任何NAT路由器找到客户端?

如果客户端首先通过UDP发送一个“我已准备好进行流式传输,请”消息,那么NAT路由器会保持端口打开状态,以便服务器可以响应其UDP数据流吗?

还是我完全错了?


你是在设计自己的协议,还是试图让现有的协议运作? - Alnitak
我将会实现一些新的东西。 - chardy
3个回答

4
忽略路由器(提供NAT)中已知端口转换的规定(即,此端口的数据发送到此地址),您可以使用UDP Hole Punching
我猜你说的不是多播, 在多播中每个对等方加入一个组并向感兴趣的方向(在本例中为路由器)发送广播,然后路由器可以执行适当的路由。尽管通常用于有效地将流量路由到多个主机,但按组进行路由的机制也可以用于上述描述。

谢谢Brian提供的信息 - 据我所知,UDP打洞将在两端都在防火墙后的点对点场景中使用?如果我的服务器在WAN IP上,这仍然是必要的吗? - chardy
我不这么认为,但我承认我不是专家。 - Brian Agnew

1
通常,在TCP层面上客户端前面的NAT将能够确定UDP连接已经创建。话虽如此,客户端侧的NAT必须配置为接受来自SRC服务器端口的UDP数据包,然后将它们转发到内部目标IP(客户端)。重要的是要记住NAT是谁是呼叫者和被呼叫者。NAT在实现和能力方面有所不同,因此根据您的需求,可能需要实现通用易于实现的解决方案。
我认为你的假设是正确的,即在你的情况下,客户端将无法接收UDP信息流。在你的情况下,你的客户端将不得不向你的服务器发送其WAN IP以启动UDP连接。找到客户端的WAN IP可能有些棘手,但有一些网站可以通过返回文本页面来帮助你确定WAN IP。
如果UDP连接是由服务器打开到已知UDP端口的客户端套接字之后创建的,则值得考虑UPnP,它将允许您在NAT上自动设置端口转发,只有当您的NAT支持UPnP时才能这样做,例如DSL路由器。
一个解决方法是让客户端同时向服务器打开TCP和UDP套接字。由于NAT后面的客户端发起了连接,因此TCP和UDP连接的状态将被添加到NAT的连接表中。

"一个解决方案是让客户端同时打开 TCP 和 UDP socket 与服务器通信。这样是否是获取服务器数据包返回给客户端的标准和可靠方式?我希望对使用客户端的人来说最少麻烦。" - chardy

1

如果你在谈论像SIP或RTSP这样的流媒体协议,那么它的工作方式是客户端在呼叫设置请求中指定要发送到服务器的UDP端口。

服务器将发送到该端口,流量可能会或可能不会传递到客户端,这取决于NAT是否将客户端选择的端口转换为其他数字。

当服务器从客户端接收到第一个UDP流数据包,并且如果它与发送时使用的端口不同,则服务器将切换到该端口。这使得来自服务器的UDP可以通过NAT,因为客户端已经通过向服务器发送数据来创建了NAT映射。


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