瘦客户端那些事 - NoMachine的秘密

简介:

上篇中我们介绍了各种远程传输协议用于实现瘦客户端,在各种协议当中,NX要我要重点推荐和介绍的。理由很简单,性能!大家都知道,网络带宽、网络传输是瘦客户端的重大瓶颈,谁能够在低带宽、慢速率的网络环境下工作良好,谁就是王者。本文将讲述NoMachine是如何做到这些的。

199x年,满怀梦想的Keith Packard,当时工作于SuSE,是XFree86的核心开发成员,一心想要开发一个在低带宽下依然性能完好的传输协议(LBX - Low Bandwidth X)。他为了LBX倾注心血,将LBX视为自己的孩子,然而最后他还是失败了,LBX最终并没有得到广泛应用。原因是LBX的性能还不够好。于是,他在2001年写一篇LBX的验尸报告 - An LBX Postmortem,以告慰后人,想要实现这样一个高性能的协议是多么的不可能。

2001年3月,XFree86的邮件组里横空出现了一篇题为About our effort at NoMachine的文章,作者是Gian Filippo Pinzari。文章隆重的介绍了经过作者三年研究,在低带宽下依然工作良好的,兼容RDP,VNC等协议的NX协议。Gian将NX的核心组件基于GPL开源出来,他说,“它就在这,大家都来用吧!”。

Gian的公司NoMachine开发的NX Client、Server等都是收费的产品。但是NX核心组件是开源的,于是出现了大量的开源的NX Client和NX Server。比如,NX Client就有OpenNX,QtNX,NX Server又有FreeNXNeatX等等。

NoMachine的NX是如何做到的呢?NoMachine的秘密,主要有三个:
1. 在X协议的基础上,使用优化的压缩算法,进行压缩传输。压缩比达到10:1,甚至100:1。
2. 在客户端和服务端使用了缓存机制(Cache),避免同样的数据进行不必要的重复传输。
3. 减少客户端与服务端请求、回应的时间。

NX使用

NoMachien的NX主要分为两部分:NX Client和NX Server。NX Server的部署见文档,还不算复杂。部署完成后,就可以使用NX Client进行连接了。NX Client有Windows版本,Linux版本,Mac版本和Solaris版本。

NxNoMachine

点击“Configure”进行设置,可以看到,NX支持多种桌面协议。

nomachine-protocol

如果要单独运行某个远程的应用程序,点击“Settings..”进行设置,比如,运行Linux中的星际译王(stardict)

nomachine-run-app

以下是我在Win7下运行远程服务器中的文本编辑器(gedit)和星际译王(stardict)的效果:

nomachine-demo

NX可以设置共享本地磁盘,默认情况下,远程应用访问的远程设备。比如,在gedit中点击打开,可以看到

nomachine-filesys


NX组件

我们知道,NX是在X11的基础上优化而来的。我们先来回忆以下X11的工作过程。

x11

 

X Server和X Client是通过X11协议直接通讯的,我们之前讲到过,NX基于X11做了如下的优化:

1. 使用压缩传输。

2. 使用缓存机制。

下面就来看看NX是如何工作的:

nx

 

可以看到,X Server和X Client不直接通讯了,而是通过NxProxy进行通讯。用户端的X Server误以为NxProxy就是X Client,使用原生的X11于其通讯,而用户端的NxProxy接收到X11协议数据后,经过压缩,再通过NX协议与服务端的NxProxy通讯。在服务端,NxProxy内嵌于NxAgent中,NxAgent再将NX协议与X11进行转化,并且冒充X Server与X Client进行通讯,从而达到优化的目的。NxAgent是从XNest演变过来的,既充当X Server又冒充X Client。


上图还可以看到,用户端和服务端的NxProxy都对数据进行了缓存。这样,他们之前传输数据时,可以将不变的数据缓存起来,传输的只是差异数据。

接下来我们来看看完整的交互过程:

nxserver


当用户端的NxClient,比如OpenNX启动连接后,会通过客户端的一个NxSsh组件与服务端的NxServer建立连接(Connect),确认连通之后,NxSsh会向NxServer发出Start Session命令,命令包含需要启动桌面还是哪个应用程序,分辨率是多少等等。服务端收到命令后,准备好Session所需环境,然后启动NxAgent,内置的NxProxy也同时启动起来,同时,需要服务端执行的应用程序也被NxServer执行起来。随后,NxServer生成一个Xauth Cookie(相当于访问令牌)并返回给NxSsh,NxSsh收到Xauth Cookie后,再启动NxProxy,并且通过Xauth Cookie与服务端的NxProxy取得了联系。

Nxservice

用来把其他组件以服务方式启动的东西

NXWin

NX的X Server,从cygwin/X演变过来的

Nxagent

从XNest演变而来。在服务端,作为一个假装的X Server,与服务端程序进行交互,接收绘图命令(X协议),但并不绘制任何窗口,而是将X协议转换为NX协议(压缩,减少传输次数),然后传递给服务端的nxproxy

Nxproxy

客户端和服务端都执行,保存缓存,并且互相传输NX数据。服务端中,nxproxy集成到了nxagent中

Nxssh

负责与服务端建立连接,并启动nxproxy

Xauth

用于用户验证,相关信息保存在.XAUTHORITY文件中


NX与VNC,RDP

前面我们讲过,NX基于X11,同时还能兼容VNC和RDP协议,那么它是如何兼容的呢?首先,我们再回头看看NX于X11是如何结合的。

nx-x

这个图和我上面的“NX基本组件流程图”是一样的。可以看到,关键部分是nxagent,负责将X11与NX进行了转换。接下来,我们继续看通过NX连接VNC服务端的过程:

nx-vnc


原来还是通过agent,将NX协议与RFB协议进行了转换。这样,用户通过NX连接VNC Server,其实是通过NX Server访问VNC Server,然后再将信息通过NX协议传输回来,最终还是通过X Display Server在用户本地显示。RDP也是同样的原理:

 nx-rdp

下面是一个完整的图:

nx-full


NX Library编译

NX的Library使用GPL开源协议,意味着我们也可以使用NX Library开发我们自己的NX Server或Client。首先,我们必须解决编译的问题。NX Library的编译过程并不复杂。

在Linux环境下,参考官方文档:编译步骤如下:

复制代码

需要先安装:  
yum install libjpeg  
openssl
-devel  
netcat  
expect  

源码安装libpng  
wget http:
//download.sourceforge.net/libpng/libpng-1.4.3.tar.gz

下载以下包,比如,下载到:~
/NX  
nxcomp
-3.3.0-4.tar.gz  
nxproxy
-3.3.0-2.tar.gz  
nxagent
-3.3.0-13.tar.gz  
nxcompext
-3.3.0-4.tar.gz  
nxauth
-3.3.0-1.tar.gz  
nxcompshad
-3.3.0-3.tar.gz  
nx
-X11-3.3.0-6.tar.gz  

解压所有:  
find .
-name "*tar.gz" -exec tar -zxf {} \;  

编译:  
cd nx
-X11  
/make World  
cd ..  
cd nxproxy  
.
/configure && make  

cp
-a nx-X11/lib/X11/libX11.so* /usr/NX/lib  
cp
-a nx-X11/lib/Xext/libXext.so* /usr/NX/lib  
cp
-a nx-X11/lib/Xrender/libXrender.so* /usr/NX/lib  
cp
-a nxcomp/libXcomp.so* /usr/NX/lib  
cp
-a nxcompext/libXcompext.so* /usr/NX/lib  
cp
-a nxcompshad/libXcompshad.so* /usr/NX/lib  
cp
-a nx-X11/programs/Xserver/nxagent /usr/NX/bin  
cp
-a nxproxy/nxproxy /usr/NX/bin  

设置LD_LIBRARY_PATH  
export LD_LIBRARY_PATH
=/usr/NX/lib:$LD_LIBRARY_PATH  

这时,/usr/NX/bin/nxproxy 和 /usr/NX/bin/nxagent 应该可以用了

复制代码

 

Window平台下,NXWin的编译过程,参考这里

复制代码

下载:
nx-X11-compat-X.Y.Z-N.tar.gz  
nxwin-X.Y.Z-N.tar.gz  
nxauth-X.Y.Z-N.tar.gz  
nxcomp-X.Y.Z-N.tar.gz  

在cygwin中,执行:
# tar zxvf nx-X11-compat-X.Y.Z-N.tar.gz
# tar zxvf nxwin-X.Y.Z-N.tar.gz
# tar zxvf nxauth-X.Y.Z-N.tar.gz
# tar zxvf nxcomp-X.Y.Z-N.tar.gz
# cd nxcomp
# ./configure
# make
# cd ..
# cd nx-X11
# make World

复制代码


NX Cilent开发步骤

基于NX Library开发一个NX Client并不是什么难事,在freenx的svn库里有好几个NX Client工程,比如:qtnx,还有Python的实现版本gnx(仅限linux系统),因此,可以参照这些工程的实现。

svn co http://svn.berlios.de/svnroot/repos/freenx/trunk freenx

NX Client与NX Server的交互过程见:NX Client开发步骤

 

瘦客户端那些事 系列:

瘦客户端那些事 - 开篇

瘦客户端那些事 - 远程传输协议

瘦客户端那些事 - NoMachine的秘密

 

 

 

本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2010/10/07/thinclient-secret-of-nomachine.html,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 SQL 分布式计算
Spark核心原理与应用场景解析:面试经验与必备知识点解析
本文深入探讨Spark核心原理(RDD、DAG、内存计算、容错机制)和生态系统(Spark SQL、MLlib、Streaming),并分析其在大规模数据处理、机器学习及实时流处理中的应用。通过代码示例展示DataFrame操作,帮助读者准备面试,同时强调结合个人经验、行业趋势和技术发展以展现全面的技术实力。
1616 0
|
虚拟化 图形学
A5000 vGPU显示模式切换
A5000显示模式切换
1643 0
A5000 vGPU显示模式切换
|
机器学习/深度学习 人工智能 运维
输电线路缺陷检测国内外研究现状
随着我国电网系统的不断发展,基层巡检作业负担越来越重,运维成本越来越高,如何实现输电线路部件缺陷的智能化检测变得愈发重要。同时,由于国家《新一代人工智能发展规划》的提出和国家电网"数字新基建"的部署,人工智能应用于电力设备运维的相关技术得到了快速发展,对输电线路部件视觉缺陷准确检测成为亟待解决的关键问题之一。
2004 0
|
9月前
|
人工智能 安全 搜索推荐
合规风险、汇率损失、用户流失:跨境结算的“三座大山”怎么搬?
跨境电商代购系统面临跨境支付效率低、成本高、合规难和技术滞后等痛点。本文分析四大挑战,并探讨数字钱包、区块链、API与AI等技术解决方案,结合典型案例与未来趋势,助力企业构建高效、低成本、合规的跨境支付体系,推动行业迈向智能化、绿色化发展新阶段。
|
Linux Windows
Nomachine 最简安装与使用指南
这是一篇2022年Nomachine软件的极简安装与使用指南,包括Windows和Linux系统下的安装步骤,以及如何在Windows系统上通过Nomachine远程控制Linux系统的方法。
Nomachine 最简安装与使用指南
|
10月前
|
存储 算法 数据可视化
用Python开发猜数字游戏:从零开始的手把手教程
猜数字游戏是编程入门经典项目,涵盖变量、循环、条件判断等核心概念。玩家通过输入猜测电脑生成的随机数,程序给出提示直至猜中。项目从基础实现到功能扩展,逐步提升难度,适合各阶段Python学习者。
820 0
|
传感器 Web App开发 编解码
基于51单片机的智能热水器设计
基于51单片机的智能热水器设计
495 0
DC-MOTOR直流电机的simulink建模与性能仿真
使用MATLAB2022a和Simulink构建的DC电机模型进行仿真,展示了电机在240V电枢电压和150V励磁绕组输入下的性能。仿真输出包括转速、电枢及励磁电流、电磁转矩随时间的变化。结果以图像形式呈现,揭示了电机在洛伦兹力和电磁感应定律作用下的工作原理,通过电流与磁场的交互转换电能为机械能。直流电机借助换向器维持稳定的电磁转矩,并遵循法拉第电磁感应定律和楞次定律。
|
自然语言处理 监控 数据挖掘
|
安全 Ubuntu Linux
Linux :远程访问的 16 个最佳工具(一)
Linux :远程访问的 16 个最佳工具(一)
1161 1