1 VNC协议特点
VNC由VNC Server和VNC Client两部分组成。VNC Server产生本地显示,通过VNC协议实现VNC Server和VNC Client之间的通信。VNC协议中实现了一种远程图形用户界面访问协议RFB[2](Remote Frame Buffer)协议,RFB协议是基于帧缓存(Frame Buffer)层级,因此适用于所有操作系统平台及应用,例如X Windows、MS Windows和Macintosh等。VNC在TCP/IP协议基础上通过一个简单的图形界面传输协议实现在远程客户端上显示服务器端的桌面实时数据。
协议的显示方面是基于一个很简单的原理,即将一个矩形区域的像素点放置在一个特定的位置上。通过采用不同的图像编码方法,可以在传输速度、图像质量、服务器处理速度、终端显示速度和网络带宽之间达到平衡。通过每次的窗口更新,可以得到最新的窗口内容。在某些方面,这看上去更像是一种视频图像流。每次窗口更新的消息是通过客户端发送给服务器端的,每接收到一个消息,服务器端对其发生响应,这样就使得协议本身可以控制自己的刷新速度。如果客户端或者由于网络的原因比较慢,同样地刷新率也会比较低,这样可以完成速度的自适应。
输入协议是基于标准工作站的键盘响应消息和鼠标设备的。当客户端接收到这些输入消息后,被简单地以事件形式传送给服务器端,并产生对应的动作。
2 VNC在低带宽网络环境中应用存在的问题
在大规模视频会议中,当需要对其中一个会议成员的桌面或者某个应用程序进行共享时,此时VNC服务器的计算性能和网络接入的条件都比较差,这样就对共享机制提出了很高的要求,其必须具备高效、延时小,又要求架构轻盈、占系统资源少、节省带宽等性能。由于在国外网络带宽足够,采用VNC机制的多点应用程序共享能够流畅地运行,但在国内目前低带宽的网络条件下,VNC机制采用的是星型直连结构,如果直接采用VNC默认的星型直连机制,在多点远程视频会议中实现应用程序共享会很困难,VNC Server与各VNC Client以直连方式进行通信,此种情况下由于VNC Server端的出口带宽受到限制,VNC Server端的数据发送压力会呈线性增长,在2 MHz的ADSL出口带宽条件下,当会议成员达到10个后,将导致严重的网络拥塞,致使应用程序共享实时性大大降低,因而其不具备在远程视频会议系统中的实际可用性。
3 VNC共享机制改进方案
3.1 VNC共享通信机制
VNC机制默认采用直连的方式同VNC Client通信,本文将提出一种新的实现方案,通过在远程视频会议系统[4]中采用中转服务器转发模式实现共享,具体结构如图1所示。此时VNC Server端只需上传数据给中转服务器,VNC Client只与中转服务器建立连接,由中转服务器向每个客户端发送数据,通常中转服务器的网络出口带宽都比较大,因此网络带宽不会成为性能瓶颈。这样就大大减轻了VNC Server端的网络传输压力,在应用程序共享时系统的反应速度也将得到提升。
3.2 屏幕变化检测算法
屏幕变化检测算法性能的好坏将直接影响到VNC Server端发送的数据量,一种高效的屏幕检测算法将大大降低传输的数据量,节省网络带宽,从而提高系统的实时效果。VNC默认的屏幕变化检测机制是通过消息钩子机制获取区域的坐标信息后,再将坐标区域的屏幕像素数据发送给各VNC Client。此检测方法使得大量没有发生改变的屏幕数据也被发送,增加了网络发送的数据量,在低速网络环境中容易造成网络拥塞,影响系统的性能。因此,本文在此基础上提出了一种新的屏幕变化区域检测算法。
VNC机制通过采用消息钩子机制截获系统屏幕重绘区域信息,将得到的区域拆分成一个矩形链表(遍历链表)来存储区域坐标信息,记为array_list,定义一个变化区域记为vnc_rgn,专门保存需要重新发送的区域位置信息,对array_list每个成员矩形调用此检测算法进行变化区域检测。具体的算法流程图如图2所示。
(1)假设其中一个成员矩形为arri,如果arri的长宽都小于32×32,则直接作为需重新发送的变化区域,保存到vnc_rgn中,否则对arri进行分析检测。
(2)首先定义一个新的矩形arrj(arri.left,0,arri.right,0),在arri中找到发生变化的行,记录该行的y坐标,记arrj.top=y,同时y+=16递增找到未发生变化行,暂时记arrj.bottom=y;然后从arrj底部y-=1进行比较,寻找内容发生变化的行,找到后将此行的y坐标设置成arrj.bottom=y。至此确定了变化矩形arrj的最终的top、bottom坐标。同时将arri的值设为arri(arri.left,arrj.bottom,arri.right,arri.bottom)。在对arrj分析完毕后接着对arri遍历分析直至结束。
(3)确定矩形arrj后,对矩形arrj进行分析。首先定义一个矩形arrn(0,0,0,0),在arrj中寻找最先发生改变的列,找到后记录发生变化的区域的left、top坐标,arrn.left=x,arrn.top=y,分别对x、y轴方向循环遍历进行分析(记为x+=32,y+=32),如果此列屏幕像素数据改变,则x+=32继续比较;否则将记录arrn.right=x,对y轴方向进行同样的比较,y+=32,并记录arrn.bottom=y,最终得到需要发送的变化区域矩形坐标,并将此矩形保存到最终发送的矩形链表中,同时记录下arrk(arrn.right,arrn.top,arrj.right,arrn.bottom)、arrm(arrn.left,arrn.bottom,arrj.right,arrj.bottom),分别将arrk、arrm赋值给arrj进行类似分析检测,依次循环遍历整个arrj,直到结束。
通过此屏幕变化区域检测算法,对整个array_list链表的成员矩形进行遍历后得到需要重新发送的变化区域坐标信息。
4 实验结果
此改进方案已经应用于VcomOffice远程视频会议系统中。实验环境为:局域网内,中转服务器采用Linux操作系统,VNC Server和VNC Client端均采用Windows XP操作系统,具体的软硬件配置如表1所示。
为了验证调用屏幕变化区域检测算法前后,VNCServer端对同一操作生成的数据量的变化,实验在100 M的局域网内进行,VNC Server采用的是VNC默认的TIght编码[5],编码后经过zlib压缩[5]后发送给中转服务器,主要进行以下场景的测试:
(1)打开一个Word文档,剪切、复制、粘贴一段文字,图片保存到Word,在Word中输入一些内容;
(2)打开IE浏览器登录www.sina.com.cn主页;
(3)打开一个PDF文档后,拖动滚动条至底部;
(4)打开资源管理器,在屏幕上做拖动操作,之后将其最大化。
调用检测算法前后VNC Server发送数据量如图3所示。通过对比可以看到,在调用屏幕区域变化检测算法前后,VNC Server端发送的数据量都会有一定程度的下降。当执行相同的Word操作时,VNC Server端发送的数据量降低了12.21%,登录新浪网主页的过程中数据发送量只降低了4.82%,打开PDF文档并拖动滚动条至最底端的过程中,发送的数据总量降低了14.63%,在资源管理器的缩放过程中,数据发送量下降了22.19%。
测试结果表时,当VNC系统调用屏幕区域变化检测算法后,VNC Server端的发送数据量平均会有10%左右的下降。这在远程多点应用程序共享中,会大大减轻VNC Server端的发送压力,减少网络拥塞现象出现的概率,从而提高了应用程序共享时远程客户端响应速度。
本文介绍了在低速网络环境下远程视频会议系统中通过VNC协议进行应用程序共享时存在的问题,提出了一种新的改进方案,并结合新方案提出了一种新的屏幕区域变化检测算法。此外,对系统在调用新的屏幕区域变化检测算法前后进行了测试比较。该方案已经应用于大连浩视数字技术有限公司的VcomOffice远程视频会议系统。通过多个实验场景的测试,实验结果表明,采用新的屏幕变化区域检测算法后,VNC Server端的发送数据量出现了较大程度的下降,为低速网络环境下远程视频会议系统节省了网络带宽,提高了应用程序共享系统的实时性,从而实现了VNC在低速网络环境下的应用,应用程序共享使地理位置分散的用户通过计算机网络的连接共享某一应用程序,在互联网办公、远程视频会议系统、远程协助等方面有着不可替代的作用,具有相当广阔的发展前景。