为什么凡科网做的网站无法搜索,国外做伞的品牌网站,网站建设合同是否属于技术服务合同,赶集网做网站RFC 6143 规范文档#xff1a;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 握手消… 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. 协议演进历史附录ARFB协议状态机附录B协议消息结构图B.1 FramebufferUpdate 消息结构B.2 Hextile编码子矩形示例附录C协议数据流示例C.1 典型通信过程C.2 伪编码应用场景 1. 引言
Remote Framebuffer Protocol (RFB) 是一种轻量级、跨平台的远程图形访问协议主要应用于虚拟网络计算(VNC)系统。其核心设计理念
与图形系统解耦不依赖特定GUI实现如X11、Windows GDI客户端主导模型由客户端主动请求屏幕更新高效传输支持多种编码方式和增量更新强扩展性通过编码类型协商适应不同场景
#mermaid-svg-BxmQy6hiuqFZcvpy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy .error-icon{fill:#552222;}#mermaid-svg-BxmQy6hiuqFZcvpy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BxmQy6hiuqFZcvpy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BxmQy6hiuqFZcvpy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BxmQy6hiuqFZcvpy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BxmQy6hiuqFZcvpy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BxmQy6hiuqFZcvpy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BxmQy6hiuqFZcvpy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BxmQy6hiuqFZcvpy .marker.cross{stroke:#333333;}#mermaid-svg-BxmQy6hiuqFZcvpy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BxmQy6hiuqFZcvpy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy .cluster-label text{fill:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy .cluster-label span{color:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy .label text,#mermaid-svg-BxmQy6hiuqFZcvpy span{fill:#333;color:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy .node rect,#mermaid-svg-BxmQy6hiuqFZcvpy .node circle,#mermaid-svg-BxmQy6hiuqFZcvpy .node ellipse,#mermaid-svg-BxmQy6hiuqFZcvpy .node polygon,#mermaid-svg-BxmQy6hiuqFZcvpy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BxmQy6hiuqFZcvpy .node .label{text-align:center;}#mermaid-svg-BxmQy6hiuqFZcvpy .node.clickable{cursor:pointer;}#mermaid-svg-BxmQy6hiuqFZcvpy .arrowheadPath{fill:#333333;}#mermaid-svg-BxmQy6hiuqFZcvpy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BxmQy6hiuqFZcvpy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BxmQy6hiuqFZcvpy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BxmQy6hiuqFZcvpy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BxmQy6hiuqFZcvpy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BxmQy6hiuqFZcvpy .cluster text{fill:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy .cluster span{color:#333;}#mermaid-svg-BxmQy6hiuqFZcvpy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BxmQy6hiuqFZcvpy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}请求更新/发送输入发送帧更新RFB客户端RFB服务器2. 初始连接流程
2.1 TCP连接建立
客户端连接服务器默认端口5900或5900显示编号使用TCP协议进行可靠传输
2.2 协议版本协商
# 服务器发送协议版本
server_send(bRFB 003.008\n) # 固定12字节# 客户端响应支持版本
client_send(bRFB 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; // 是否真彩色(1true)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]
// down1: 按键按下, down0: 按键释放
// 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编码处理流程
#mermaid-svg-6STLywKZftCWYVfI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6STLywKZftCWYVfI .error-icon{fill:#552222;}#mermaid-svg-6STLywKZftCWYVfI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6STLywKZftCWYVfI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-6STLywKZftCWYVfI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6STLywKZftCWYVfI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6STLywKZftCWYVfI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6STLywKZftCWYVfI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6STLywKZftCWYVfI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6STLywKZftCWYVfI .marker.cross{stroke:#333333;}#mermaid-svg-6STLywKZftCWYVfI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6STLywKZftCWYVfI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6STLywKZftCWYVfI .cluster-label text{fill:#333;}#mermaid-svg-6STLywKZftCWYVfI .cluster-label span{color:#333;}#mermaid-svg-6STLywKZftCWYVfI .label text,#mermaid-svg-6STLywKZftCWYVfI span{fill:#333;color:#333;}#mermaid-svg-6STLywKZftCWYVfI .node rect,#mermaid-svg-6STLywKZftCWYVfI .node circle,#mermaid-svg-6STLywKZftCWYVfI .node ellipse,#mermaid-svg-6STLywKZftCWYVfI .node polygon,#mermaid-svg-6STLywKZftCWYVfI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6STLywKZftCWYVfI .node .label{text-align:center;}#mermaid-svg-6STLywKZftCWYVfI .node.clickable{cursor:pointer;}#mermaid-svg-6STLywKZftCWYVfI .arrowheadPath{fill:#333333;}#mermaid-svg-6STLywKZftCWYVfI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6STLywKZftCWYVfI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6STLywKZftCWYVfI .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-6STLywKZftCWYVfI .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-6STLywKZftCWYVfI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6STLywKZftCWYVfI .cluster text{fill:#333;}#mermaid-svg-6STLywKZftCWYVfI .cluster span{color:#333;}#mermaid-svg-6STLywKZftCWYVfI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6STLywKZftCWYVfI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}是否是否矩形区域分割为16x16图块是否纯色?传输背景色分析子矩形使用掩码?传输TileMask颜色数据传输Raw像素数据7. 协议工作流程
#mermaid-svg-VG7Fd7W0t8dh06To {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VG7Fd7W0t8dh06To .error-icon{fill:#552222;}#mermaid-svg-VG7Fd7W0t8dh06To .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VG7Fd7W0t8dh06To .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VG7Fd7W0t8dh06To .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VG7Fd7W0t8dh06To .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VG7Fd7W0t8dh06To .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VG7Fd7W0t8dh06To .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VG7Fd7W0t8dh06To .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VG7Fd7W0t8dh06To .marker.cross{stroke:#333333;}#mermaid-svg-VG7Fd7W0t8dh06To svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VG7Fd7W0t8dh06To .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VG7Fd7W0t8dh06To text.actortspan{fill:black;stroke:none;}#mermaid-svg-VG7Fd7W0t8dh06To .actor-line{stroke:grey;}#mermaid-svg-VG7Fd7W0t8dh06To .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-VG7Fd7W0t8dh06To .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-VG7Fd7W0t8dh06To #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-VG7Fd7W0t8dh06To .sequenceNumber{fill:white;}#mermaid-svg-VG7Fd7W0t8dh06To #sequencenumber{fill:#333;}#mermaid-svg-VG7Fd7W0t8dh06To #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-VG7Fd7W0t8dh06To .messageText{fill:#333;stroke:#333;}#mermaid-svg-VG7Fd7W0t8dh06To .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VG7Fd7W0t8dh06To .labelText,#mermaid-svg-VG7Fd7W0t8dh06To .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-VG7Fd7W0t8dh06To .loopText,#mermaid-svg-VG7Fd7W0t8dh06To .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-VG7Fd7W0t8dh06To .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VG7Fd7W0t8dh06To .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VG7Fd7W0t8dh06To .noteText,#mermaid-svg-VG7Fd7W0t8dh06To .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-VG7Fd7W0t8dh06To .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VG7Fd7W0t8dh06To .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VG7Fd7W0t8dh06To .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VG7Fd7W0t8dh06To .actorPopupMenu{position:absolute;}#mermaid-svg-VG7Fd7W0t8dh06To .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-VG7Fd7W0t8dh06To .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VG7Fd7W0t8dh06To .actor-man circle,#mermaid-svg-VG7Fd7W0t8dh06To line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-VG7Fd7W0t8dh06To :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}ClientServerTCP Connect (端口5900)ProtocolVersionProtocolVersion SecurityTypeChallenge (16字节)DES加密响应SecurityResult (0表示成功)执行对应安全流程alt[安全类型VNC Auth][其他安全类型]ClientInit (shared-flag)ServerInit (分辨率像素格式)FramebufferUpdateRequestFramebufferUpdate (使用协商的编码)alt[屏幕有变化]PointerEvent/KeyEventClientCutTextServerCutTextalt[剪贴板变化]loop[主循环]ClientServer8. 安全性考虑
8.1 协议原生安全机制
VNC认证使用DES加密挑战响应已不安全无加密传输像素数据和输入事件明文传输
8.2 推荐安全实践 SSH隧道加密 ssh -L 5901:localhost:5900 userremote-server
vncviewer localhost:5901扩展安全类型 TLS (安全类型 18)VeNCrypt (安全类型 19)SASL认证 网络层防护 防火墙限制访问IPVPN隧道保护
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 性能优化策略 编码选择优先级 ZRLE Hextile RRE CopyRect Raw增量更新频率 静态内容降低请求频率动态内容增加请求频率 带宽自适应 高带宽高质量无损压缩低带宽降低颜色深度/分辨率
10.2 现代扩展实现
特性实现方式支持实现文件传输自定义消息类型(0x80)TightVNC, UltraVNC多显示器支持Xinerama扩展TigerVNC, RealVNC视频流优化H.264编码扩展TurboVNC触摸屏支持扩展PointerEventMobileVNC
11. 协议演进历史
版本发布时间主要改进3.31998初始公开版本3.72003安全类型列表协商3.82011RFC 6143标准化伪编码IANA注册3.9非标准供应商扩展(文件传输、加密改进等)最新实现参考 TigerVNCLibVNCRealVNC 附录ARFB协议状态机
#mermaid-svg-WOxuTHjRMPxVkME9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WOxuTHjRMPxVkME9 .error-icon{fill:#552222;}#mermaid-svg-WOxuTHjRMPxVkME9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WOxuTHjRMPxVkME9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WOxuTHjRMPxVkME9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WOxuTHjRMPxVkME9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WOxuTHjRMPxVkME9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WOxuTHjRMPxVkME9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WOxuTHjRMPxVkME9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WOxuTHjRMPxVkME9 .marker.cross{stroke:#333333;}#mermaid-svg-WOxuTHjRMPxVkME9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WOxuTHjRMPxVkME9 defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-WOxuTHjRMPxVkME9 g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-WOxuTHjRMPxVkME9 g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-WOxuTHjRMPxVkME9 g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-WOxuTHjRMPxVkME9 g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-WOxuTHjRMPxVkME9 g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-WOxuTHjRMPxVkME9 .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-WOxuTHjRMPxVkME9 .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-WOxuTHjRMPxVkME9 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-WOxuTHjRMPxVkME9 .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-WOxuTHjRMPxVkME9 .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-WOxuTHjRMPxVkME9 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-WOxuTHjRMPxVkME9 .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-WOxuTHjRMPxVkME9 .edgeLabel .label text{fill:#333;}#mermaid-svg-WOxuTHjRMPxVkME9 .label div .edgeLabel{color:#333;}#mermaid-svg-WOxuTHjRMPxVkME9 .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-WOxuTHjRMPxVkME9 .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-WOxuTHjRMPxVkME9 .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-WOxuTHjRMPxVkME9 .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-WOxuTHjRMPxVkME9 .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-WOxuTHjRMPxVkME9 .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WOxuTHjRMPxVkME9 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WOxuTHjRMPxVkME9 #statediagram-barbEnd{fill:#333333;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WOxuTHjRMPxVkME9 .cluster-label,#mermaid-svg-WOxuTHjRMPxVkME9 .nodeLabel{color:#131300;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-WOxuTHjRMPxVkME9 .note-edge{stroke-dasharray:5;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-note text{fill:black;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram-note .nodeLabel{color:black;}#mermaid-svg-WOxuTHjRMPxVkME9 .statediagram .edgeLabel{color:red;}#mermaid-svg-WOxuTHjRMPxVkME9 #dependencyStart,#mermaid-svg-WOxuTHjRMPxVkME9 #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-WOxuTHjRMPxVkME9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}TCP连接成功版本协商成功需要认证认证成功无认证认证失败初始化完成连接关闭DisconnectedVersionExchangeSecurityHandshakeAuthenticationInitializationRunning收到更新请求发送更新完成收到输入事件处理完成WaitRequestSendUpdateProcessInput附录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编码子矩形示例
#mermaid-svg-z0rgu1dsNuB5ZnOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .error-icon{fill:#552222;}#mermaid-svg-z0rgu1dsNuB5ZnOC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z0rgu1dsNuB5ZnOC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .marker.cross{stroke:#333333;}#mermaid-svg-z0rgu1dsNuB5ZnOC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z0rgu1dsNuB5ZnOC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .cluster-label text{fill:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .cluster-label span{color:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .label text,#mermaid-svg-z0rgu1dsNuB5ZnOC span{fill:#333;color:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .node rect,#mermaid-svg-z0rgu1dsNuB5ZnOC .node circle,#mermaid-svg-z0rgu1dsNuB5ZnOC .node ellipse,#mermaid-svg-z0rgu1dsNuB5ZnOC .node polygon,#mermaid-svg-z0rgu1dsNuB5ZnOC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z0rgu1dsNuB5ZnOC .node .label{text-align:center;}#mermaid-svg-z0rgu1dsNuB5ZnOC .node.clickable{cursor:pointer;}#mermaid-svg-z0rgu1dsNuB5ZnOC .arrowheadPath{fill:#333333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z0rgu1dsNuB5ZnOC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-z0rgu1dsNuB5ZnOC .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-z0rgu1dsNuB5ZnOC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z0rgu1dsNuB5ZnOC .cluster text{fill:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC .cluster span{color:#333;}#mermaid-svg-z0rgu1dsNuB5ZnOC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z0rgu1dsNuB5ZnOC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}16x16图块背景色: 0xFFFFFF子矩形1: 颜色0x0000FF, x2,y2,w4,h4子矩形2: 颜色0xFF0000, x10,y8,w4,h6附录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 伪编码应用场景
#mermaid-svg-dTH1ItFpfOhxkT77 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 .error-icon{fill:#552222;}#mermaid-svg-dTH1ItFpfOhxkT77 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dTH1ItFpfOhxkT77 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dTH1ItFpfOhxkT77 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dTH1ItFpfOhxkT77 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dTH1ItFpfOhxkT77 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dTH1ItFpfOhxkT77 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dTH1ItFpfOhxkT77 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dTH1ItFpfOhxkT77 .marker.cross{stroke:#333333;}#mermaid-svg-dTH1ItFpfOhxkT77 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dTH1ItFpfOhxkT77 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dTH1ItFpfOhxkT77 text.actortspan{fill:black;stroke:none;}#mermaid-svg-dTH1ItFpfOhxkT77 .actor-line{stroke:grey;}#mermaid-svg-dTH1ItFpfOhxkT77 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 .sequenceNumber{fill:white;}#mermaid-svg-dTH1ItFpfOhxkT77 #sequencenumber{fill:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 .messageText{fill:#333;stroke:#333;}#mermaid-svg-dTH1ItFpfOhxkT77 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dTH1ItFpfOhxkT77 .labelText,#mermaid-svg-dTH1ItFpfOhxkT77 .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-dTH1ItFpfOhxkT77 .loopText,#mermaid-svg-dTH1ItFpfOhxkT77 .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-dTH1ItFpfOhxkT77 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-dTH1ItFpfOhxkT77 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-dTH1ItFpfOhxkT77 .noteText,#mermaid-svg-dTH1ItFpfOhxkT77 .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-dTH1ItFpfOhxkT77 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dTH1ItFpfOhxkT77 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dTH1ItFpfOhxkT77 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-dTH1ItFpfOhxkT77 .actorPopupMenu{position:absolute;}#mermaid-svg-dTH1ItFpfOhxkT77 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-dTH1ItFpfOhxkT77 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-dTH1ItFpfOhxkT77 .actor-man circle,#mermaid-svg-dTH1ItFpfOhxkT77 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-dTH1ItFpfOhxkT77 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}ClientServer用户改变分辨率FramebufferUpdate[DesktopSize伪编码][新分辨率:1920x1080]调整本地窗口大小FramebufferUpdateRequest(全屏)ClientServer