NX 的到来,第 4 部分
这是 FreeNX 开发团队成员 Kurt Pfeifle 撰写的关于他参与 NX 技术的七部分系列文章的第四部分。在本文中,他基本介绍了 NX 和 FreeNX 的内部工作原理,同时概述了其未来的路线图。在第 4 部分中,Kurt 解释了 NX 如何与 Windows 终端服务和 VNC 远程设置互操作。Kurt 在本系列中描述的大部分内容都可以使用一个或两个最新的 Knoppix CD(3.6 或更高版本)进行重现和验证。Knoppix 现在已经包含可用的 FreeNX 服务器设置和 NoMachine NX 客户端一年多了。
NX 的工作是通过各种组件完成的。安装它们非常容易,但了解它们如何交互更具挑战性。NX 设置了两个代理系统。其中一个系统,NX 客户端,位于您的本地计算机上。另一个系统位于 NX 服务器上。
两个代理都使用 NX 协议相互通信。NX 协议基于 X11。但是,它实现了一些特殊的扩展,这些扩展提供了在 NX 代理之间产生压缩、缓存和近零往返 X 通信的功能。
NX 代理和 nxagent-agent 加速 X 协议传输
+-------+ +--------+ | | | | | | | | +-------+ | | | | +----------+ | | | | traffic type: | | traffic | | | |traffic:| | NX "protocol" | +-------+ type X: | remote X | | | X |local | (internet, modem) |remote |nxagent| protocol| applicat.| |local X|<------>|nxproxy|<----------------->|nxproxy| <-------------->|(or compl.| |display| | | "roundtrips" | | | | KDE/GNOME| | | | | close to zero | +-------+ | session)| | | | | | | | | +-------+ | | | | +----------+ | | | | | | | | +-------+ +--------+ decompression compression +caching +caching (c) Kurt Pfeifle, Danka Deutschland GmbH <kpfeifle at danka dot de>
本地(NX 客户端)代理与本地 X 服务器通信。它将 NX 协议转换回 X11。这意味着,不需要更改本地 X 服务器即可让 NX 与其一起工作。
远程代理(在 NX 服务器端)与远程 X11 应用程序通信。在那里,它也使用 X11 作为协议。这意味着在远程端,X11 应用程序无需进行修改即可与 NX 一起工作。
远程 NX 代理向 X11 应用程序表现得好像它是其 X 服务器。这就是所有往返发生的地方,也是它们被“解决”的地方。由于往返发生在远程端的 localhost 上,因此它们可以快速解决,因为它们使用快速 UNIX 域套接字。
远程代理包含的是一种影子 X 服务器。它没有连接物理显示器。这部分称为“nxagent”。一旦 nxagent(对于 X 应用程序而言,它看起来像是其 X 服务器)接收到绘图命令和其他 X11 请求,它就会将它们发送到本地 nxproxy。它必须将 X 线协议转换为 NX 线协议。NX 线协议不再包含许多往返。它现在仅携带压缩数据或对缓存元素的引用或差异传输有效负载。
本地和远程代理都存储它们自己的传输数据缓存。这些缓存必须保持同步。只有在同步时,它们才可用于节省 pixmap、图标、X 原始绘图元素等的第二次和所有连续传输。
远程 NX 代理系统的 nxagent 部分最初是从 Xnest 派生而来的。尽管 nxagent 进行了大量修改,甚至有人会说完全重写,但它的行为类似于更熟悉的 Xnest。
Xnest 是一个特殊的 X 服务器,随所有最新的 XFree86 或 X.org 版本一起提供。在其标准版本中,Xnest 在正常的 X 服务器中“嵌套”运行。对于用户而言,它在桌面上显示为一个窗口。此窗口包含另一个 X 服务器的根目录。Xnest 窗口可以嵌入和显示任何 X11 客户端程序的 GUI。Xnest 对于其自身的 X 客户端而言看起来像是真正的服务器,而对于其嵌入的 X 服务器而言,它看起来像是 X 客户端。这样,它同时充当 X 客户端和 X 服务器。
nxagent 大量修改了原始 Xnest 代码,使其成为 NX 代理系统的一个有用组件。除了充当远程 X11 客户端的影子 X11 显示器外,它还将 X11 线协议转换为 NX 请求,并处理流量的压缩和解压缩。
乍一看,NX 似乎引入了显著的开销;但是,NX 的最终结果仍然是远程会话的整体速度提升。以下数据支持此说法
如果通过普通的 vanilla 远程 X 连接运行,则全屏 KDE 3.2 会话启动序列传输 4.1MB 的数据。
如果通过 NX 运行,由于 NX 的组合压缩、缓存和微小差异效应,第二次启动数据传输量降至 35KB。
如果用户可以为每个远程会话拥有至少 40KB/秒的网络带宽(即,相当于调制解调器拨号链接),他们将不会感到远程访问期间网络引起的缓慢。
远程 NX 代理系统不仅限于与 X11 应用程序的链接。它还可以处理另外两种类型的连接请求:Windows 终端服务器 (WTS) 使用的远程桌面协议 (RDP) 会话和虚拟网络计算 (VNC) 服务器使用的远程帧缓冲 (RFB) 会话。
与 nxagent(它将 X11 到 NX 协议请求进行转换)的角色类似,两个单独的代理处理这另外两种协议。nxviewer 负责 RFB 到 NX 协议的转换。它基于 VNC 开发社区的 vncviewer。nxdesktop 负责 RDP 到 NX 协议的转换;nxdesktop 基于 Matt Chapman 的 rdesktop。
如果通过 NX 连接进行隧道传输,这两种连接类型都将获得显著的速度提升。它们充分利用了 NX 缓存和位图压缩功能。无需消除往返。
本地 NX 代理系统不需要额外的组件。无论远程端是 RDP、RFB 还是 X,到达本地端的 NX 都会转换为 X。
跨慢速和低带宽连接的 RDP 和 VNC 会话的总体效率提升至少为 2:1,最高可达 10:1,具体取决于环境的确切参数。
当然,对于大多数企业级用例而言,访问 Windows 终端服务器的 RDP 连接可能是最重要的。能够将普通 rdesktop 访问速度提高 2 到 10 倍是一个巨大的胜利,使系统进入与 Citrix Metaframe/ICA 链接相同的速度级别。
NX 代理和 nxviewer-agent 加速 VNC 传输
+-------+ +-------+ | | | | | | | | +-------+ | | | | | | | | traffic type: | | | |traffic:| | NX "protocol" | | | | X |local | (internet, modem) |remote | |local X|<------>|nxproxy|<----------------->|nxproxy| |display| | | "roundtrips" | | | | | | close to zero | | | | | | | | +-------+ | | | +---------+ | | | | | <--. | | | | | | \traffic: +-------+ +-------+ +-----|-+(agent)| \ RFB |(Tight)| decompression compression| nxviewer| `------>| VNC- | +caching +caching+---------+ |Server | +-------+ (c) Kurt Pfeifle, Danka Deutschland GmbH <kpfeifle at danka dot de>
NX 代理和 nxdesktop-agent 加速 RDP 传输
traffic: +---------+ +----------+ RDP |Windows | |nxdesktop | ,----->|Terminal | +-------+ +-----|-+ (agent)| / |Server or| | | | | | |/ |XP Prof. | | | | | | <--' +---------+ +-------+ | | | +----------+ | | | | traffic type: | | | |traffic:| | NX "protocol" | | | | X |local |(internet, modem)|remote | |local X|<------>|nxproxy|<--------------->|nxproxy| |display| | | "roundtrips" | | | | | | close to zero | | | | | | | | +-------+ | | | | | | | | | | | | +-------+ +-------+ decompression compression +caching +caching (c) Kurt Pfeifle, Danka Deutschland GmbH <kpfeifle at danka dot de>
对于远程 UNIX/X11 会话,您可以选择两种基本操作模式之一:完整的 KDE 或 GNOME 桌面会话或单个应用程序窗口模式。对于完整的桌面会话类型,您可以配置为使用全屏或窗口模式。窗口模式支持可自定义的大小;您可以选择任意纵向 1017 x 666 像素模式,或您认为合适的任何模式。在这里,所选大小的窗口包含您的完整远程 KDE 或 GNOME 会话。它看起来很像在桌面上窗口中运行的 VMware 会话。完整桌面模式速度更快。
单个应用程序窗口模式将显示单个远程应用程序(如 Konqueror 或 KOffice)的浮动窗口放置在您的本地屏幕上。如果您在本地计算机上运行 Windows XP,则这看起来类似于此处显示的屏幕截图。您也可以从在远程主机上运行时在本地桌面上显示 xterm 开始。从 xterm 内部,您可以启动 GIMP。所有 GIMP 的窗口都会自由地浮动在您的本地显示器上,而不会被围栏到另一个窗口中,就像您在 Linux 机器上运行本地版本的 GIMP 一样。
直到最近,此单个应用程序窗口模式的运行速度仍比完整桌面模式慢一些。这种情况从上个月 NoMachine 发布的 NX Core 库1.5.0 版本开始发生了变化。但是,您可能正在使用的 Knoppix 版本仍将在一段时间内使用旧版本)。
速度慢的原因是单个应用程序窗口模式仍然必须在没有远程 nxagent 支持的情况下工作。如您所记,nxagent 派生自 Xnest。但是 Xnest 当前缺少对无根窗口模式的支持。当单个应用程序窗口通过 Xnest/nxagent 时,它们需要无根窗口模式才能摆脱其往返负载。由于这些单个应用程序会话必须绕过 Xnest/nxagent,因此它们无法受益于通常由 nxagent 完成的往返消除。
在 1.5.0 版本中,NoMachine 的 NX 开发人员已成功地将往返消除也纳入了单个应用程序模式。
能够断开会话并重新连接一直是 X11 远程应用程序的“圣杯”。我们一直缺乏可靠的机制来做到这一点,即使它是一项重要的功能。实际上,尽管远程 VNC 连接的性能非常慢,但使 VNC 对其大多数用户有价值的唯一功能是您可以从正在运行的会话中分离很长一段时间,然后再重新连接以找到与之前相同的状态。NX 和 FreeNX 已经支持此功能已有一段时间了。它在最近的 Knoppix 版本中包含的大多数版本的 (Free)NX 中都运行良好。
但是,有一些限制。如果重新连接的工作站具有不同的本地显示分辨率和颜色深度,则无法从不同的工作站重新连接。但是大多数用户都很高兴,只要他们至少可以从自己的工作站重新连接即可。无需担心某些意外的网络问题会中断链接并导致会话丢失,这将带走可能正在处理的打开的远程文档中的所有数据。
基于会话挂起和恢复,现在包含会话迁移功能。我可以从正在运行的 NX 会话中分离,提前下班与一些朋友共进晚餐。稍后,从我的家用 PC,我只需重新连接到我的 NX 服务器并完成我中断的工作。
NX 已经支持从远程会话打印到本地打印机。它运行良好。但是,它仍然需要为每个会话的设置进行一些手动打印机配置。本周,在旧金山举行的 LinuxWorld Expo 期间,FreeNX 团队将演示一种新的远程打印方式。它将成为 .ORG Pavilion 中 Linuxprinting.org 展位 (#2043) 的主要展示演示之一。使用出色的 CUPS 框架,任何远程应用程序都可以查看和访问连接到本地 NX 客户端计算机的任何打印机。这无需任何额外的用户配置即可工作。您可以从本地工作站打印,而无需运行 (Free)NX 会话。启动 NX 会话,您将在那里看到完全相同的打印机。
本周在 LinuxWorld 上,FreeNX 项目正在正式发布 FreeNX-0.5.0,“LWE 旧金山版本 - 无缝打印版本”。新的无缝 NX 打印功能的演示还结合了展位上其他项目的有趣协作工作流程。请过来看看我们。
本系列的下一部分,第 5 部分,将带您了解设置和使用 (Free)NX 服务器和 NoMachine NX 客户端的一些细节。
NX 完整概述
+-----------+ +-------+ RDP |Windows | |nx- | ,---->|Term. Serv.| +-------+ +-------|desktop| / |or XP Prof.| | | | |(agent)| / +-----------+ | | | | <--' +-------+ | | | +-------+ +----------+ | | | | traffic type: | | | | | |traffic:| | NX "protocol" | +-------+ traffic: | remote X | | | X |local |(internet, modem)|remote |nxagent|X protocol| applicat.| |local X|<------>|nxproxy|<--------------->|nxproxy| <---------->|(or compl.| |display| | | "roundtrips" | | | | KDE/GNOME| | | | | close to zero | +-------+ | session)| | | | | | | | | +-------+ | | | +-------+ +----------+ | | | | <--. | | | |(agent)|\ traffic +--------+ +-------+ +-------|nx- | \ RFB |(Tight) | decompression compression |viewer | `------->| VNC- | +caching +caching +-------+ |Server | +--------+ (c) Kurt Pfeifle, Danka Deutschland GmbH <kpfeifle at danka dot de>
Kurt Pfeifle 是一名系统专家,也是德国斯图加特 Danka Deutschland GmbH 咨询和培训网络打印组的技术主管。Kurt 在世界各地的开源和自由软件社区中以热情的 CUPS 布道者而闻名;他对 CUPS 的兴趣可以追溯到 1999 年 6 月的第一个 beta 版本。他是KDEPrint 手册的作者,并为KDEPrint 网站做出了贡献。Kurt 还处理 Linuxprinting.org 的一系列事务,并为 Samba 项目编写了大部分打印文档。