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)
- 客戶端主導模型:由客戶端主動請求屏幕更新
- 高效傳輸:支持多種編碼方式和增量更新
- 強擴展性:通過編碼類型協商適應不同場景
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 | 消息名稱 | 結構 | 功能說明 |
---|---|---|---|
0x00 | SetPixelFormat | [消息ID][padding:3][PixelFormat] | 設置像素格式 |
0x02 | SetEncodings | [消息ID][padding:1][num-enc:2][encodings] | 設置支持的編碼類型 |
0x03 | FramebufferUpdateRequest | [消息ID][incremental:1][x][y][w][h] | 請求幀緩沖區更新 |
0x04 | KeyEvent | [消息ID][down][padding][key] | 發送鍵盤事件 |
0x05 | PointerEvent | [消息ID][button-mask][x][y] | 發送鼠標事件 |
0x06 | ClientCutText | [消息ID][padding:3][length:4][text] | 發送剪貼板文本 |
5.4 服務器→客戶端消息
類型ID | 消息名稱 | 結構 | 功能說明 |
---|---|---|---|
0x00 | FramebufferUpdate | [消息ID][padding:1][num-rect:2][rects] | 發送幀更新 |
0x01 | SetColorMapEntries | [消息ID][padding:1][first-color:2][colors] | 設置調色板 |
0x02 | Bell | [消息ID] | 觸發客戶端響鈴 |
0x03 | ServerCutText | [消息ID][padding:3][length:4][text] | 發送服務器剪貼板文本 |
6. 編碼類型
6.1 標準編碼
編碼ID | 名稱 | 描述 |
---|---|---|
0 | Raw | 原始像素數據,無壓縮 |
1 | CopyRect | 復制屏幕已有區域,僅傳輸源坐標 |
2 | RRE | 行程編碼,適用于大面積純色塊 |
5 | Hextile | 分塊處理(16x16),每塊可選子編碼 |
16 | ZRLE | Zlib壓縮的行程編碼,最高效的壓縮方式 |
15 | TRLE | 透明行程編碼,支持透明色 |
6.2 偽編碼
編碼ID | 名稱 | 描述 |
---|---|---|
-239 | Cursor | 傳輸鼠標光標形狀和熱點位置 |
-223 | DesktopSize | 通知客戶端桌面分辨率已改變 |
-258 | ExtendedClipboard | 擴展剪貼板支持(非標準) |
6.3 Hextile編碼處理流程
7. 協議工作流程
8. 安全性考慮
8.1 協議原生安全機制
- VNC認證:使用DES加密挑戰響應(已不安全)
- 無加密傳輸:像素數據和輸入事件明文傳輸
8.2 推薦安全實踐
-
SSH隧道加密
ssh -L 5901:localhost:5900 user@remote-server vncviewer localhost:5901
-
擴展安全類型
- TLS (安全類型 18)
- VeNCrypt (安全類型 19)
- SASL認證
-
網絡層防護
- 防火墻限制訪問IP
- VPN隧道保護
9. IANA注冊表
RFB協議定義四類IANA注冊表:
9.1 安全類型注冊(部分)
值 | 名稱 | 描述 |
---|---|---|
0 | Invalid | 無效類型 |
1 | None | 無認證 |
2 | VNC Authentication | VNC認證 |
5 | RA2 | RSA-AES加密 |
16 | Tight | TightVNC擴展 |
18 | TLS | TLS加密 |
19 | VeNCrypt | VeNCrypt安全層 |
9.2 消息類型范圍
方向 | 范圍 | 說明 |
---|---|---|
客戶端→服務器 | 0-127 | RFC定義的核心消息 |
客戶端→服務器 | 128-255 | 供應商特定擴展消息 |
服務器→客戶端 | 0-127 | RFC定義的核心消息 |
服務器→客戶端 | 128-255 | 供應商特定擴展消息 |
10. 實際應用與優化
10.1 性能優化策略
-
編碼選擇優先級:
ZRLE > Hextile > RRE > CopyRect > Raw
-
增量更新頻率:
- 靜態內容:降低請求頻率
- 動態內容:增加請求頻率
-
帶寬自適應:
- 高帶寬:高質量無損壓縮
- 低帶寬:降低顏色深度/分辨率
10.2 現代擴展實現
特性 | 實現方式 | 支持實現 |
---|---|---|
文件傳輸 | 自定義消息類型(0x80+) | TightVNC, UltraVNC |
多顯示器支持 | Xinerama擴展 | TigerVNC, RealVNC |
視頻流優化 | H.264編碼擴展 | TurboVNC |
觸摸屏支持 | 擴展PointerEvent | MobileVNC |
11. 協議演進歷史
版本 | 發布時間 | 主要改進 |
---|---|---|
3.3 | 1998 | 初始公開版本 |
3.7 | 2003 | 安全類型列表協商 |
3.8 | 2011 | RFC 6143標準化,偽編碼,IANA注冊 |
3.9+ | 非標準 | 供應商擴展(文件傳輸、加密改進等) |
最新實現參考:
- TigerVNC
- LibVNC
- RealVNC
附錄A:RFB協議狀態機
附錄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編碼子矩形示例
附錄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 (移動鼠標)]
... (持續交互)