RFBプロトコルってなに?
多くの人が使っているであろうVNCのサーバーとクライアントがデータのやり取りのために使っている通信プロトコルです。
RFBは"Remote FrameBuffer"の略で、その名の通り、サーバー側のフレームバッファをリモートで見られるようにするものです。
ドキュメントを読んだので簡単にまとめました。
大まかな通信の流れ
大まかな流れは下記の図のように、ハンドシェイクフェーズで諸々取り決めをした後、通常のプロトコル対話でサーバー側の画像データやクライアント側の入力のやり取りが行われる感じです。
大きな流れを理解しやすくするため、エンコードやピクセルフォーマットに関しては端折っています。
気になる方はコチラを参照

ハンドシェイクフェーズ
ProtocolVersion
最初はサーバーからクライアントにメッセージを送る
サーバーとクライアントのRFBプロトコルのバーションを一致させる
メッセージ例:
| バイト数 | 値 |
|---|---|
| 12 | "RFB 003.003\n" |
| この場合、値が意味しているのはRFBプロトコルのバージョンが3.3ってこと |
Security
セキュリティタイプをお互い1バイトメッセージで示す。サーバーが決める
ClientInit
クライアントとサーバーがお互いに合意したセキュリティタイプで通信準備ができたら、クライアントは1バイトの初期化メッセージを送信する
ServerInit
clientinitのメッセージを受け取った後、サーバーはseverinitメッセージを送信する。メッセージ内容は以下の通り。
名前の長さ、名前はデスクトップに関連つけられた名前
通常のプロトコル対話
【クライアントからサーバーへのメッセージ】
クライアントからサーバーへのメッセージタイプは以下の通り
| 値 | 名称 |
|---|---|
| 0 | SetPixelFormat |
| 0 | SetEncodings |
| 3 | FramebufferUpdateRequest |
| 4 | KeyEvent |
| 5 | PointerEvent |
SetPixelFormat
フレームバッファアップデートメッセージないで使用されるピクセル値のフォーマットを設定する。クライアントがこのメッセージを送らなかった場合serverinitialisationメッセージで指定した、サーバー自身の自然なフォーマットを使用する。
SetEncodings
サーバーが送信するピクセルデータに使用するエンコード形式を設定する。
FramebufferUpdateRequest
クライアントがフレームバッファのどこの領域に注目しているかをサーバーに知らせる。
サーバーはこのメッセージに対してframebufferupdateメッセージで応答する。
(FramebufferUpdateRequestに対して複数のFramebufferUpdate を返すことも許されている)
↓メッセージ詳細![]()
| バイト数 | 型 | 値 | 説明 |
|---|---|---|---|
| 1 | U8 | 3 | message-type |
| 1 | U8 | incremental | |
| 2 | U16 | x座標 | |
| 2 | U16 | y座標 | |
| 2 | U16 | 幅 | |
| 2 | U16 | 高さ |
KeyEvent
なんのキーが押されたor離されたことを示すメッセージ
↓メッセージ詳細![]()
| バイト数 | 型 | 値 | 説明 |
|---|---|---|---|
| 1 | U8 | 4 | message-type |
| 1 | U8 | down-flag | |
| 2 | padding | ||
| 4 | U32 | key |
PointerEvent
ポインタの移動、またはポインタのボタンが押された、放されたことを示すメッセージ
ポインタの位置は(x座標、y座標)で表される
↓メッセージ詳細![]()
| バイト数 | 型 | 値 | 説明 |
|---|---|---|---|
| 1 | U8 | 5 | message-type |
| 1 | U8 | button-mask | |
| 2 | padding | ||
| 4 | U32 | key |
【サーバーからクライアントへのメッセージ】
サーバーからクライアントへのメッセージタイプは以下の通り
| 値 | 名称 |
|---|---|
| 0 | FramebufferUpdate |
| 1 | SetColorMapEntries |
| 2 | Bell |
| 3 | ServerCutText |
簡略化のためFramebufferUpdateのみ詳細を紹介
FramebufferUpdate
クライアントからのframebufferupdaterequestメッセージに対応する長方形のピクセルデータを送っている
↓ヘッダー詳細![]()
| バイト数 | 型 | 値 | 説明 |
|---|---|---|---|
| 1 | U8 | 0 | message-type |
| 1 | padding | ||
| 2 | U16 | number-of-rectangles | |
| ↓メッセージ詳細 |
| バイト数 | 型 | 値 | 説明 |
|---|---|---|---|
| 2 | U16 | x座標 | |
| 2 | U16 | y座標 | |
| 2 | U16 | 幅 | |
| 2 | U16 | 高さ | |
| 4 | U32 | encoding-type |
参考
https://tools.ietf.org/html/rfc6143
http://srgia.com/docs/rfbprotocol3.8.html