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