guacamole整体架构

一、    架构


guacamole架构分为三个部分,分别是guacamoleclient、guacamole server、guacamole proxy。

guacamole client由JavaScript实现,一旦它被加载到用户的web浏览器里,它立即连接到guacamoleserver。这二者之间的交互是通过HTTP之上的guacamole 协议完成的。

guacamole server由Java实现,作为web应用部署。它读取guacamole协议的数据,并将之转发到guacd(guacamoleproxy)。

guacamole proxy是原生应用,由C实现,它将guacamole协议的数据翻译成RDP、VNC等协议的数据,并以客户端的身份连接到多个远程桌面服务端。

协议间的翻译由guacd(guacamoleproxy)完成。guacamole server和guacamole client仅仅知道guacamole协议,无需知道使用的是那个具体的远程桌面协议。

guacamole是一个中心化的网关,通过它可以访问多个远程桌面服务端(支持多种远程桌面协议)。它有可扩展的架构,编译定制化开发,还提供了一套基于HTML5进行远程访问的通用API。

1、   协议(guacamole)

guacamole协议是一个远程屏幕绘制和事件传输协议。拥有这两项能力的协议自然而然与远程桌面协议有相同的功能。guacamole协议与远程桌面协议的设计原则不同,guacamole协议本身不实现任何特定桌面系统的远程桌面功能。

guacamole协议是其他现有远程桌面协议的超集。guacamole要支持一个具体的远程桌面协议(比如RDP),只需要实现一个中间层来做两种协议之间的翻译,这与实现一个原生客户端是一样的,只是原生客户端在本地绘制屏幕,这个中间层却将屏幕绘制到远端屏幕。

guacd(guacamoleproxy)就是这个中间层。

2、   远程桌面插件管理模块(guacd)

guacd是guacamole的核心,guacd通过从web应用接收到的指令,动态地加载客户端插件,通过客户端插件连接到具体的远程桌面服务端。

guacd伴随guacamole一起安装,以守护进程的形式在后台运行,监听来自web应用的TCP连接。它本身仅仅支持guacamole协议,它并不支持任何具体的远程桌面协议(比如RDP),它通过加载的客户端插件来实现对具体的远程桌面协议的支持。客户端插件被加载后,就独立运行。客户端插件对自身和web应用之间的交互有完全的自主控制能力,知道客户端插件终止运行。

guacd与客户端插件都基于libguac库开发,这个库提供了对guacamole协议更方便和更抽象的使用方法。

3、   连接及用户管理模块(web application)

它是guacamole系统中,直接与用户交互的部分。

它本身不支持任何其他的远程桌面协议,它依赖于guacd,它本身仅仅作为一个web接口以及权限管理层而存在。

 

二、    协议(guacamole)

1、   协议格式

guacamole的协议由指令组成。指令与指令之间用分号分隔,指令内部是由逗号分隔的列表。每个指令内部的第一个元素是指令的操作码,指令内部所有后续的元素都是这个指令的参数。(注:这里都应该是英文的逗号,分号,下同)

 

操作码,参数1,参数2,参数3,…;

 

指令内部的列表里的每个元素,都有一个十进制的正整数前缀,这个前缀与元素的值通过英文的句号分隔。这个前缀指明表示元素的值的unicode字符的个数,元素是按UTF-8编码的。

 

长度.值

 

服务器发往客户端,或者客户端发往服务器的消息,由任意数量的完整指令组成。客户端发往服务端的消息多数是控制指令(用于建立连接、断开连接)和事件指令(鼠标事件、键盘事件)。服务端发往客户端的消息多数是绘制指令(缓存、裁切、绘图),服务端讲客户端看作远端的屏幕。

 

例如,一个完整有效的用于设置屏幕大小为1024x768的指令如下:

 

4.size,1.0,4.1024,3.768;

 

上述指令将被解码为四个元素:“size”,操作码(也可以叫指令编号,用于区别不同的指令),表示这个指令用于设置屏幕大小。“0”,默认的图层序号(绘制图像的时候有多个图层,这里大概是说第0层,也就是最外层)。“1024”,期望的屏幕宽度,以像素点为单位(就是说期望宽为1024个像素点)。“768”,期望的屏幕高度,以像素点为单位。

 

guacamole的协议格式这样设计是很必要的,因为这样设计使其能以流的形式被传输,而且易于被JavaScript解析。JavaScript确实原生支持类似于XML、JSON这类格式的消息,但是这类格式的消息都不能以流的形式传输。JavaScript在解析这类格式的消息前必须接收到完整的XML或者JSON的包。而guacamole协议的消息,却可以一边接收一边解析。它的指令内每个元素的长度前缀使得解析器不用遍历每个字符就可以完成指令(元素)之间的跳转。

2、   协议握手过程

 

握手的过程是guacamole协议建立连接的过程。以一个“select”指令开始,这个指令从客户端发往服务器端,并告诉服务器加载哪个协议。

 

6.select,3.vnc;

 

服务器接收到“select”指令后,会加载对于的客户端组件,并且回复一个“args”指令,这个指令指明了服务器端需要的参数名列表。

 

4.args,8.hostname,4.port,8.password,13.swap-red-blue,9.read-only;

 

客户端接收到服务端可接受的参数名列表后,需要回复给服务器,自己支持的audio、video、image的mimetype,最佳的屏幕尺寸以及分辨率,以及所有的服务器要求的参数的值,即使是空,也要回复。任意一个要求没被满足,连接都将被关闭。客户端回复给服务端的消息如下。

 

4.size,4.1024,3.768,2.96;

5.audio,9.audio/ogg;

5.video;

5.image,9.image/png,10.image/jpeg;

7.connect,9.localhost,4.5900,0.,0.,0.;(这里就是上一条服务器消息里,服务器要求的参数,客户端把值填上,没有值的,留空白,长度前缀为0,回复给服务器端)

 

为了表示的易读性,我们将每个指令放在单独的一行,但是在真实的协议中,是不换行的,就是说,指令与指令之间没有换行符。事实上,如果一个指令后接的不是一个新指令的开始,连接将被关闭。

 

这个例子中,客户端表明了,最佳屏幕尺寸是1024x768。DPI为96DPI。它支持

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值