.net - UDP、NAT 和设置 "connections"

标签 .net udp nat nat-traversal

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

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

例如:假设客户端使用一些通过 TCP 的消息传递连接到服务器并进行身份验证。此时,服务器已准备好开始通过 UDP 将数据流式传输到客户端,但是服务器如何知道在哪里寻址 UDP 数据包,以便它们可以通过任何 NAT 路由器找到客户端?

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

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

最佳答案

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

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

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

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

关于.net - UDP、NAT 和设置 "connections",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/716620/

相关文章:

c# - 更新包含 Entity Framework 中的对象列表的对象的最佳方法

c# - 为什么 Winforms Click 事件比 MouseClick 事件慢?

c# - UDP DatagramSocket的正确使用

Java UDP STUN 使用 DatagramSocket 打洞

c# - 如何从另一个 View 模型实例化和显示一个 ViewModel

.net - 用于存储密码并随后检索的字符串加密

c++ - boost::asio 取消或关闭在 async_handle 上不起作用

java - Java中的UDP广播客户端

sockets - NAT 后面的 Gitlab 在另一个端口上?

redirect - 添加指向相同IP但不同端口的子域