9
9

More than 3 years have passed since last update.

いまさらRFBプロトコルについてまとめた

Last updated at Posted at 2019-12-17

RFBプロトコルってなに?

多くの人が使っているであろうVNCのサーバーとクライアントがデータのやり取りのために使っている通信プロトコルです。
RFBは"Remote FrameBuffer"の略で、その名の通り、サーバー側のフレームバッファをリモートで見られるようにするものです。
ドキュメントを読んだので簡単にまとめました。

大まかな通信の流れ

大まかな流れは下記の図のように、ハンドシェイクフェーズで諸々取り決めをした後、通常のプロトコル対話でサーバー側の画像データやクライアント側の入力のやり取りが行われる感じです。

大きな流れを理解しやすくするため、エンコードやピクセルフォーマットに関しては端折っています。
気になる方はコチラを参照
Screenshot from 2019-12-17 16-05-15.png

ハンドシェイクフェーズ

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 を返すことも許されている)
↓メッセージ詳細:information_desk_person:

バイト数 説明
1 U8 3 message-type
1 U8 incremental
2 U16 x座標
2 U16 y座標
2 U16
2 U16 高さ

KeyEvent

なんのキーが押されたor離されたことを示すメッセージ
↓メッセージ詳細:information_desk_person:

バイト数 説明
1 U8 4 message-type
1 U8 down-flag
2 padding
4 U32 key

PointerEvent

ポインタの移動、またはポインタのボタンが押された、放されたことを示すメッセージ
ポインタの位置は(x座標、y座標)で表される
↓メッセージ詳細:information_desk_person:

バイト数 説明
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メッセージに対応する長方形のピクセルデータを送っている
↓ヘッダー詳細:information_desk_person:

バイト数 説明
1 U8 0 message-type
1 padding
2 U16 number-of-rectangles

↓メッセージ詳細:information_desk_person:

バイト数 説明
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

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9