作为一个非常高层次的概述,VNC服务器分为两种类型: 屏幕抓取。这些服务器会将当前显示内容捕获到缓冲区,将其与客户端状态进行比较,并仅将不同的矩形发送给客户端。 钩子辅助。这些服务器通过挂钩显示更新过程来获取有关屏幕更改的信息,由显示管理器或操作系统通知。然后,它们可以使用该信息仅向客户端发送已更改的矩形。 在这两种情况下,实际上是一系列屏幕更新的流;然而,只有屏幕的更改区域被传输到客户端。根据所使用的VNC协议版本,这些更新也可能被压缩。请注意,客户端可以随时请求完整的屏幕更新,但是如果整个屏幕没有发生变化,服务器将不会主动执行此操作。此外,屏幕更新并不是唯一传输的内容。服务器可以使用单独的通道发送剪贴板更新和鼠标位置更新(因为远程机器上的用户可能也能够移动鼠标)。
该协议的显示方面基于一个单一的图形原语:“在给定的x,y位置放置一个像素数据的矩形”。乍一看,这可能是绘制许多用户界面组件的一种低效方式。然而,允许各种不同的像素数据编码方式使我们在如何权衡各种参数(如网络带宽、客户端绘制速度和服务器处理速度)方面具有很大的灵活性。这些矩形的序列构成了一个帧缓冲区更新(或简称为“更新”)。更新表示从一个有效的帧缓冲区状态到另一个状态的更改,因此在某些方面类似于视频帧。更新中的矩形通常是不相交的,但这并不一定是这种情况。阅读这里以了解更多信息。
基本上,服务器向客户端发送帧缓冲区更新,而客户端发送键盘和鼠标输入以及帧缓冲区更新请求到服务器。 帧缓冲区更新消息可以采用不同的编码方式,但本质上它们是表示像素数据的正方形屏幕区域的不同方式。通常,客户端请求整个屏幕的帧缓冲区更新,但也可以请求屏幕的部分区域(例如,小型屏幕客户端显示服务器屏幕的视口)。然后,服务器会发送一个包含自上次发送到客户端的FBU(帧缓冲区更新)之后屏幕发生变化的矩形的FBU。 RFB/VNC协议的最佳参考文献在这里。IETF有一个最近(2011年)的标准文档RFC 6143,涵盖了RFB,虽然它不像参考指南那样详尽。
它的基本原理是实时发送屏幕截图。这里的“实时”有点用词不当,因为没有明确的截止日期。它尝试通过仅发送屏幕上已更改的区域来进行优化,并且VNC代码线的一些分支使用镜像驱动程序接收通知,以便在写入显示区域时接收通知,而其他分支则使用窗口消息挂钩以检测重绘请求。