我试图了解 VNC 机制是如何工作的。
RFB 协议 3.8 规范说:
更新协议是由客户端需求驱动的。也就是说,更新仅从服务器发送到客户端以响应来自客户端的显式请求。这赋予了协议自适应的品质。客户端和网络速度越慢,更新速率就越低。对于典型的应用程序,帧缓冲区同一区域的更改往往会相继发生。对于缓慢的客户端和/或网络,可以忽略帧缓冲区的瞬态,从而减少网络流量和客户端的绘制。
这似乎意味着服务器只会FramebufferUpdate
在客户端发送FramebufferUpdateRequest
.然后客户端必须定期发送这些数据包。然而,当我通过wireshark分析时,我发现事实并非如此。当没有屏幕或指针活动时,我没有看到从客户端到服务器的任何数据包。
当我在屏幕上创建一些屏幕活动而不涉及客户端时(我xclock
通过将显示设置为该值来运行),第一条消息是从服务器到客户端的,而不是来自客户端的请求。
所以我的问题是:服务器真的只会在客户端请求时发送更新,而不是每次有屏幕活动时发送更新吗?这两种情况的更新频率是多少?
答案1
我意识到这是一个老问题,但答案可以在 RFB RFC 中找到。
当客户端FramebufferUpdateRequest
向服务器发送一条标记为 的消息时incremental
,该请求将在服务器上保持待处理状态直到确实有变化需要报告。 此时,服务器将发回一条FramebufferUpdate
包含发生更改的矩形数据的消息。
这意味着,如果您查看网络数据,您可能会发现(也许除了保活之外),最后一个数据包从客户端发送到服务器,并且被FramebufferUpdateRequest
标记为incremental
。在有更新要发送之前,服务器不会发送响应,因此网络将保持安静。
更常见的是,屏幕频繁变化,这可能会导致多个连续消息,从而导致来自服务器的FramebufferUpdateRequest
单个复合消息。FramebufferUpdate