OpenBMC开发之KVM客户端建连RFB协议
1. 知识补充
- WebSokcet协议:一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
- RFB协议:Remote Frame Buffer 远程帧缓冲协议,用于远程访问图形用户界面的协议。
- 图像传输特点:RFB 协议会在服务器端将窗口在显存中画好,然后将图像传给客户端,客户端只需要将得到的图像解码显示即可。
- RFB 适用范围: RFB协议于瘦客户端,瘦客户端指的是最大可能减轻客户端的负担,多数工作由服务器端完成。
- RFB协议连接流程:与大多数协议一样,它也是通过TCP /IP协议簇连接。
首先是握手报文,目的是对协议版本和加密方式进行协商。
第二步是初始化报文,主要用于客户和服务器的初始化消息。
最后就是正常协议的交互,客户端可以按需发送消息,然后可以获得服务器的回复。
2. 如何获取到图像帧
- websocket 建连
- fb协议信息交互,获取图像帧数据
- canvas填充图像
3. WebSocket建连
kvm前端创建websocket,连接到数据中转模块;然后数据中转模块创建websocket,连接到kvm后端,完成websocket连接通道的建立。
参考代码:
webui\node_modules@novnc\novnc\core\rfb.js
webui\node_modules@novnc\novnc\core\websock.js
4. RFB协议交互
整体交互流程如下所示:
-
接收并发送rfb版本号:
_handle_message()(line815) -> _init_msg()(line1746) -> _negotiate_protocol_vertion(); -
当前使用的版本号为: RFB 003.008
-
rfb协议安全认证
安全认证流程及涉及接口:
确认主从权限:
_negotiate_oem_magic() ;
接收安全认证方式类型列表:
_negotiate_security();
选择安全认证方式: None
接收安全认证结果:
_handle_security_result();
- rfb协议信息交互
客户端初始化:
发送远程会话模式,独占或共享;
服务端初始化 _negotiate_server_init():
接收图像相关参数 _negotiate_server_init()
发送图像编码格式 clientEncodings() Tight Encoding
消息交互 _normal_msg()(line1908) :
获取第一帧数据:_framebufferUpdate()(line2182) ;
5. Canvas图像填充
- 创建canvas节点:
document.createElement() - 节点绑定:
Websocket建连成功将canvas节点绑定到noVNC_container之下;取消连接则移除相应canvas节点; - 图像填充:
_framebufferUpdate ()(line2182)
display.flip()(line256) drawImage();