title: 有線 LAN 上のPC画面配信システムTreeVNCの改良 author: Tatsuki IHA, Shinji KONO profile: lang: Japanese code-engine: coderay # 画面共有を利用したコミュニケーション - 授業やゼミ等で、それぞれが PC 端末を持っている場合では、PC の機能を活かした コミュニケーションが可能である - 画面配信システム TreeVNC は参加したクライアントをバイナリツリー状に接続し、配信コストを分散させる 仕組みを取っている。そのため, 多人数が参加しても処理性能が下がらない - ツリー のルートが参照している VNC サーバーを変更することで、ケーブルの差し替えなしに画面の切替が行える # TreeVNC の問題点 - TreeVNC を実際に使用していく中で様々な問題が発生した。 - 琉球大学では無線と有線が別々のネットワークになっている - TreeVNCは単一のネットワークにしか対応できず、両方のネットワークにつながっている端末でも1つのネットワークでしか使用できなかった - 講義等を大学外の遠隔地から受けたい場合がある - TreeVNC は NAT を越えた接続が行うことができない # TreeVNC の問題点 - ゼミ等で発表者毎に画面切り替えを行う際、デュアルディスプレイを使っている人がいた - その際 VNC サーバーからはすべての画面データが送信されており、発表とは関係ない画面も配信されていた message # この発表は - TreeVNC の概要 - 構造 - 圧縮形式 - TreeVNC の原理 - 画面切り替え - 今回の改良 - 描画処理の安定化 - 複数のネットワークの対応 - NAT を越えた通信 - マルチディスプレイの対応 - TreeVNC の評価 - 画像データ送信の遅延 # TreeVNC - TreeVNC は本研究室で開発している VNC を利用した画面配信システム - 参加したクライアントをバイナリツリー状で接続することで配信コストを分散させる - スムーズな配信画面の切替を行う message # VNC - VNC(Virtual Network Computing) は RFBプロトコルを用いて遠隔操作を行うソフトウェア - サーバー側とクライアント側に分かれており、サーバーを起動し、クライアントがサーバーに接続を行うことで遠隔操作を可能とする message # RFB プロトコル - RFB(Remote Frame Buffer)プロトコルは VNC で用いられているプロトコル - 自身の画面をネットワーク越しに他者の画面に表示する - Framebuffer と呼ばれるメモリ上に置かれた画像データを使用して画面表示を行う - サーバーは Framebuffer が更新されるたびにクライアントに対して変更部分だけを送信する。 # 多人数でVNCを使用する際の問題点 - 多人数のクライアントが1つのサーバーに接続する構造 - サーバー側の処理性能が落ちてしまう - 配信者を切り替える際、配信側のサーバーを立ち上げ直す必要がある # TreeVNC の構造 - Java で作成されたTightVNC(Tight Virtual Network Computing) を元に作成されている - クライアント同士をバイナリツリー状に接続する - バイナリツリーのルートのノードをRoot Nodeと呼び、 Root Node に接続されるノードを Node と呼ぶ - Node は 親 Node から送られたデータを自分の子 Node に流す機能、 逆に子 Node から送られてきたデータを親 Nodeに流す機能がある # Root Node - Root Node は 子 Nodeにデータを流す機能に加え - 各 Node の管理 - VNC サーバーから送信されたFramebuffer の管理を行う # TreeVNCの負荷分散 - ポート一本あたりの負荷 - 従来のVNC : Node数 * データ量 - TreeVNC : (2(子供の数) + 1) * データ量 - 従来のVNCはNode数に比例 - TreeVNCはNode数に関係なく一定 message # TreeVNC の圧縮形式 - TreeVNC は ZRLEE というエンコードでデータのやり取りを行う - ZRLEE は Rfb でのエンコードの1つである ZRLE を元に生成される - ZRLEE はZRLE を一度 Root Node で解凍して再圧縮を行う - その際配信画面の更新のたびに辞書を作りなおす message # TreeVNC に参加するまでのメッセージ通信の流れ message # 切断時の木の再構成 - TreeVNC はバイナリーツリーという特性上 Node の切断を検知できずにいると、Node 同士で構成された木構造が崩れてしまう - TreeVNC は Node 切断の検知を LOST\_CHILD というメッセージ通信で行っている message # 共有画面切り替え - TreeVNC の Root Node は配信者の VNC サーバーと通信を行っている - 画面を配信されている側のビューワにある Share Screen ボタンが押す - Root Node に SERVER\_CHANGE\_REQUEST メッセージを送信する - Root Node は Share Screen ボタンを押したクライアントの VNC サーバーと通信を始める。 - NAT 越えは現時点では実装されていない # QUALITY モードと SPEED モード - 高解像度のデータの描画処理はPCのスペックによって重くなる場合がある - 画像描画処理には - 高画質優先の QUALITY モード - 描画速度優先の SPEED モード - 今まで QUALITY モード を使用していた(変更不可) - 今回ビューワからユーザーがどちらのモードを使用するかを変更できるようにした - これにより描画処理の遅延が解決できると思われる # マルチディスプレイ - 画面切り替えの際のSERVER\_CHANGE\_REQUESTに共有するディスプレイの座標を付加する - Root Node は 接続した VNC サーバーから画像データを要求する FRAME\_BUFFER\_UPDATE\_REQUEST メッセージに受け取った座標を付加する - VNC サーバーは要求された座標内の画像データを FRAME\_BUFFER\_UPDATE メッセージで Root Node に送信する message # 複数ネットワークの対応 - Root Node が接続しているネットワークごとに木構造を形成する - 新しい Node が接続してきた際、 interfaces から Node のネットワークと一致する木構造を取得し、 接続の処理を任せる message # Direct Connection - NATを越えたネットワークからの接続は直接配信側の Root Node に接続を行うことで実現する - Direct Connection した Node はそのネットワークの Root Node になり、そのネットワークの他の Node は Root Node に接続を行い木構造を作る message # TreeVNCの評価 - 木の深さによる画像データの遅延を調べる - 実験環境 - 実際に講義を受講している学生が TreeVNC を使用 - 約20名の接続 # 実測方法 - Root Node は 送信時間と画像データを持った CHECK\_DELAY を 末端 Node まで各 Node を伝いながら伝達する - CHECK\_DELAY を受け取った各 Node は CHECK\_DELAY\_REPLY を送信する - CHECK\_DELAY\_REPLY を受け取った Root Node は CHECK\_DELAY の送信にどれだけ時間がかかったかの計算を行う ```java // 遅延時間の計算 Long delay = System.currentTimeMillis() - time; ``` # 深さ1, 2 message message # 深さ3, 4 message message # 結果から - 画像データの伝達はほぼ1秒以内に収まっている - 容量が小さい場合でも時間がかかる場合がある。 それはその送信の前に大容量の画像を送信した後の回線の Delay が残っているためだと考えられる - 深さ 3 で極端に遅い場合がある。 遅い原因として1つの Node がボトルネックになっている事が判明した。 - ネックになった Node をそのままにするとその子Nodeに影響を及ぼしてしまう。 そのためその Node に何らかの対応を行う必要がある # まとめと課題 - 今回TreeVNCの様々な問題点の解決を行った - 実験を行うことによりさらなる問題点が判明した - 実測で判明したネックになっているNodeへの対処 - NATを越えた画面切り替え - 追加した機能の評価方法を思考し、評価を行う