Remote Framebuffer Protocol (RFB) 详解

RFC 6143 规范文档:The Remote Framebuffer Protocol

文章目录

    • 1. 引言
    • 2. 初始连接流程
      • 2.1 TCP连接建立
      • 2.2 协议版本协商
      • 2.3 安全握手
    • 3. 显示协议机制
      • 3.1 核心概念
      • 3.2 像素格式
    • 4. 输入协议
      • 4.1 键盘事件(KeyEvent)
      • 4.2 鼠标事件(PointerEvent)
    • 5. 协议消息详解
      • 5.1 握手消息
      • 5.2 初始化消息
      • 5.3 客户端→服务器消息
      • 5.4 服务器→客户端消息
    • 6. 编码类型
      • 6.1 标准编码
      • 6.2 伪编码
      • 6.3 Hextile编码处理流程
    • 7. 协议工作流程
    • 8. 安全性考虑
      • 8.1 协议原生安全机制
      • 8.2 推荐安全实践
    • 9. IANA注册表
      • 9.1 安全类型注册(部分)
      • 9.2 消息类型范围
    • 10. 实际应用与优化
      • 10.1 性能优化策略
      • 10.2 现代扩展实现
    • 11. 协议演进历史
    • 附录A:RFB协议状态机
    • 附录B:协议消息结构图
      • B.1 FramebufferUpdate 消息结构
      • B.2 Hextile编码子矩形示例
    • 附录C:协议数据流示例
      • C.1 典型通信过程
      • C.2 伪编码应用场景

1. 引言

Remote Framebuffer Protocol (RFB) 是一种轻量级、跨平台的远程图形访问协议,主要应用于虚拟网络计算(VNC)系统。其核心设计理念:

  • 与图形系统解耦:不依赖特定GUI实现(如X11、Windows GDI)
  • 客户端主导模型:由客户端主动请求屏幕更新
  • 高效传输:支持多种编码方式和增量更新
  • 强扩展性:通过编码类型协商适应不同场景
请求更新/发送输入
发送帧更新
RFB客户端
RFB服务器

2. 初始连接流程

2.1 TCP连接建立

  • 客户端连接服务器默认端口:5900(或5900+显示编号)
  • 使用TCP协议进行可靠传输

2.2 协议版本协商

# 服务器发送协议版本
server_send(b"RFB 003.008\n")  # 固定12字节# 客户端响应支持版本
client_send(b"RFB 003.008\n")  # 取双方都支持的最高版本

2.3 安全握手

3. 显示协议机制

3.1 核心概念

  • 帧缓冲区(Framebuffer):代表屏幕内容的二维像素数组
  • 增量传输:仅传输变化的矩形区域
  • 编码协商:客户端指定支持的编码列表

3.2 像素格式

struct PixelFormat {uint8 bits_per_pixel;   // 像素深度(8/16/32)uint8 depth;            // 颜色深度uint8 big_endian_flag;  // 字节序(0=小端,1=大端)uint8 true_color_flag;  // 是否真彩色(1=true)uint16 red_max;         // 红色通道最大值uint16 green_max;       // 绿色通道最大值uint16 blue_max;        // 蓝色通道最大值uint8 red_shift;        // 红色位偏移uint8 green_shift;      // 绿色位偏移uint8 blue_shift;       // 蓝色位偏移uint8 padding[3];       // 对齐填充
};

4. 输入协议

4.1 键盘事件(KeyEvent)

struct {uint8 message_type;   // 消息类型 (固定为0x04)uint8 down_flag;      // 按键状态 (1=按下, 0=释放)uint8 padding[2];     // 填充字节uint32 key;           // 键值 (Keysym编码)
} KeyEvent;[消息类型:1][down:1][padding:2][key:4]
// down=1: 按键按下, down=0: 按键释放
// key: X11键码(兼容Windows/Mac)

4.2 鼠标事件(PointerEvent)

struct {uint8 message_type;   // 消息类型 (固定为0x05)uint8 button_mask;    // 按钮状态掩码uint16 x_position;    // X坐标 (0到framebuffer宽度-1)uint16 y_position;    // Y坐标 (0到framebuffer高度-1)
} PointerEvent;[消息类型:1][button-mask:1][x:16][y:16]

按钮掩码(button-mask):

位置 掩码值 (十六进制) 对应按钮
位0 0x01 左键
位1 0x02 中键/滚轮按下
位2 0x04 右键
位3 0x08 滚轮上滚 (扩展)
位4 0x10 滚轮下滚 (扩展)
位5 0x20 侧键后退 (扩展)
位6 0x40 侧键前进 (扩展)

5. 协议消息详解

5.1 握手消息

消息类型方向结构
ProtocolVersion服务器→客户端“RFB XXX.YYY\n” (12字节)
Security服务器→客户端[num-types:1][security-types]
SecurityResult服务器→客户端[status:4][reason-string]

5.2 初始化消息

消息类型方向结构
ClientInit客户端→服务器[shared-flag:1] (1=共享连接)
ServerInit服务器→客户端[width:16][height:16][pixel-format][name]

5.3 客户端→服务器消息

类型ID消息名称结构功能说明
0x00SetPixelFormat[消息ID][padding:3][PixelFormat]设置像素格式
0x02SetEncodings[消息ID][padding:1][num-enc:2][encodings]设置支持的编码类型
0x03FramebufferUpdateRequest[消息ID][incremental:1][x][y][w][h]请求帧缓冲区更新
0x04KeyEvent[消息ID][down][padding][key]发送键盘事件
0x05PointerEvent[消息ID][button-mask][x][y]发送鼠标事件
0x06ClientCutText[消息ID][padding:3][length:4][text]发送剪贴板文本

5.4 服务器→客户端消息

类型ID消息名称结构功能说明
0x00FramebufferUpdate[消息ID][padding:1][num-rect:2][rects]发送帧更新
0x01SetColorMapEntries[消息ID][padding:1][first-color:2][colors]设置调色板
0x02Bell[消息ID]触发客户端响铃
0x03ServerCutText[消息ID][padding:3][length:4][text]发送服务器剪贴板文本

6. 编码类型

6.1 标准编码

编码ID名称描述
0Raw原始像素数据,无压缩
1CopyRect复制屏幕已有区域,仅传输源坐标
2RRE行程编码,适用于大面积纯色块
5Hextile分块处理(16x16),每块可选子编码
16ZRLEZlib压缩的行程编码,最高效的压缩方式
15TRLE透明行程编码,支持透明色

6.2 伪编码

编码ID名称描述
-239Cursor传输鼠标光标形状和热点位置
-223DesktopSize通知客户端桌面分辨率已改变
-258ExtendedClipboard扩展剪贴板支持(非标准)

6.3 Hextile编码处理流程

矩形区域
分割为16x16图块
是否纯色?
传输背景色
分析子矩形
使用掩码?
传输TileMask+颜色数据
传输Raw像素数据

7. 协议工作流程

ClientServerTCP Connect (端口5900)ProtocolVersionProtocolVersion + SecurityTypeChallenge (16字节)DES加密响应SecurityResult (0表示成功)执行对应安全流程alt[安全类型=VNC Auth][其他安全类型]ClientInit (shared-flag)ServerInit (分辨率+像素格式)FramebufferUpdateRequestFramebufferUpdate (使用协商的编码)alt[屏幕有变化]PointerEvent/KeyEventClientCutTextServerCutTextalt[剪贴板变化]loop[主循环]ClientServer

8. 安全性考虑

8.1 协议原生安全机制

  • VNC认证:使用DES加密挑战响应(已不安全)
  • 无加密传输:像素数据和输入事件明文传输

8.2 推荐安全实践

  1. SSH隧道加密

    ssh -L 5901:localhost:5900 user@remote-server
    vncviewer localhost:5901
    
  2. 扩展安全类型

    • TLS (安全类型 18)
    • VeNCrypt (安全类型 19)
    • SASL认证
  3. 网络层防护

    • 防火墙限制访问IP
    • VPN隧道保护

9. IANA注册表

RFB协议定义四类IANA注册表:

9.1 安全类型注册(部分)

名称描述
0Invalid无效类型
1None无认证
2VNC AuthenticationVNC认证
5RA2RSA-AES加密
16TightTightVNC扩展
18TLSTLS加密
19VeNCryptVeNCrypt安全层

9.2 消息类型范围

方向范围说明
客户端→服务器0-127RFC定义的核心消息
客户端→服务器128-255供应商特定扩展消息
服务器→客户端0-127RFC定义的核心消息
服务器→客户端128-255供应商特定扩展消息

10. 实际应用与优化

10.1 性能优化策略

  1. 编码选择优先级

    ZRLE > Hextile > RRE > CopyRect > Raw
    
  2. 增量更新频率

    • 静态内容:降低请求频率
    • 动态内容:增加请求频率
  3. 带宽自适应

    • 高带宽:高质量无损压缩
    • 低带宽:降低颜色深度/分辨率

10.2 现代扩展实现

特性实现方式支持实现
文件传输自定义消息类型(0x80+)TightVNC, UltraVNC
多显示器支持Xinerama扩展TigerVNC, RealVNC
视频流优化H.264编码扩展TurboVNC
触摸屏支持扩展PointerEventMobileVNC

11. 协议演进历史

版本发布时间主要改进
3.31998初始公开版本
3.72003安全类型列表协商
3.82011RFC 6143标准化,伪编码,IANA注册
3.9+非标准供应商扩展(文件传输、加密改进等)

最新实现参考:

  • TigerVNC
  • LibVNC
  • RealVNC

附录A:RFB协议状态机

TCP连接成功
版本协商成功
需要认证
认证成功
无认证
认证失败
初始化完成
连接关闭
Disconnected
VersionExchange
SecurityHandshake
Authentication
Initialization
Running
收到更新请求
发送更新完成
收到输入事件
处理完成
WaitRequest
SendUpdate
ProcessInput

附录B:协议消息结构图

B.1 FramebufferUpdate 消息结构

 0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    msg-type   |   padding    |         num-rectangles        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          rectangle 1                         |
|                           (variable)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          rectangle ...                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

每个矩形区域结构:

 0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             x-pos                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             y-pos                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            width                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           height                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          encoding-type       |           pixel-data          |
|                              |         (variable)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

B.2 Hextile编码子矩形示例

16x16图块
背景色: 0xFFFFFF
子矩形1: 颜色=0x0000FF, x=2,y=2,w=4,h=4
子矩形2: 颜色=0xFF0000, x=10,y=8,w=4,h=6

附录C:协议数据流示例

C.1 典型通信过程

Client: 连接TCP端口5900
Server: "RFB 003.008\n"
Client: "RFB 003.008\n"
Server: [0x01 0x02] (支持None和VNC认证)
Client: 选择0x02 (VNC认证)
Server: [16字节随机数]
Client: [DES加密的响应]
Server: [0x00000000] (认证成功)
Client: [0x01] (共享连接)
Server: [1280x720][PixelFormat]["My Desktop"]
Client: [SetPixelFormat][SetEncodings]
Client: [FramebufferUpdateRequest]
Server: [FramebufferUpdate (ZRLE编码)]
Client: [PointerEvent (移动鼠标)]
... (持续交互)

C.2 伪编码应用场景

ClientServer用户改变分辨率FramebufferUpdate[DesktopSize伪编码][新分辨率:1920x1080]调整本地窗口大小FramebufferUpdateRequest(全屏)ClientServer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915760.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 DeepSeek-V3 到 Kimi K2:八种现代大语言模型架构设计

编译:青稞社区Kimi 原文:https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison 首发:https://mp.weixin.qq.com/s/lSM2jk1UxJVz1WllWYQ4aQ 自原始 GPT 架构开发以来已经过去了七年。乍一看,从 2019 年的…

linux驱动开发笔记--GPIO驱动开发

目录 前言 一、设备树配置 二、驱动编写 三、用户空间测试 总结 前言 开发平台:全志A133,开发环境:linux4.9andrio10,开发板:HelperBoard A133_V2.5。 一、设备树配置 打开板级设备树配置文件,路径&a…

腾讯iOA:企业软件合规与安全的免费守护者

人们眼中的天才之所以卓越非凡,并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 目录 一、为什么要使用腾讯iOA? 二、中小企业软件合规痛点 三、腾讯iOA解决方案 3.1 核心技…

C#定时任务实战指南:从基础Timer到Hangfire高级应用

高效管理后台作业,让定时任务成为应用的可靠引擎 在C#应用开发中,定时任务是实现数据同步、报表生成、系统维护等后台作业的核心技术。本文将深入探讨C#生态中主流的定时任务解决方案,从基础的内置Timer到强大的Quartz.NET和Hangfire框架&…

软件开发、项目开发基本步骤

• 立项阶段:项目定义、需求收集与分析、可行性分析、风险评估与规划、项目团队组建、制定项目计划、获取批准与支持。• 需求评审与分析:◦ 项目团队(包括产品经理、开发人员、测试人员等)共同参与,明确项目的目标、功…

慢 SQL接口性能优化实战

在对某电商项目进行接口性能压测时,发现 /product/search 接口响应缓慢,存在明显性能瓶颈。通过慢查询日志排查和 SQL 优化,最终实现了接口响应速度的显著提升。本文完整还原此次优化过程,特别强调操作步骤和问题分析过程&#xf…

【C#】在WinForms中实现控件跨TabPage共享的优雅方案

文章目录一、问题背景二、基本实现方案1. 通过修改Parent属性实现控件移动三、进阶优化方案1. 创建控件共享管理类2. 使用用户控件封装共享内容四、方案对比与选择建议五、最佳实践建议六、完整示例代码一、问题背景 在Windows窗体应用程序开发中,我们经常遇到需要…

Android Camera openCamera

由头 今日调休,终于终于闲下来了,可以写一下博客了,刚好打开自己电脑,就有四年前下的谷歌Android 12源码,不是很旧,刚好够用,不用再另外下载新源码了,不得不感慨这时间过得真快啊~废…

神经网络——池化层

目录 池化层 最大池化层 MaxPool2d 最大池化操作图示 最大池化操作代码演示 综合代码案例 池化层 池化层(Pooling Layer) 核心作用:通过降采样减少特征图尺寸,降低计算量,增强特征鲁棒性。 1. 常见类型 …

Android 默认图库播放视频没有自动循环功能,如何添加2

Android 默认图库播放视频没有自动循环功能, 如何添加 按如下方式修改可以添加 开发云 - 一站式云服务平台 --- a/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java +++ b/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java…

数字孪生赋能智慧能源电力传输管理新模式

在“双碳”战略和能源数字化转型的双重驱动下,智慧能源系统亟需更高效、精细和智能的管理手段。数字孪生技术作为融合物理世界与数字空间的桥梁,为电力传输系统的全生命周期管理提供了强有力的技术支撑。本文聚焦数字孪生在智慧能源电力传输中的应用&…

Jmeter的元件使用介绍:(二)线程组详解

Jmeter线程组默认包含三种:线程组、setUp线程组、tearDown线程组。线程组之间的执行顺序为:setUp线程组->线程组->tearDown线程组。多数情况都是选用线程组,setUp线程组用于做一些脚本的前置准备,比如:跨线程组设…

AI替代人工:浪潮中的沉浮与觉醒

当AlphaGo以4:1的比分战胜围棋大师李世石之时,人机博弈的疆界被重新划定;当工厂车间里机械臂以惊人精度与不知疲倦的姿态取代了工人重复的手势;当客服电话那头响起的不再是温存人声,而成了准确但缺乏温度的AI语音;当算…

数学建模--matplot.pyplot(结尾附线条样式表格)

matplotlib.pyplot绘图接口 1. 用法 导入模块 import matplotlib.pyplot as plt import numpy as np # 用于生成示例数据绘制简单图表 # 生成数据 x np.linspace(0, 10, 100) y np.sin(x)# 创建图形和坐标轴 plt.figure(figsize(8, 4)) # 设置图表大小 plt.plot(x, y, …

NumPy 实现三维旋转变换

在三维空间中,物体的旋转变换是计算机图形学、机器人学以及三维建模等领域中一个至关重要的操作。这种变换可以通过构造特定的旋转矩阵并将其应用于三维点或向量来实现。本文将深入探讨如何利用 NumPy 这一强大的 Python 科学计算库来实现三维旋转变换,从基本的数学原理到具体…

基于Springboot的中药商城管理系统/基于javaweb的中药材销售系统

管理员:登录,个人中心,用户管理,药材分类管理,药材信息管理,药材入库管理, 药材出库管理,订单管理,云端药馆,系统设置用户:注册,登录&…

试用SAP BTP 02A:试用SAP HANA Cloud

进入SAP BTP主控室 -> 子账 -> 服务市场,选择【数据和分析】-> 点击SAP HANA Cloud点击创建选择服务、计划、运行时环境、空间,输入实例名称,点击下一步在JSON文件中配置HANA管理员密码,点击下一步审核hana 实例信息&…

纯CPU场景下C++的分布式模型训练框架设计思路

0. 参数分配 稠密参数 → MPI 集合通信(All-Reduce / Broadcast / Reduce-Scatter)。稀疏参数 → brpc Parameter Server 异步推拉。 完全去掉 NCCL/GPU 相关部分。1. 整体拓扑 ┌----------------┐ ┌----------------┐ │ Worker-0 │…

训练日志7.21

conda环境,服务器原因无法使用,需重新搭建 学习一下预训练和微调相关内容,对于预训练整体的流程,还不太清楚,自己估计是训练不动,只能微调

Java 高频算法

Java高频算法面试题 以下是Java面试中常见的高频算法题目&#xff0c;涵盖了数据结构、算法思想和实际应用场景。 一、数组与字符串 1. 两数之和 public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map new HashMap<>();for (int i 0; i <…