VNC源码研究(一)

 

 

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

独特的计算环境。 

     RFB 协议可进行可靠的传输,如字节流或基于消息的。和大多数协议一样,它也是通过TCP/IP 协议簇连接。

协议由三步完成连接:

首先是握手报文,目的是对协议版本和加密方式进行协商。

第二步是初始化报文,主要用于客户和服务器的初始化消息。

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

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

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

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

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

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

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

 

二、

VNC (Virtual Network Computing)是虚拟网络计算机的缩写。VNC 是一款优秀的远程控制工具软件,由著名的AT&T 的欧洲研究实验室开发的。VNC 是在基于UNIX 和Linux操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和Windows 和MAC 中的任何远程控制软件媲美。 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。大多数情况下我只需要其中的两个命令:vncserver 和 vncviewer。

VNC(Virtual Network Computing)基本上是属于一种显示系统,也就是说它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上. Windows服务器中包含的"Terminal Server"、Symantec公司开发的收费软件PCAnywhere、近期流行的Teamviewer、国内的协通XT800(快递通KDT)都是属于这种原理的设计,同时这些软件又在VNC的原理基础上做了各自相应改进,提高了易用性、连通率和可穿透内网(Teamviewer、协通XT800、KDT).

  VNC是由 AT&T实验室所开发的,其采用GPL(General Public License)授权条款,任何人都可免费取得该软件。VNC软件要由两个部分组成:VNC server 及VNC viewer。用户需先将 VNC server安装在被远程操控的计算算机上后,才能在主控端执行VNC viewer 进行远程操控。 类似的技术为 RDP(Remote Desktop Process),称为“远程桌面连接”,此外,还有一套由mantec 公司推出的 pcAnywhere 软件也具有类似功能。 VNC、RDP、pcAnywhere等均为远程登录 Telnet 的图形化界面软件,由 Telnet 软件发展而。

VNC工作流程

  (1) 在服务器端启动 VNC Serve。

  (2) VNC客户端通过浏览器或 VNC Viewer 连接至VNC Server。

  (3) VNC Server传送一对话窗口至客户端,要求输入连接密码, 以及存取的VNC Server显示装置。

  (4) 在客户端输入联机密码后,VNC Server验证客户端是否具有存取权限。

  (5) 若是客户端通过 VNC Server 的验证,客户端即要求VNC Server显示桌面环境。

  (6) VNC Server通过X Protocol 要求X Server将画面显示控制权交由VNC Server负责。

  (7) VNC Server将来由 X Server 的桌面环境利用VNC通信协议送至客户端, 并且允许客户端控制VNC Server的桌面环境及输入装置。

特点
  同样可能远程连入UNIX、Linux进行图形化操作的还有流行的Xmanager,VNC与之相比——两者工作原理不一样,前者(VNC)是远程连入操作系统,所有操作在UNIX、Linux主机服务端进行,即使操作过程中“本地电脑与操作主机网络断开”,也不影响操作的顺利进行;而后者(Xmanager)是通过端口将主机服务器的UI界面引导到本地电脑进行展现,如操作过程出现“本地电脑与操作主机网络断开”,操作将中断失败!如果操作都进行的工作任务非常重要,不能中断,如ORACLE RAC实施,结果是灾难性的!更重要的是,VNC是免费的、开源的,Xmanager你可能用的是破解注册版的。

组成部分

VNC基本上是由两部分组成:一部分是客户端的应用程序(vncviewer);另外一部分是服务器端的应用程序(vncserver)。VNC的基本运行原理和一些Windows下的远程控制软件很相象。VNC的服务器端应用程序在UNIX和Linux操作系统中适应性很强,图形用户界面十分友好,看上去和Windows下的软件界面也很类似。在任何安装了客户端的应用程序(vncviewer)的Linux平台的计算机都能十分方便的和安装了服务器端的应用程序(vncserver)的计算机相互连接。另外,服务器端 (vncserver)还内建了Java Web接口,这样用户通过服务器端对其他计算机的操作就能通过Netscape显示出来了,这样的操作过程和显示方式比较直观方便。

命令描述

 

       vncserver

  此服务程序必须在在主(或遥控)计算机上运行。你只能作为使用者(不需要根用户身份)使用此项服务。

  vncviewer

  本地应用程序,用于远程接入运行vncserver的计算机并显示其环境。你需要知道远程计算机的IP地址和vncserver设定的密码。

  vncpasswd

  vncserver的密码设置工具。vncserver服务程序没有设置密码将不能运行(好习惯)。如果你没有设置,运行vncserver时它会提示你输入一个密码。所以,一般我不会单独运行这个命令来设置密码。

  vncconnect

  告诉vncserver连接到远程一个运行vncviewer的计算机的IP和端口号。这样我就可以避免给其他人一个接入的密码。

  Xvnc

  一个vnc“主控”程序,一般来说不需要直接运行。(vncserver和vncviewer实际上是Xvnc的脚本)

  查找所有可用的选项,运行:

  Xvnc --help

  出于安全的考虑,一般不建议直接以超级用户帐号运行vncserver程序。如果你需要超级用户的环境,请以一般用户登录后再使用su命令登录到超级用户帐号。

  VNC运行的工作流程如下:

  (1) VNC客户端通过浏览器或VNC Viewer连接至VNC Server。

  (2) VNC Server传送一对话窗口至客户端,要求输入连接密码,以及存取的VNC Server显示装置。

  (3) 在客户端输入联机密码后,VNC Server验证客户端是否具有存取权限。

  (4) 若是客户端通过VNC Server的验证,客户端即要求VNC Server显示桌面环境。

  (5) VNC Server通过X Protocol 要求X Server将画面显示控制权交由VNC Server负责。

  (6) VNC Server将来由 X Server的桌面环境利用VNC通信协议送至客户端,并且允许客户端控制VNC Server的桌面环境及输入装置。

 

7、测试vnc

  7.1、使用java连接vncserver

  在浏览器中输入http://192.168.0.10:5801登录桌面。

  7.2、使用vnc viewer连接vncserver

  打开vnc viewer,在server中输入192.168.0.10:1进行连接。

  注意:192.168.0.10替换成自己的服务器IP。

 

三、

VNC由Olivetti & Oracle研究室所開發,此研究室在1999年併入美國電話電報公司(AT&T)。AT&T於2002年中止了此研究室的運作,並把VNC以GPL釋出。

由於VNC以GPL授權,衍生出了幾個VNC軟體:

RealVNC:由VNC團隊部份成員開發,分為全功能商業版及免費版。 
TightVNC:強調節省頻寬使用。 
UltraVNC:加入了TightVNC的部份程式及加強效能的圖型映射驅動程式,並結合Active Directory及NTLM的帳號密碼認證,但僅有Windows版本。 
Vine Viewer:MacOSX的VNC用戶端。 
這些軟體各有所長,例如UltraVNC支援檔案傳輸以及全螢幕模式。而這些軟體間大多遵循基本的VNC協定,因此大多可互通使用。

http://www.realvnc.com/   REALVNC

http://www.tightvnc.com/   TIGHTVNC

http://ultravnc.com/        ULTRAVNC

 四、这里记录TightProjector的安装过程:

说明:如上面所讲到的,我们这里下载的VNC具有特性:“VNC与之相比——两者工作原理不一样,前者(VNC)是远程连入操作系统,所有操作在UNIX、Linux主机服务端进行,即使操作过程中“本地电脑与操作主机网络断开”,也不影响操作的顺利进行;”。

1、下载

 

 

得到

它只有387K。

 

 

2、安装在服务器与客户机上都安装上此软件。

安装目录里的文件有:

安装后得到两个程序:

TightProjector是服务端,TightReceiver是客户端。

 

3、

正常现象如下图:

(1)当我们把鼠标移到客户端的窗口时,鼠标是消失的。

(2)客户端的窗口是大小不变的。

(3)

发现一个现象:

服务端(即主机)显示了锁定界面,可是客户端还是显示桌面。

 

 

五、tightProject实现方法研究

 

 

六、这里记录tightVnc 的安装过程:

1、下载安装

(1)服务端TightVNC Service下载

 

我们下载32位的,安装文件为:

安装过程提示:

这里有个是否注册为系统服务、是否允许发送Ctrl-Atl-Del的开关。这个开关的影响我们后面会讲到。

 

接下来会要求输入远程访问的密码及管理员密码(当有多个用户时可以用管理员密码登录)

 

接下来会弹出“运行身份”的对话框,选择以哪个账户运行这个程序。

 

安装完成后TightVNC程序的运行文件有:

 

 

 

运行界面如下:

从下面看是既支持客户端Viewer连接,也支持WEB端连接。我们是以客户端连接Viewer来讲的。

 

在访问控制TAB中可以设置访问的IP地址。

(2)客户端安装

下载后得到文件:

 

 

2、运行后的界面

OPtION选项的内容为:

“Let remote server deal with mouse cursor”那么Viewer不显示鼠标,只是一个小点,但都可操作。

 

 

 

 

3、运行后的效果如下:

4、在有屏保时,Viewer显示很卡。且屏保无法去掉,服务端去掉屏保后View中无更新。是黑的,得在服务端中进入解锁才可得到图像。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

枚举的一些常用操作

本章将介绍以下几点: 1、如何把其它类型转换为枚举类型? 2、如何把枚举中的值添加到下拉菜单中? 一、如何把其它类型转换为枚举类型? 我们回顾一下有关字符串与数字之间的转换,如: string strValue&quo…

10个开源免费的电子商务平台(转自伯乐在线)

如今,人们几乎可以在网络上购买到绝大部分东西,从电子产品、衣服,到机票预订和订餐。购物已转移到互联网,你所做的,只是需要付钱。当然,消费者会 非常注重网站的用户体验。所以,一个整洁安全的平…

【Git、GitHub、GitLab】五 git中裸仓库.git下的内容

上一篇文章学习了git的文件重命名与git -log 的系列命令的使用方法。点击链接查看上一篇文章:【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史 本篇文章学习git中,在没有远端服务器的情况下,裸仓库.git中…

【Git、GitHub、GitLab】六 GIT中commit、tree和blob三个对象之间的关系

上一篇文章学习了git裸仓库.git中的内容,点击查看上一篇文章:【Git、GitHub、GitLab】五 git中裸仓库.git下的内容 本篇文章记录学习git中commit、tree和blob三个对象之间的关系。 首先需要会使用下面的命令: cat 命令, 功能&am…

【Git、GitHub、GitLab】十 将git仓库备份到本地

上一篇文章学习记录了工作中常用的一些git命令,点击链接查看:【Git、GitHub、GitLab】九 工作中非常重要的一些git用法 文章目录1 git的传输协议2 如何将git仓库备份到本地2.1 使用哑协议备份2.2 使用智能协议备份1 git的传输协议 哑协议与智能协议的区别…

java-XML

XML不再多说,XML 约束也不用说了,这里讲讲java如何对XML操作。 java中使用XML,目前常用的就是Jaxp(sun)和dom4j了,这里先讲讲java自带的Jaxp包 JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包…

【C语言进阶深度学习记录】一 数据类型的本质与变量的本质

今天学习C语言中的数据类型的本质与变量的本质 文章目录1 什么是数据类型2 变量的本质3 数据类型与变量的关系4 自定义数据类型与创建变量5 总结1 什么是数据类型 数据类型可以理解为固定内存大小的别名数据类型是创建变量的模子 如同下面的图示,各个数据类型是代…

使用第三方Markdown编辑器编辑为知笔记

前言 为知笔记默认的编辑器并没有预览功能,而提供的MD编辑器插件也并不是很好用,但为知笔记提供了可以使用第三方编辑器的功能,Typora编辑器是目前最优秀的Markdown编辑器之一,可以很好作为第三方编辑器。 Typora介绍 Typora是…

【C语言进阶深度学习记录】二 有符号与无符号

今天学习C语言中的有符号与无符号 文章目录1 计算机中的符号位1.1 有符号数的表示法1.2 无符号数的表示法1.3 signed 和 unsigned2 实验-当有符号数与无符号数进行运算3 错误的使用了unsigned4 总结1 计算机中的符号位 C语言中,数据类型的最高位,用于标…

【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法

相信大多数人知道整形数在内存中的分布方式,而且也能很容易写出其二进制的形式,但是对于浮点数,估计知道的人并不是很多今天学习在C语言中浮点数在内存中的表示方法 文章目录1 浮点数在内存中的存储方式1.1 浮点数的转换步骤1.2 浮点数的转换…

【C语言进阶深度学习记录】四 C语言中的类型转换

今天学习C语言中的类型转换,包括隐式类型转换和显示类型转换 文章目录1 C语言中的数据类型转换1.1 强制类型转换1.11 强制类型转换代码分析1.2 隐式类型转换1.21 隐式类型转换代码分析2 总结1 C语言中的数据类型转换 C语言中,可以进行数据类…

【C语言进阶深度学习记录】五 C语言中变量的属性

上一篇文章学习了C语言中的类型转换,点击链接查看:【C语言进阶深度学习记录】四 C语言中的类型转换. 文章目录1 C语言的变量属性1.1 auto关键字1.2 register关键字1.3 static 关键字1.4 代码案例分析1.5 extern 关键字1.6 代码案例分析2 总结1 C语言的变…

【C语言进阶深度学习记录】六 C语言中的分支语句

文章目录1 if 语句的分析1.1 if 语句中零值比较的注意点2 switch 语句的分析3 if 与switch语句使用代码案例分析4 if语句与switch语句的互换5 总结1 if 语句的分析 if 语句根据条件选择执行语句else 不能独立存在,且总是与距离它最近的if匹配else 语句可以连接其他…

【C语言进阶深度学习记录】七 C语言中的循环语句

文章目录1 循环语句分析1.1 do...while循环1.2 while循环1.3 for循环1.4 三种循环语句使用对比2 break和continue的区别3 总结1 循环语句分析 C语言中的循环语句主要有for循环,while循环和do…while循环。 循环语句的基本工作方式: 通过条件表达式判断…

【C语言进阶深度学习记录】八 C语言中void的分析

文章目录1 void的意义1.1 不存在void变量1.2 C标准1.3 void指针的意义1.4 通过void* 实现memset函数2 总结1 void的意义 void修饰函数的参数和返回值的时候: 如果函数没有返回值应该将其返回值声明为void如果函数没有参数,应该将函数的参数声明为void如…

【C语言进阶深度学习记录】九 C语言中const的详细分析

文章目录1 const的分析2 const本质的分析实验2.1 代码案例分析3 const修饰函数参数和返回值时的情况3.1 代码案例分析4 总结1 const的分析 不管是C语言还是C语言,const都是一个非常重要的关键字。今天这篇文章着重学习记录C语言中的const。C语言中稍有不同。 在C语…

【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结1 空struct的大小 C语言中的struct可以看成是变量的集合 如果一个struct里面什么都没有&#…

【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析

文章目录1 enum 枚举类型的使用方法1.1 enum枚举类型的特殊意义1.2 代码分析:enum的使用2 sizeof 关键字的用法2.1 代码案例分析:sizeof的本质3 typedef的意义3.1 代码案例:typedef 的使用案例4 总结1 enum 枚举类型的使用方法 enum是C语言中…

【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

文章目录1 C语言中的单引号和双引号1.1 双引号带来的BUG2 总结1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量C语言中的双引号用来表示字符串字面量,存储于全局的只读存储区 注意上面的字符与字符串的区别 下面的程序片段是否合法? 上面…