
vnc协议分析.doc
20页VNC 协议分析协议分析 简介简介 VNC(Virtual Network Computing)是基于 RFB(Remote Frame Buffer)协议进行通信的,是 一个基于平台无关的简单显示协议的超级瘦客户系统, 由 Cambridge 的 AT&T 实验室设计开发的 vnc 的缺省端口是 main:5900(C/S)和 http:5800(B/S)端口 RFB (远程帧缓存) 是一个远程图形用户的简单协议,因为它工作在帧缓存级别上,所以它 可以应用于所有的窗口系统,例如:X11,Windows 和 Mac 系统 远程终端用户使用机器(比如显示器、键盘、鼠标)的叫做 RFB 客户端,提供帧缓存变化 的被称为 RFB 服务器 RFB 是基于 tcp 的一个应用层协议RFB 是真正意义上的“瘦客机”协议RFB 协议设计的重点在于减少对客户端的硬件需求 这样客户端就可以运行在许多不同的硬件上,客户机的任务实现上就会尽量的简单RFB 协议对于客户端是无状态的也就是说:如果客户端从服务器端断开,那么如果它重 新连接相同的服务器,客户端的状态会被保存甚至,一个不同的客户端可以用来连接相 同的 RFB 服务器。
而在新的客户端已经能够获得与前一个客户端相同的用户状态因此, 用户的应用接口变的非常便捷只要合适的网络连接存在,那么用户就可以使用自己的应用程序,并且这些应用会一直保 存,即使在不同的接入点也不会变化这样无论在哪,系统都会给用户提供一个熟悉、独 特的计算环境显示协议 显示协议是建立在“把像素数据放在一个由 x,y 定位的方框内”这单一图形基础之上的 乍一看上去,把这么多的用户接口组件绘制出来是非常低效的方法但是,允许不同的像 素数据编码方式,使得我们在处理不同的参数(如:网络带宽,客户端的绘制速度,服务 器处理速度)有了很大程度的灵活性通过矩形的序列来完成帧缓存的更新一次更新代表着从一个可用帧缓存状态转换到另一 个可用,因此有点和视频的桢类似尽管矩形的更新一般是分开的,但是并不是必须的显示协议的更新部分是由客户端通过命令驱动的也就是说,更新只是在服务器端响应客 户端的请求时发生的这样就让协议更新质量是可变的客户端/网络越慢,更新速度也就 越慢对于一些应用来说,相同区域的更新是连续不断的如果用一个慢的客户端,那么 帧缓存的缓存状态是可以被忽略的这样也可以减少对客户端网络速度和绘制速度的要求。
输入协议 输入协议是基于标准工作站的键盘和鼠标等设备的连接协议输入事件就是通过把客户端的输入发送到服务器端这些输入事件也可以通过非标准的 I /O 设备来综合例如,手写笔引擎可能产生一个键盘事件像素数据的表示 初始的交互涉及到 RFB 客户端和服务器之间传输像素数据格式和编码方式的协调这种协 调被设计的让客户端的工作尽量简单而设计的底线是:服务器必须按照客户端的要求格 式来提供像素数据如果客户端可以同样的处理多种数据格式或编码格式,那么一般会选 择服务器端易于生成的格式像素格式涉及如何通过像素值来实现不同颜色的重现最常用的一般像素格式是 24 位或 16 位的“真彩色” ,它通过位来直接实现像素值到红、绿、蓝亮度的转换8 位“颜色映 射”可以任意映射像素值到 RGB 亮度的转换编码指一个矩形的像素数据如何通过网线传输每个像素数据的矩形都加上了一个头,给 定矩形在屏幕上的 X、Y 坐标、矩形的宽和高,以及指定的编码类型而后数据本身就是 采用这种特定的编码方式数据本身遵循特定的编码目前的编码方式主要有 Raw、CopyRect、RRE、Hextile 和 ZRLE.在实际应用中我们一般使用 ZRLE、Hextile 和 CopyRect,因为它们提供了典型桌面 的最好压缩。
其他可能的编码方式还包括,用于静态图片的 JPEG 和用于动态图像有效传 输的 MPEG协议可以通过增加新的编码方式来进行扩展协议扩展 协议可以通过以下方式进行扩展:新的编码方式一种新的协议可以通过与现存的客户端和服务端进行相关兼容的添加因为现存的服务器 将会忽略它们所不支持的新编码方式所以客户端通过新的编码方式进行请求也就不会有 结果返回伪编码方式除了真正的编码方式,客户端也可以请求“伪编码”通告服务器,它支持某一协议的扩展 服务器如果不支持这种扩展,那么它将忽略值得注意的是:客户端必须先假设服务器端 不支持这种扩展,直到它获得服务器端支持的确认新的安全方式添加一个新型的安全方式会带来无限的灵活性,它通过修改协议的一些行为,但是并没有 牺牲现存客户端和服务器端的兼容性客户端和服务器端可以通过协议好的安全方式进行 交流,当然并不一定与 RFB 协议类似无论如何你都不应使用不同的版本号RFB 协议的版本是由 RealVNC 公司来制定的如果你使用一个不同的协议版本可能与 RFB/VNC 不兼容,要保证协议的兼容性,请联系 RealVNC 公司这样会减少在编码方式 和安全类型上的冲突协议消息 RFB 协议可以进行可靠的传输,如字节流或基于消息的。
和大多数协议一样,它也是通过 TCP /IP 协议簇连接协议由三步完成连接首先是握手报文,目的是对协议版本和加密方 式进行协商第二步是初始化报文,主要用于客户和服务器的初始化消息最后就是正常 协议的交互,客户端可以按需发送消息,然后可以获得服务器的回复所有的消息以消息类型开始,接下来是特定的消息数据协议消息描述的基本类型有:U8、U16、U32、S8、S16、S32U 表示无符号整数,S 表示有符号整数所有字节整数(除了像素值本身)遵从 big endian 顺序big endian 或者 little endian 跟 cpu 有关,从而影响整数在内存中的排列顺序big endian 是 高字节在前,little endian 是低字节在前,网络字节序一般是 big-endianPIXEL 代表一个像素值 bytesPerPixel 字节,8XbytesPerPixel = bits-per-pixel协议流程协议流程 消息说明消息说明 握手消息 1、vnc 服务器发送所能够支持的最高 RFB 协议版本号给客户端,比如:“RFB 003.006\n” , 即版本号为 3.6,版本号固定格式为×××.×××,不足部分前面补零。
2、客户端回复将要使用的版本号,格式如上客户端的版本号必须小于或等于服务器版本 号这样服务器可以实现向后兼容3、目前发布的协议版本主要有 3.3、3.7、3.8(3.5 版本被报告存在问题) ,最高版本号为 4.0协商安全类型 (一)(一)v3.7 以上版本安全类型以上版本安全类型服务器发送所支持的安全类型列表如果客户端能支持服务器的某一安全类型,那么客户端就会发送一个字节来确认连接 的安全类型:如果安全类型数是 0,那么连接失败(例如服务器不支持客户请求版本号) ,这样就会有字符串来描述失败原因:服务器在发送原因字串后,就会关闭连接二)(二)3.7 以下版本(以以下版本(以 vnc 认证为例)认证为例)1、服务器发送一个无符号的 32 位整数标识一个安全类型(与认证有关) 安全类型: 其他认证类型:说明:①0,连接失败(例如服务器不支持客户请求版本号) ,这样就会有字符串来描述失败原因:服务器发送完 reason-string 就关闭连接②NONE,不需要认证(不要输密码) ,协议数据将被使用明文发送V3.8 以上版本, 还会带有安全结果的消息V3.3 和 3.7 协议直接进入初始报文.③VNC 认证,协议数据将采用明文发送,服务器发送一个 16 字节的随机数。
客户端使用 DES 对验证进行加密,使用用户密码作为密钥,把 16 字节的回复返回到服务 器随之而来的就是安全结果消息2、服务器发送 16 位随机数3、客户端使用 DES 对验证进行加密,使用用户密码作为密钥,把加密后的 16 字节返回给 服务器4、服务器对安全认证进行确认,返回值为无符号 32 位整数,如果为 0 则表示成功,1 表 示失败如果不成功,服务器直接关闭连接V3.8 以上版本 如果不成功,就会有字符串来描述失败原因,并关闭连接 对于 V3.8 以下,如果不成功,服务器直接关闭连接初始化消息 1、客户端发送一个字节的初始化消息如果允许服务器其他客户继续连接,那么共享标志应该是非零(真) 否则,服务器将断开其他客户的连接2、服务器发送初始化消息,主要告知客户端服务器的帧缓存的高、宽、象素格式和桌面相 关的名称这个跟实现有关,有些实现是先发送 24 个字节,然后再发送桌面名字字符串名称字符串 格式如:sh-yinghua -1 ( 192.168.70.69 )帧缓存宽度一般为水平分辨率的大小,帧缓存高度一般是垂直分辨率的大小,比如1024×768 等象素格式主要包括以下段:服务器象素定义服务器本来的象素格式,这种象素格式会被一直使用,除非客户端使用设置象素格式消息来请求另一种象素格式。
bits-per-pixel 是表示每个像素值需要的位数 这个数字必须大于等于 depth,而 depth 用来表示像素值中有用的位数目前位每象素必须 是 8,16 或 32——小于 8 位象素不被支持如果多字节象素被看做 big-endian,那么 Big- endian 标志非零当然了,这对 8 位每象素没有任何意义如果真彩标志非零,那么最后 6 项规定如何按照象素值来确定红、绿、蓝的亮度红的最大值是红色的最大值(=2 ^n - 1, n 表示用在红色上的位数)注意这个值一般在 big endian的顺序中红色-替换表示要得到最低明显 bit 所需要的替换个数绿色最大值、绿色-替换 和蓝色最大值、蓝色-替换和红色类似要在 0—红色最大值之间找一个红色值,按照以下 步骤进行:• 遵循 big-endian 标志进行象素值例如:如果 big-endian 标志为 0,主机的字节顺序是 big endian,然后交换)• 使用红色—替换将右边替换• 和红色最大值进行逻辑与(按照主机字节顺序)如果真彩标志是零,那么服务器使用的象素值不是直接由红、绿、蓝的亮度组成,但是服务为索引到颜色图中去。
颜色图中的项目是由服务器使用“设置颜色面板条目” (FixColourMapEntries)消息进行设置的说明:位/象素一般为显示设置的颜色质量位数目前的任何服务器都还不能支持 FixColourMapEntries 消息,只有基于 X 的服务器才能支持 颜色映射实际上,为了能够完全支持颜色映射,客户端大概需要能够指定特殊的、服务 器不会使用的像素值这可能会加在未来的协议版本里客户端到服务器的消息客户端到服务器的消息 所有客户端到服务器的消息第一个字节都为消息类型,数据类型 U8客户到服务器的消息在本文中有如下定义:其余的注册消息类型有:值得注意的是:如果要发送未在本文中定义的消息,那么必须得到服务器端的消息确认设置象素格式消息“帧缓存更新”消息中设置什么格式的象素值如何设置如果客户端没有发送“设置象素格式”消息,那么服务器发送的象素值将遵循在服务器初 始化消息中所包括的象素格式如果真彩标志是零,那么意味着使用“颜色面板” ,只要客户端发送颜色面板空的消息,或 者是面板项被服务器端重设,服务器可以使用设置颜色面板项目进行颜色面板的设置注:其中的象素格式如在上文中的描述设置编码格式设置编码方式可以来确定服务器发送象素数据的类型。
消息中编码方式的顺序是客户端按照优先级来排列(第一个拥有最高的优先级)服务器可能选择这种顺序,也可能不选择象素数据也可以使用“原始编码”如果没有具体说明除了基本的编码方式,客户端也可以请求“伪编码”通告服务器它支持某一种扩展协议 如果服务器不支持这种扩展,它就会忽略这种伪编码注意:这意。
