Lua 网络编程 - 通过“关闭”的端口传递数据

这可能有点难解释,但我会尽力。

我有一个 Lua 程序,旨在通过网络传输一些数据。特别是互联网。程序实际传输的数据只是存储在 UDP 数据包中的字符串。一般来说,程序的操作方式如下:

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

在本地网络上,这个程序工作得很好。'主机' 模式的目的是让多个客户端连接到主机,并让主机将一个客户端的数据包转发到所有当前注册的客户端。端口选择是任意的,客户端对随机端口的选择只是为了允许从单个计算机进行调试和测试。这已在物理网络上的两台或多台计算机上进行了测试,并成功运行。然而,当我尝试在互联网上运行时,却无法运行。我知道端口是关闭的,这就是为什么它不能工作的原因。但是,因为我将要分发这个程序(私下),我不能期望每个人在他们的路由器上打开端口(或知道如何打开)。目前安全性不是该程序的问题,并且应该在当前状态下被忽略。也就是说,我认识到在通过网络使用此程序时可能会出现许多问题,我接受了这一点。那么,主机和客户端如何在互联网上通信而不必打开端口呢?

我会详细解释 - 例如,浏览器。虽然技术与我所做的有很大不同,但更容易描绘 - 浏览器从 Web 服务器请求数据,然后将数据发送回客户端。但等等,如果路由器处于默认状态(我希望如此),所有端口都关闭了?如果端口关闭,客户端如何接收数据?

我希望这有点意义,而我不像个完全的傻瓜。

点赞
用户3614411
用户3614411

我成功地找到了一些适合的库和工具,能够通过互联网进行通信(NAT穿越是我现在熟悉的术语),这些库是由NMAP提供的。这些库包括一个用LUA实现STUN的库,以及大量其他有用的网络相关库和脚本。

实际上回答我的问题(非常简单),客户端和服务器都在所谓的NAT网关后面。由于IPv4地址的限制,NAT网关被实现来绕过IPv4的这种限制(总共约42亿个地址),通过将客户端的内部网络与外部网络 - 在这种情况下是互联网 - 分开。NAT被提供了一个单一的IP地址,然后NAT为其内部网络中的所有用户提供一个相应于它们所在网络的IP地址。因此,设备不能直接访问,除非将连接从NAT网关(通常是路由器)转发到客户端。但是,当使用UDP连接时,NAT网关会打开一个端口用于此连接,该端口在连接结束后关闭。打开的端口与客户端打开连接时指定的端口不同,这就是STUN方法派上用场的地方。STUN允许主机找到客户端正在连接的端口并将数据发送回此端口,以便用户可以接收它。请注意,这是有关该技术工作原理的极其简单的解释,我建议阅读维基和一些STUN的请求注释

2016-06-21 09:08:29