Lua 网络 - 通过 'closed' 端口传递数据

Lua Networking - Passing data through a 'closed' port

解释起来可能有点奇怪,但我会尽力的。

我有一个 Lua 程序,旨在通过网络提供一些数据。具体来说,互联网。程序实际传输的数据只是存储在 UDP 数据包中的字符串。概括地说,程序是这样运行的:

  1. 第一个客户端启动程序并指定它们是连接的'host'。该程序在 UDP 端口 6000 上打开一个连接,主循环侦听在该端口上收到的任何数据包。
  2. 第二个客户端启动程序并指定他们将连接到端口 6000 上的 'host'。用户输入 IP,客户端使用 6050 和 7000 之间的随机端口打开 UDP 连接
  3. 当客户端成功连接到服务器时,它们会发送一个 'connection' 数据包,其中只包含一个“202 OK”字符串。 'host' 收到并注册新客户端
  4. 现在连接已经初始化,程序可以使用注册的数据在彼此之间发送数据。

现在,这个程序在本地网络上运行良好。 'host' 模式的目的是让多个客户端连接到主机,并让主机将数据包从一个客户端中继到所有当前注册的客户端。端口选择是任意的,客户端的随机端口选择只是为了允许从一台计算机进行调试和测试。这已经在物理网络上的两台或多台计算机之间进行了测试,并且运行成功。但是,当我尝试通过互联网 运行 时,这是行不通的。我知道端口已关闭,这就是它无法正常工作的原因。但是考虑到我要(私下)分发这个程序,我不能指望每个人都打开他们路由器上的端口(或者知道如何打开)。安全性目前不是该程序的关注点,在当前状态下应予以忽略。话虽这么说,我认识到通过网络使用该程序可能会出现很多问题,我接受这一点。关于主要问题,如何让主机和客户端在不打开端口的情况下通过 Internet 进行通信?

我会详细说明 - 例如,浏览器。尽管这项技术与我正在做的完全不同,但画图更容易——浏览器从 Web 服务器请求数据,然后将其发送回客户端。但是等等,如果路由器处于默认状态(我希望)所有端口都关闭?那么如果端口关闭,客户端如何接收这些数据呢?

我希望这能说得通,我听起来不像个彻头彻尾的傻瓜。

我设法找到了一些合适的库和实用程序,以便能够通过 Internet 进行通信(NAT 穿越现在是我熟悉的一个术语),这些库是由 NMAP 提供的。这些库包括 LUA 中的 STUN 实现,以及其他有用的网络相关库和脚本的 HEAPS。

为了真正回答我自己的问题(非常简单),客户端和服务器位于所谓的 NAT 网关之后。由于 IPv4 地址的限制,NAT 网关通过将客户端的内部网络与外部网络(在本例中为 Internet)分开来绕过 IPv4 的这一限制(总共约 42 亿个地址)。 NAT 提供了一个 IP 地址,然后 NAT 为内部网络中的所有用户提供一个与他们所在网络相对应的 IP。因此,如果不将连接从 NAT 网关(通常是路由器)转发到客户端,则无法直接访问设备。但是,当使用 UDP 连接时,NAT 网关为此连接打开一个端口,该端口在连接终止后关闭。这个打开的端口不同于客户端在打开连接时指定的端口,这就是 STUN 方法的用武之地。STUN 允许主机找到客户端连接的端口并将数据发送回该端口,因此用户可以接收它。请记住,这是对技术工作原理的极其简单的解释,我建议阅读 Wiki and some of the Request for Comments for STUN。