已经有一个问题,像团队查看器这样的远程程序究竟是如何工作的,它给出了一个基本的描述,但我对客户端注册到服务器后通信的工作方式很感兴趣。如果客户端在 NAT 后面,那么它就没有自己的 IP 地址,那么服务器(或另一个客户端)如何向它发送消息?还是客户端只是不断轮询服务器以查看它是否有任何请求?
是否有 LogMeIn 或 TeamViewer 的开源等效项?
已经有一个问题,像团队查看器这样的远程程序究竟是如何工作的,它给出了一个基本的描述,但我对客户端注册到服务器后通信的工作方式很感兴趣。如果客户端在 NAT 后面,那么它就没有自己的 IP 地址,那么服务器(或另一个客户端)如何向它发送消息?还是客户端只是不断轮询服务器以查看它是否有任何请求?
是否有 LogMeIn 或 TeamViewer 的开源等效项?
最简单和最可靠的方法(尽管并不总是最有效的)是让每个客户端与某处知名服务器建立传出 TCP 连接并保持该连接打开。只要 TCP 连接处于打开状态,数据就可以随时在任一方向通过该 TCP 连接。似乎 LogMeIn 和 TeamViewer 都使用这种方法,至少作为一种备用方法。这种技术的主要缺点是所有数据都必须通过 TeamViewer/LogMeIn 公司服务器(这可能成为瓶颈),并且 TCP 不能很好地处理丢弃的数据包——它会停止并等待丢弃的数据包被怨恨,而不是放弃它们并发送更新的数据。
他们有时可以使用的另一种技术(为了获得更好的性能)是UDP hole-punching。该技术依赖于这样一个事实,即许多防火墙将接受来自远程主机的传入 UDP 数据包,防火墙主机最近向这些主机发送了传出 UDP 数据包。鉴于此,TeamViewer/LogMeIn 公司的服务器可以告诉两个客户端将传出数据包发送到另一个客户端防火墙的 IP 地址,之后(希望)每个防火墙将接受来自另一个客户端面向 Internet 的 IP 地址的 UDP 数据包。但是,这并不总是有效,因为不同的防火墙以不同的方式工作,并且可能不包括上述允许 UDP 的逻辑。