November 19, 2018 · ARTS 本文字数: 1.1k 阅读时长:4 min 全站字数:345.6k

虚拟网络计算机VNC是如何工作的?

  1. VNC 协议——Remote FrameBuffer Protocol
    1. VNC连接的建立和关闭
    2. VNC客户端显示协议
    3. 像素数据的表示
  2. 参考资料

虚拟机网络计算机(Virtual Network Computer)是一种可以远程查看和控制图形化操作系统的一种技术,广泛应用于远程桌面共享和控制等领域。

VNC架构

VNC 协议——Remote FrameBuffer Protocol

VNC协议用于远程访问和控制图形化用户界面,基于Remote Frame Buffer层面实现,客户端从服务端获取FrameBuffer并完成显示和控制。由于是在在Frame Buffer层面实现,VNC可以适用多种系统,如X11,Windows和Mac,以及其他PAD等。

VNC是基于C/S的模式,是典型的瘦客户端协议。客户端只需要具有显示设备和控制设备,并支持TCP/IP协议。VNC客户端是无状态的。而VNC服务端就相对比较复杂,需要服务端维护FrameBuffer,做编码格式的转换,支持多种对图形像素编码格式以及多个客户端同时访问。VNC服务端的默认端口是5900,如果提供多个服务,则使用5900+N的端口。

VNC连接的建立和关闭

VNC基于TCP/IP协议,可以基于字节或者字符流,TCP连接建立后,VNC服务端会请求客户端进行认证,使用challenge-response模式。客户端认证通过后,服务端和客户端将进行桌面尺寸,像素格式,编码格式等的协商。协商结束后,客户端请求更新整个屏幕,VNC会话开始。

VNC协议包括的阶段有:

  1. 握手。协议版本,安全验证类型。
  2. 初始化。交换ServerInitClientInit消息
  3. 数据交互。每个消息开头是消息类型,然后是消息内容。

由于VNC客户端是无状态的,VNC服务端和客户端可以随时关闭连接。

VNC数据的获取是由客户端需求驱动的。只有客户端需要时,服务端才会发送。如果网速慢,可以降低更新的频率。客户端的每次更新都包含了自从上次请求后所有屏幕中的的变化。如果网络非常慢,或者客户端处理速度慢,可以将过渡性更新忽略,从而减少网络传输和客户端渲染,提升响应的效果。

VNC客户端显示协议

VNC客户段显示的基本原理是:在指定的位置<x,y>渲染一个长方形的像素数据区域。这种方式初看起来比较低效,但是由于可以使用不同的像素数据的编码方式,每个长方形区域都可以使用不同的编码的像素数据,从而能够充分利用带宽,提高客户端渲染和服务端处理速度。

像素数据编码的最基本、最通用的编码格式是Raw编码,每一个长方形就是简单的像素数据,按照从左到右扫描的顺序。服务端和客户端必须支持这种编码格式。

CopyRect编码适用于客户端已经有了一部分像素数据在其FrameBuffe中。此时,服务端只需要发送将<x,y>位置的数据直接复制到目标区域,而不需要进行传输。如拖拽和滚动的操作,只需要传输一部分变化的数据。

对于大部分的桌面浏览器有颜色和文字,可以将长方形区域描述为背景颜色和不同的其他叠加颜色的方式,而对于字体可以使用缓存来渲染文字像素,相同字体的字符,从缓存中直接获取。

常用的编码格式有:Raw,CopyRect,RRE,TRLE,Hextile,ZRLE。实践中常用的是XRLE,TRLE和CopyRect,提供高压缩。

像素数据的表示

像素格式就是每一种颜色的像素值。如最常见的像素格式是24-bit或者16-bit的True Color,像素值直接被翻译为红,绿和蓝。
以及8-bit的color map,表示RGB的强度。

像素主句编码就是将长方形区域中像素值的排列方式。每个长方形像素值的前缀是<x,y>屏幕上坐标位置,长方形的长和宽,编码类型,以及编码后的像素数据:

1
2
3
4
5
6
7
8
9
+--------------+--------------+---------------+
| No. of bytes | Type [Value] | Description |
+--------------+--------------+---------------+
| 2 | U16 | x-position |
| 2 | U16 | y-position |
| 2 | U16 | width |
| 2 | U16 | height |
| 4 | S32 | encoding-type |
+--------------+--------------+---------------+

参考资料

  1. VNC - How it workshttps://www.hep.phy.cam.ac.uk/vnc_docs/howitworks.html
  2. The Remote Framebuffer Protocol https://tools.ietf.org/html/rfc6143