• VNC源码研究(一)VNC简介


         VNC全名:Virtual Network Computing,虚拟网络计算。是由英国剑桥大学的AT&T实验室2002年开发的,它是一种可操控远程计算机的软件,也就是说它能够将完整的窗口画面通过网络传输到另一台计算机的屏幕上

    VNC软件主要由两个部分组成:VNC server及VNC viewer。用户需先将VNC server安装在被控端的计算机上后,才能在主控端执行VNC viewer控制被控端在windows中也由一套著名的网络遥控软件――Symantec公司推出的pcAnywhere。VNC server与VNC viewer支持多种操作系统,如Unix系列(Unix,Linux,Solaris等),windows及MacOS,因此可将VNC server 及VNC viewer分别安装在不同的操作系统中进行控制。如果目前操作的主控端计算机没有安装VNC viewer,也可以通过一般的网页浏览器来控制被控端。

         VNC采用RFB通信协议。RFB ("remote 帧缓存 ") 是一个远程图形用户的简单协议,因为它工作在帧缓存级别上,所以它可以应用于所有的窗口系统,例如:X 11,Win dows 和 Mac 系统。

    远程终端用户使用机器(比如显示器、键盘 鼠标)的叫做客户端,提供帧缓存变化的被称为RFB 服务器。 

    RFB 是真正意义上的 “瘦客机”协议。RFB 协议设计的重点在于减少对客户端的硬件需求。这样客户端就可以运行在许多不同的硬件上,客户机的任务实现上就会尽量的简单。 

    RFB 协议对于客户端是无状态的。也就是说:如果客户端从服务器端断开,那么如果它重新连接相同的服务器,客户端的状态会被保存。甚至,一个不同的客户端可以用来连接相同的RFB 服务器。而在新的客户端已经能够获得与前一个客户端相同的用户状态。因此,用户的应用接口变的非常便捷。 

    只要合适的网络连接存在,那么用户就可以使用自己的应用程序,并且这些应用会一直保存,即使在不同的接入点也不会变化。这样无论在哪,系统都会给用户提供一个熟悉、 

    独特的计算环境。 

         RFB 协议可进行可靠的传输,如字节流或基于消息的。和大多数协议一样,它也是通过TCP/IP 协议簇连接。协议由三步完成连接。首先是握手报文,目的是对协议版本和加密方式进行协商。第二步是初始化报文,主要用于客户和服务器的初始化消息。最后就是正常 
    协议的交互,客户端可按需发送消息,然后可以获得服务器的回复。所有的消息类型开始,接下来是特定的消息数据 

         握手始于服务器向客户发送协议版本的消息,告知客户服务器所能支持RFB 协议的最高版本号。此时客户端会发送相似的消息告诉服务器将要使用的协议版本。客户端不应该请求高于服务器的协议版本。如此一来就给客户和服务器端提供了一种向后兼容机制。 
    目前发布的协议版本主要有3.3  3.7  3.8  (3.5版本被报告存在问题),对于新的编码和伪码方式版本号不需要进行修改,因为服务器端可能忽略它不能识别的版本。 

         一旦协议版本被确定,服务器和客户端必须一致同意连接的安全类型。服务器发送所支持的安全类型,当客户端支持服务器的某一种安全类型,客户端选择这种安全认证类型并发送给服务器。否则客户端发送失败,并标识出失败原因。
     

    安全认证有多种,有一种为VNC安全认证,当用VNC认证的时候,协议数据采用明文发送,服务器发送一个16字节的随机数验证给客户端,客户端用DES对验证进行加密,用用户密码作为密钥回复给服务器16字节,这时服务器会返回安全结果给客户端。如果成功就进入初始化报文阶段。不成功就关闭连接。

         当安全认证成功后,客户端会发送客户端是否共享服务器初始化报文,当客户端设置报文为可共享时,服务器查看当前配置是否允许共享连接,如果同意,则不关闭之前连接的客户端,否则断开之前连接的客户端。 

        这时服务器会发送客户端初始化信息。这些信息包括:服务器上帧缓存的高宽,像素格式还有与桌面相关的名称,其中服务器象素定义服务器本来的象素格式,这种象素格式会被一直使用,除非客户端使用设置象素格式消息来请求另一种象素格式。

    如果真彩标志是零,那么服务器使用的象素值不是直接由红、绿、蓝的亮度组成,但是 

    服务为了索引到颜色图中去,颜色图中的项目是由服务器使用 “设置颜色面板条目”消息进行设置的。 

    至此初始化报文阶段完成,进入协议交互阶段。 

        协议交互分为客户到服务器消息和服务器到客户消息 

    未完待续。。。。 

  • 相关阅读:
    数据库(四)—— Redis数据库
    数据库——MySQL乐观锁与悲观锁
    Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
    centos7 php7 安装composer时Failed to decode zlib stream解决办法
    PHP 迭代器模式
    PHP 装饰器模式
    PHP 原型模式
    PHP 观察者模式
    PHP 策略模式
    PHP 适配器模式
  • 原文地址:https://www.cnblogs.com/xingyayang/p/2059524.html
Copyright © 2020-2023  润新知