PC画面配信システムTreeVNCの NAT への対応
Tatsuki IHA, Shinji KONO
画面共有を利用したコミュニケーション
授業やゼミ等で、それぞれが PC 端末を持っている場合では、PC の機能を活かした コミュニケーションが可能である
画面配信システム TreeVNC は参加したクライアントをバイナリツリー状に接続し、配信コストを分散させる 仕組みを取っている。そのため, 多人数が参加しても処理性能が下がらない
ツリー のルートが参照している VNC サーバーを変更することで、ケーブルの差し替えなしに画面の切替が行える
TreeVNC の問題点
TreeVNC を実際に使用していく中で様々な問題が発生
講義等を大学外の遠隔地から受けたい場合がある
TreeVNC は NAT を越えた接続が行うことができない
TreeVNC の問題点
ゼミ等で発表者毎に画面切り替えを行う際、デュアルディスプレイを使っている学生がいた
その際 VNC サーバーからはすべての画面データが送信されており、発表とは関係ない画面も配信されていた
この発表は
TreeVNC の概要
構造
原理
画面切り替え
今回の改良
NAT を越えた通信
マルチディスプレイの対応
TreeVNC の評価
画像データ送信の遅延
ネックになってるノードへの対処
TreeVNC
TreeVNC は本研究室で開発している VNC を利用した画面配信システム
参加したクライアントをバイナリツリー状で接続することで配信コストを分散させる
スムーズな配信画面の切替を行う
VNC
VNC(Virtual Network Computing) は RFBプロトコルを用いて遠隔操作を行うソフトウェア
サーバー側とクライアント側に分かれており、サーバーを起動し、クライアントがサーバーに接続を行うことで遠隔操作を可能とする
RFB プロトコル
RFB(Remote Frame Buffer)プロトコルは VNC で用いられているプロトコル
自身の画面をネットワーク越しに他者の画面に表示する
Framebuffer と呼ばれるメモリ上に置かれた画像データを使用して画面表示を行う
サーバーは Framebuffer が更新されるたびにクライアントに対して変更部分だけを送信する。
TreeVNC の構造
Java で作成されたTightVNC(Tight Virtual Network Computing) を元に作成されている
様々なメッセージで通信を行う
クライアント同士をバイナリツリー状に接続する
バイナリツリーのルートのノードをRoot Nodeと呼び、 Root Node に接続されるノードを Node と呼ぶ
TreeVNCの原理
ポート一本あたりの負荷
従来のVNC : Node数 * データ量
TreeVNC : (2(子供の数) + 1) * データ量
従来のVNCはNode数に比例
TreeVNCはNode数に関係なく一定
切断時の木の再構成
TreeVNC はバイナリーツリーという特性上 Node の切断を検知できずにいると、Node 同士で構成された木構造が崩れてしまう
TreeVNC は Node 切断の検知を LOST_CHILD というメッセージで行っている
共有画面切り替え
TreeVNC の Root Node は配信者の VNC サーバーと通信を行っている
画面を配信されている側のビューワにある Share Screen ボタンが押す
Root Node に SERVER_CHANGE_REQUEST を木構造を辿りながら送信
Root Node は Share Screen ボタンを押したクライアントの VNC サーバーと通信を開始
Direct Connection
NATを越えたネットワークからの接続は直接配信側の Root Node に接続を行うことで実現する
Direct Connection した Node はそのネットワークの Root Node になる
Direct Connection された Root Node では NAT を越えたネットワーク先の Node の管理を行わない
マルチディスプレイ
画面切り替えの際のSERVER_CHANGE_REQUESTに共有するディスプレイの座標を付加する
Root Node は 接続した VNC サーバーから画像データを要求する FRAME_BUFFER_UPDATE_REQUEST に受け取った座標を付加する
VNC サーバーは要求された座標内の画像データを FRAME_BUFFER_UPDATE で Root Node に送信する
TreeVNCの評価
木の深さによる画像データの遅延を調べる
実験環境
実際に講義を受講している学生が TreeVNC を使用
約20名の接続
実測方法
Root Node は 送信時間と画像データを持った CHECK_DELAY を 末端 Node まで木構造を辿りながら伝達する
CHECK_DELAY を受け取った各 Node は 付加された送信時間を CHECK_DELAY_REPLY に付加し、 Root Node に送信する
CHECK_DELAY_REPLY を受け取った Root Node は CHECK_DELAY の送信にどれだけ時間がかかったかの計算を行う
// 遅延時間の計算 Long delay = System.currentTimeMillis() - time;
深さ1, 2
深さ3, 4
結果から
画像データの伝達はほぼ1秒以内に収まっている
容量が小さい場合でも時間がかかる場合がある。 それはその送信の前に大容量の画像を送信した後の回線の遅延が残っているためだと考えられる
深さ3が遅い原因として1つの Node がボトルネックになっている事が判明した。
ネックになった Node をそのままにするとその子Nodeに影響を及ぼしてしまう。 そのためその Node に何らかの対応を行う必要がある
ネックになっているノードへの対処
CHECK_DELAY_REPLY で Root Node は ネックかどうかのを判断をする
ネックになっているなら、そのノードを木構造のリストから削除
最後のノードを削除したnodeの場所に移動
ネックになったところは三分木になる
まとめと課題
今回TreeVNCの様々な問題点の解決を行った
実験を行うことによりさらなる問題点が判明した
実測で判明したネックになっているNodeへの対処
NATを越えた画面切り替え
追加した機能の評価方法を思考し、評価を行う