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