title: 有線 LAN 上のPC画面配信システムTreeVNCの改良 author: Tatsuki IHA profile: lang: Japanese code-engine: coderay # 画面共有を利用したコミュニケーション 授業やゼミ等で、それぞれが PC 端末を持っている場合では、PC の機能を活かした コミュニケーションが可能である。教員が操作する画面をそのまま学生に配信したり, ゼミ などで、発表する学生の画面を切り替えたりすることを可能にしたい。画面配信システム TreeVNC は参加したクライアントをバイナリツリー状に接続し、配信コストを分散させる 仕組みを取っている。そのため, 多人数が参加しても処理性能が下がらない。また、ツリー のルートが参照している VNC サーバーを変更することで、ケーブルの差し替えなしに画面 の切替が可能となる。 # 画面共有を利用したコミュニケーション しかし、 TreeVNC を実際に使用していく中で様々な問題が発生した。 本研究では TreeVNC の改良として、複数のネットワークへの対応、 WAN への対応、 マルチディスプレイへの対応を行うとともに、TreeVNC 有用性を示すた めに画像データの遅延時間計測を行った。 # TreeVNC - は本研究室で開発している VNC を利用した画面配信システム - 参加したクライアントをバイナリツリー状で接続することで配信コストを分散させる - スムーズな画面の切替を行う # 問題点を一枚づつ # 解決した問題 # VNC - VNC(Virtual Network Computing) は RFBプロトコルを用いて遠隔操作を行うソフトウェア - サーバー側とクライアント側に分かれており、サーバーを起動し、クライアントがサーバーに接続を行うことで遠隔操作を可能とする # RFB プロトコル - RFB(Remote Frame Buffer)プロトコルは VNC で用いられているプロトコル - 自身の画面をネットワーク越しに他者の画面に表示する - RFB サーバと RFB クライアントに分かれている - Framebuffer と呼ばれるメモリ上に置かれた画像データを使用して画面表示を行う - RFB サーバーは Framebuffer が更新されるたびにRFB クライアントに対して 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数に関係なく一定 # TreeVNC の圧縮形式 - TreeVNC は ZRLEE というエンコードでデータのやり取りを行う - ZRLEE は ZRLE を元に生成される # ZRLE - RFB プロトコルで使えるエンコーディングタイプの1つ - Zlib で圧縮されたデータとそのデータのバイト数がヘッダーとして付け加えられる - java.util.zip.deflater で圧縮, java.util.zip.inflater で解凍が行える # java.util.zip.deflater の問題点 - java.util.zip.deflater は必要な辞書を書き出す事ができない - そのためZlibで圧縮されたデータを途中から受け取ってもデータを正しく解凍できない # ZRLEE - ZRLEE はZRLE を一度 Root Node で解凍して再圧縮を行う - 再圧縮の際にfinish()を入れることで初めからデータを呼んでいなくても解凍を行える - 一度 ZRLEE に変換すれば子 Node はそのデータをそのまま流すだけで良い # TreeVNC の通信経路 - ある Node から Root Node に直接通信を行う send direct message (Node to Root) - Root Node からある Node に直接通信を行う send direct message (Root to Node) - Root Node から木の末端の Node までのすべての Node に通信を行う messeage down tree (Root to Node) - ある Node から木構造を上に辿って Root Node まで通信を行う message up tree (Node to Root) - Root Node から配信者の VNC サーバーへ の通信を行う send message (Root to VNC- Server) - VNC サーバーから Root Node への通信を行う send message (VNCServer to Root) # TreeVNC に参加するまでのメッセージ通信の流れ
|