UDP、NAT 和设置“连接”

Posted

技术标签:

【中文标题】UDP、NAT 和设置“连接”【英文标题】:UDP, NAT and setting up "connections" 【发布时间】:2010-10-17 12:39:30 【问题描述】:

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

服务器(具有已知 IP 的服务器)如​​何通过 Internet 将其 UDP 数据包发送到位于 NAT 后面的客户端?

例如:假设客户端使用 TCP 上的一些消息连接并验证服务器。此时,服务器已准备好开始通过 UDP 将数据流式传输到客户端,但服务器如何知道将 UDP 数据包寻址到何处,以便它们能够通过任何 NAT 路由器到达客户端?

如果客户端通过 UDP 发送“我已准备好进行流式传输”消息,NAT 路由器是否会保持端口打开,以便服务器可以响应其 UDP 数据流?

或者我在这里偏离了轨道?

【问题讨论】:

您是在设计自己的协议,还是试图让现有协议发挥作用? 我会实施一些新的东西。 【参考方案1】:

忽略在您的路由器(提供 NAT)中提供已知端口转换(即 this 端口上的数据到 this 地址),您可以使用UDP Hole Punching .

我假设您不是在谈论multicasting,其中每个对等方加入一个组并向感兴趣的各方(在本例中为路由器)宣布这一点,然后可以执行适当的路由。尽管这通常用于将流量有效地路由到多个主机,但按组路由机制将适用于您在上面描述的。

【讨论】:

感谢 Brian 提供的信息 - 据我了解,UDP 打孔将用于两端都在防火墙后面的对等场景中?如果我的服务器在 WAN IP 上,这仍然是必要的吗? 我不这么认为,但我承认我不是专家。【参考方案2】:

通常,客户端前面的 TCP 级别的 NAT 将能够确定 UDP 上的连接已创建。话虽如此,客户端的 NAT 必须配置为接受来自 SRC 服务器端口的 UDP 数据包,然后将它们转发到内部目标 IP(客户端)。如果 NAT 是谁是呼叫者,谁是被呼叫者,请记住重要的事情。 NAT 在实施和能力方面有所不同,因此您可能想要实施一个易于实施的通用解决方案,具体取决于您的需要。

我认为,您的假设是正确的,在您的情况下,客户端将无法接收信息中的 UDP 流。在您的情况下,您的客户端必须将其 WAN IP 发送到您的服务器以启动 UDP 连接。查找您的客户 WAN IP 可能很棘手,但有些网站可以通过在文本页面中返回来帮助您确定您的 WAN IP。

如果 UDP 连接是在 TCP 连接之后由服务器向客户端打开到已知 UDP 端口的套接字创建的,那么 UPnP 可能值得研究一下,它将允许您在 NAT 上自动设置端口转发,前提是您的 NAT 支持 UPnP,就像 DSL 路由器一样。

解决方法是让客户端同时向服务器打开 TCP 和 UDP 套接字。由于 NAT 后面的客户端发起了连接,因此 TCP 和 UDP 连接的状态都将添加到 NAT 的连接表中。

【讨论】:

“一个工作循环是让客户端打开到服务器的 TCP 和 UDP 套接字。”这是将服务器的数据报返回给客户端的标准且可靠的方法吗?我正在为使用客户端的人寻找最少的麻烦。【参考方案3】:

如果您谈论的是 SIP 或 RTSP 等流协议,那么它的工作方式是客户端希望服务器发送到的 UDP 端口在呼叫建立请求中指定。

服务器将发送到该端口,流量可能会或可能不会通过客户端,具体取决于 NAT 是否已将客户端选择的端口转换为不同的数字。

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

【讨论】:

以上是关于UDP、NAT 和设置“连接”的主要内容,如果未能解决你的问题,请参考以下文章

NAT 后面的 UDP P2P 连接

NAT 后面到 NAT 连接后面

所有 NAT 类型的 P2P 连接

转载虚拟机网络连接NAT模式,本地用Xshell连接

转载虚拟机网络连接NAT模式,本地用Xshell连接

UDP打孔无法外接