NX 的到来,第一部分
这是由 FreeNX 开发团队成员 Kurt Pfeifle 撰写的关于他参与 NX 技术的七部分系列文章的第一篇。在本文中,他基本介绍了 NX 和 FreeNX 的内部工作原理,并概述了其未来的发展蓝图。Kurt 在这里描述的大部分内容都可以使用一到两张最新的 Knoppix CD(3.6 或更高版本)进行重现和验证。一个可用的 FreeNX 服务器设置和 NoMachine NX 客户端已包含在 Knoppix 中一年多了。

图 1. 在本地 Windows XP Professional 桌面上使用 Windows 版 NX 客户端查看的远程 KDE 会话。NX 服务器安装在远程 Linux 机器 konstruct@10.160.47.201 上,在窗口框架的左上方标识。
NX 是一种新技术,允许用户通过缓慢或低带宽的网络连接运行远程 X11 会话。NX 的用户体验极佳,响应迅速。有远程 X11 会话经验的用户会对 NX 的速度及其流畅的应用程序交互感到震惊。此外,NX 还可以连接到远程 RDP 和 VNC 会话,并提供比 TightVNC 和 rdesktop 远程访问更大的性能优势。NX 可以从 Linux、Mac OS X、Solaris 和 Windows 工作站以及某些类型的 PDA 设备上完成所有这些操作。
让我们首先定义一下标准。我所说的“慢速链接”或“窄带宽”是什么意思?来自世界某些地方的人们认为 384kb/秒 连接的 DSL 链接是低端连接。对他们来说,更慢的链接甚至不值得考虑。在我看来,低带宽意味着从 ISDN 速度(64kbit/秒)到甚至 GXM 调制解调器速度(9.6kbit/秒 或 9600bits/秒)。一个被快速链接宠坏的开发人员可能看不到改进远程运行的图形应用程序性能的必要性。对他来说,X 往往就足够好了。但对我来说不是。
纯粹的远程 X 连接很糟糕。我真的无法使用它们工作。我过去使用它们是因为没有其他选择。它们仍然感觉迟缓且反应迟钝。即使通过 384kbit/秒 的 DSL 链接,它们也不是什么乐趣。
自从我看到 ICA 在 ISDN 线路上的 Microsoft/Citrix Metaframe Server 访问性能有多好以来,我就羡慕他们的用户。我想要远程 X 具有相同的速度和响应能力。但是我交谈过的每位专家都告诉我:“这是不可能的。你看,Keith Packard 曾经尝试过。他开始创建低带宽 X (LBX) 协议,但即使他也放弃了。阅读他的告别文档 “LBX Postmortem”,你就会明白这是不可能的!”
因此,我阅读了 Keith 关于这个不可能的梦想的结论性证明,日期为 2001 年 1 月。我承认我没有掌握他所有论点的技术细节。我不是开发人员;我无法阅读和理解 C 或 C++ 源代码,而且我不是 X11 专家。我必须相信一些第三方专业知识或我自己使用某个软件的用户体验。
Keith 的结论是基于对真实应用程序和真实网络的测量。他甚至能够接受不尽如人意的结果——他自己的孩子 LBX 未能达到预期,包括他自己的预期。他总结说,LBX 永远无法比使用 ZLIB 压缩的 SSH 更好地工作;而使用 ZLIB 压缩的 SSH 已经唾手可得。因此,他的最终建议只是使用类似下面的东西
ssh -X -C username@remotehost start-my-X-application.command.sh
其中ssh创建连接并为您提供加密和安全,-C提供您可以获得的最佳压缩,并且-X将 X11 输出转发到您的本地 X 显示器。
如果像 Keith Packard 这样有声望的人说,如果不彻底改变应用程序的内部结构,X 网络性能就无法得到显着改善,那就没有希望了,对吧?在这一点上,我表现得很乖巧,放弃了提问。
然而,保持沉默并没有持续多久。我放弃了,直到我偶然发现了 Gian Filippo Pinzari 发布的一篇文章。那是两年多前,确切地说是 2003 年 3 月 23 日。这篇文章的标题是 “关于我们在 NoMachine 的努力”。Gian Filippo 向当时仍然团结的 XFree86 项目的开放邮件列表 forum@xfree86.org 详细介绍了他的公司 NoMachine 中一组开发人员的成就。该小组成功完成了新“低带宽远程 X”应用程序 NX 的第一个版本的工作,该公司开始将其作为商业产品销售。后来,我发现 Gian 向其他收件人发送了类似的消息,包括 Linux 终端服务器项目 (LTSP)、KDE 核心开发人员、GNOME 开发人员、RealVNC、TightVNC 和 rdesktop 邮件列表。开发人员社区因此了解了 NX。
在这些不同的消息中,Gian 暗示了商业 NoMachine NX 服务器产品。他概述的功能听起来足够令人兴奋,但我从他的帖子中获得的另一条消息最让我激动。那是他概述的 NoMachine 已根据 GPL 许可发布了其主要知识产权,即核心 NoMachine NX 库。他写道:“它就在那里,每个人都可以使用它。”
我出去安装了 NX,并立即被它迷住了。其性能与我在 Linux 上见过的任何其他远程 X 或 GUI 连接完全不在一个级别。
更棒的是,我不受 X11 会话的限制。我还可以连接到我们公司网络中的 TightVNC 服务器。当时,它托管在一个远程站点上,通过 ISDN 拨入线路连接。通过 NX 代理链接隧道化 VNC 连接,我体验到的速度提升至少是普通 TightVNC 链接的两倍。

图 2. 使用 NX 在 Windows XP Professional 桌面上查看的 KDE 组群件应用程序 Kontact 的远程实例。Kontact 应用程序可能在同一办公室的其他地方、同一城镇的某个地方、可能在邻国甚至在遥远的另一个大陆的安全、无病毒的 Linux 机器上运行。
此外,NX 还让我可以访问 Windows XP Professional 机器或 MS Windows 终端服务器,它们都使用 RDP(参见图 1 和图 2)。同样,在 NX 上运行 RDP 时,性能和响应速度明显优于通过平面的 rdesktop 连接。
我开始感觉到 Gian Filippo 在他的公告邮件中暗示的内容:“在未来,我们设想一个世界,在这个世界中,任何应用程序都可以从世界任何地方在任何设备上使用。为了实现这一点,我们需要高效地传输和压缩 X-Window。”
自从两年前我通过 NX 接触到低带宽远程桌面访问以来,我学到了很多关于 X Window 系统和远程 X 连接如何工作的知识。我使用 NX 运行了一些基准测试,并且熟悉了 NX 开发人员。我了解了他们的开发路线图。我仍然不是 C 或 C++ 程序员,并且我仍然只能理解 C/C++ 源文件中大约一半的注释。但我学到的东西值得与您分享。我与 NX 开发人员进行了很多电子邮件交流。他们所有人,特别是项目负责人 Gian Filippo Pinzari,都非常友好和耐心,并解释了事情并回答了我所有的问题。
NoMachine 在其 GPL 代码中附带了一个名为 nxcompsh 的命令行实用程序。它用于建立点对点 NX 会话。在 NoMachine 发布的 GPL 核心 NX 组件之上,商业版本的软件作为 NoMachine NX 服务器提供。此版本使安装、配置和运行 NX 变得简单,普通用户可以在几秒钟内完成。
这是 NX 如何实现其非凡性能的早期总结。在本文系列的后续部分中,我们将深入探讨更多细节。
NX 结合了三个基本要素
对通常是 X 流量的内容进行高效压缩
一种智能机制,用于存储和重用(缓存)在服务器和客户端之间传输的数据
大幅度减少多次耗时的 X 往返,使其总数接近于零。
如果需要重复传输等效数据,NX 会从缓存中获取它。如果需要重复传输类似数据,NX 会将该操作简化为差异传输。它通过链接传输的不是完整数据,而只是增量。
这两种技术并非完全是新的。它们以前的实现已经存在,但观察家可能会得出结论,NX 的实现更加优雅。NX 已优化到最后一位。Keith Packard 认为,超越 ZLIB 的压缩几乎是不可能的,并且结果永远无法足够快地执行。他得出结论,往返抑制是成功的关键因素。在 NX 之前,往返抑制对于 X 连接从未变得足够高效。而且由于我不知道的原因,Keith Packard 从未追求过它的解决方案。往返抑制的解决方案是 NX 中代表的最具决定性的突破。它是减少 NX 客户端和服务器之间流量的缺失环节,足以促进可信的低带宽远程 GUI 体验。因此,它创造了一种比普通 ZLIB 好得多的新型 X 压缩技术。
我们将在本系列文章的第 2 部分和第 3 部分中讨论更多关于 NX 往返抑制和流量压缩的内容。
要了解有关 FreeNX 的更多信息,并亲眼目睹远程文档创建、打印和发布的实际工作流程演示,请于 2005 年 8 月 8 日至 11 日访问旧金山 LinuxWorld Conference & Expo 的 Linuxprinting.org 展位(#2043)。我将与其他合作项目的成员一起在那里。
Kurt Pfeifle 是一位系统专家,也是德国斯图加特 Danka Deutschland GmbH 咨询和培训网络打印组的技术负责人。Kurt 在全球开源和自由软件社区中以热情的 CUPS 布道者而闻名;他对 CUPS 的兴趣可以追溯到 1999 年 6 月的第一个 beta 版本。他是 KDEPrint 手册 的作者,并为 KDEPrint 网站 做出贡献。Kurt 还处理 Linuxprinting.org 的一系列事务,并为 Samba 项目编写了大部分打印文档。