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
英文地址,請注明出處:http://en.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 <…