NAT 会阻止来自使用 TCP 连接的服务器的 UDP 数据包吗?

Does NAT block UDP packets coming from a server connected using TCP?

我正在尝试使用 java 服务器和游戏制作工作室客户端开发游戏。我写了一些基本的连接代码,它在我的本地网络中运行良好。但是当我托管服务器并尝试连接时,我的客户端获取服务器分配的 ID,该 ID 通过 TCP 发送,但它没有收到 UDP 协议发送的任何命令。服务器如何无法通过 UDP 建立连接,而它可以通过 TCP 建立连接。我听说我需要 UDP 打洞。但是一旦我编写了具有游戏制作工作室网络功能的服务器,UDP 就能够在服务器上建立具有相同配置的连接。所以他们在内置函数中使用打孔?如果我需要实现打孔,我应该只使用 TCP 还是应该不惜一切代价学习打孔?

这里有很多问题,所以我将尝试将它们逐一分解。首先...

Does NAT block UDP packets coming from a server connected using TCP?

。仅仅因为NAT已经在两台机器之间建立了TCP连接,并不意味着它也会自动转发UDP数据包。

How server can't establish connection over UDP while it can over TCP?

TCP 是一种面向连接的 协议,而 UDP 是一种无连接 协议,因此技术上不存在 [=27] =].当两台计算机通过 UDP 进行通信时,它们只是来回交换 UDP 数据包,并且 "connection" 是隐含的(或在更高级别管理),而不是由 UDP 协议本身拼写出来的。

I heard I need UDP hole punching... If I need to implement hole punching instead should I use TCP only or I should learn hole punching for any cost ?

UDP 打洞是一种可能性,但它很复杂,并且不能 100% 保证所有 NAT 都兼容。相反,您可以仅使用 TCP 构建您的游戏,然后在它运行和部署后,尝试更高级的通信通道,例如 UDP 打孔或 WebRTC 数据通道。