Mercurial > hg > Papers > 2016 > parusu-thesis
comparison paper/main.tex @ 3:0fa28652aa74
Add TreeVNC outline for prosym
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 04 Feb 2016 18:50:39 +0900 |
parents | 2ab5639a8ea7 |
children | 77b8edf27879 |
comparison
equal
deleted
inserted
replaced
2:2ab5639a8ea7 | 3:0fa28652aa74 |
---|---|
52 | 52 |
53 \chapter{TreeVNC の概念} | 53 \chapter{TreeVNC の概念} |
54 \label{chap:concept} | 54 \label{chap:concept} |
55 | 55 |
56 \section{VNC} | 56 \section{VNC} |
57 VNC(Virtual Network Computing) は、 RFBプロトコルを用いて遠隔操作を行うリモートデスクトップソフトウェアである。 | |
58 VNC はサーバー側とクライアント(ビューア)側に分かれている。 サーバを起動し、クライアントがサーバに接続を行い遠隔操作を可能とする。 | |
59 | |
57 \section{RFB プロトコル} | 60 \section{RFB プロトコル} |
61 RFB(remote frame buffer)プロトコル\cite{rfbProtocol}とは、自身の画面を送信し、ネットワーク越しに他者の画面に表示するプロトコルである。 | |
62 ユーザが居る側をRFBクライアント側と呼び、Framebufferへの更新が行われる側はRFBサーバと呼ぶ。 | |
63 Framebufferとは、メモリ上に置かれた画像データのことである。 | |
64 RFBプロトコルでは、最初にプロトコルバージョンの確認や認証が行われる。 | |
65 その後、クライアントに向けてFramebufferの大きさやデスクトップに付けられた名前などが含まれている初期メッセージが送信される。 | |
66 RFBサーバ側はFramebufferの更新が行われるたびに、RFBクライアントに対してFramebufferの変更部分だけを送信する。 | |
67 更にRFBクライアントのFramebufferUpdateRequestが来るとそれに答え返信する。 | |
68 RFBプロトコルは、描画データに使われるエンコードが多数用意されており、また独自のエンコードを実装することもできるプロトコルである。 | |
69 | |
58 \section{多人数で VNC を使用する際の問題} | 70 \section{多人数で VNC を使用する際の問題} |
71 VNCを使用すればクライアント側にサーバー側の画面を表示することが可能である。 | |
72 しかし、多人数のクライアントが1つのサーバーに接続してしまうと処理性能が落ちてしまうという問題点がある。 | |
73 | |
74 また、 ゼミ等の発表で画面配信者が頻繁に切り替わる場合、 | |
75 配信者が替わる度にアプリケーションを終了し、接続をし直さないといけないという問題がある。 | |
76 | |
59 \section{TreeVNC の構造} | 77 \section{TreeVNC の構造} |
78 TreeVNC は Java を用いて作成された TightVNC(Tight Virtual Network Computing)\cite{tightvnc} を元に作成されている。 | |
79 | |
80 TreeVNC は クライアント同士を接続させ、画面描画のデータを受け取ったクライアントが次のクライアントにデータを流す方式を取っている。 | |
81 また、サーバへ接続しに来たクライアントをバイナリツリー状に接続する(図\ref{fig:tree})。 | |
82 バイナリツリー状に接続することで、$N$台のクライアントが接続しに来た場合、画面配信の画像データをコピーする回数は従来の VNC ではサーバ側で$N$回する必要があるが、TreeVNCでは各ノードが2回ずつコピーするだけで済む。 | |
83 | |
84 TreeVNCで通信される画像のデータ量は大きいため、大きなネットワークスループットが必要である。 | |
85 そのため、有線接続が必須である。 | |
86 | |
87 バイナリツリーのルートのノードを Root Node と呼び、 Root Node に接続されるノードを Node と呼ぶ | |
88 Root Node は子 Nodeにデータを流す機能に加え、各 Node の管理、 VNC サーバーから流れてきた画像データの管理を行う。 | |
89 Node は 親 Node から送られたデータを 自分の子 Node に流す機能、 逆に子 Node から送られてきたデータを 親 Node に流す機能がある。 | |
90 | |
91 \begin{figure}[ht] | |
92 \begin{center} | |
93 \includegraphics[width=70mm]{./pic/TreeVNC.pdf} | |
94 \end{center} | |
95 \caption{構成される木構造} | |
96 \label{fig:tree} | |
97 \end{figure} | |
98 | |
60 \section{圧縮形式} | 99 \section{圧縮形式} |
100 TreeVNC は ZRLEE\cite{taninari:2012a} というエンコードでデータのやり取りを行う。 | |
101 ZRLEE はRFB プロトコルで使えるエンコーディングタイプの ZRLE を元に生成される。 | |
102 | |
103 ZRLE は Zlib\cite{zlib} で圧縮されたデータとそのデータのバイト数がヘッダーとして付けて送られてくる。 | |
104 Zlib は java.util.zip.deflater と java.util.zip.inflater で圧縮と解凍が行える。 | |
105 | |
106 しかし、 java.util.zip.deflater は解凍に必要な辞書を書き出す(flush)ことが出来ない。 | |
107 辞書を書き出すことが出来ないため、 Zlib圧縮されたデータを途中から受け取ってもデータを正しく解凍することが出来ない。 | |
108 | |
109 そこで ZRLEE は 一度 Root Node で受け取った ZRLE のデータを unzip し、 データをzip し直して最後に finish() をいれることで初めからデータを呼んでいなくても解凍を行えるようにした。 | |
110 | |
111 一度 ZRLEE に変換してしまえば子 Node はそのデータをそのまま流すだけで良い。 | |
112 ただし、deflater と inflater では前回までの通信で得た辞書をクリアしないといけないため、 Root Node と Node 側では毎回新しく作る必要がある。 | |
113 | |
61 \section{通信経路} | 114 \section{通信経路} |
115 TreeVNC の通信経路として以下が挙げられる | |
116 \begin{itemize} | |
117 \item ある Node から Root Node に直接通信を行う send direct message (Node to Root) | |
118 \item Root Node からある Node に直接通信を行う send direct message (Root to Node) | |
119 \item Root Node から木の末端の Node までのすべての Nodeに通信を行う messeage down tree (Root to Node) | |
120 \item ある Node から木構造を上に辿って Root Nodeまで通信を行う message up tree (Node to Root) | |
121 \item Root Node から配信者の VNC サーバーへの通信を行う send message (Root to VNCServer) | |
122 \item VNC サーバーから Root Node への通信を行う send message (VNCServer to Root) | |
123 \end{itemize} | |
124 | |
125 \section{ノード間で行われるメッセージ通信} | |
126 RFBプロトコルで提供されているメッセージに加え、 TreeVNC 独自のメッセージを使用している。 | |
127 TreeVNC で使用されるメッセージの一覧を表\ref{tb:message}に示す。 | |
128 | |
129 \begin{table}[h!] | |
130 \caption{通信経路とメッセージ一覧} | |
131 \large | |
132 \scalebox{0.4} { | |
133 \begin{tabular}{|l|l|l|} \hline | |
134 通信経路 & message & 説明 \\ \hline \hline | |
135 & FIND\_ROOT & TreeVNC接続時にRoot Nodeを探す。 \\ \cline{2-3} | |
136 send direct message & WHERE\_TO\_CONNECT & 接続先をRoot Nodeに聞く。 \\ \cline{2-3} | |
137 (Node to Root) & LOST\_CHILD & 子Nodeの切断をRoot Nodeに知らせる。 \\ \hline \hline | |
138 | |
139 & FIND\_ROOT\_REPLY & FIND\_ROOTへの返信。 \\ \cline{2-3} | |
140 send direct message & CONNECT\_TO\_AS\_LEADER & 左子Nodeとして接続する。接続先のNodeが含まれている。 \\ \cline{2-3} | |
141 (Root to Node) & CONNECT & 右子Nodeとして接続する。接続先のNodeが含まれている。 \\ \hline \hline | |
142 | |
143 message down tree & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。\\ \cline{2-3} | |
144 (Root to Node) & CHECK\_DELAY & 通信の遅延を測定する。 \\ \hline \hline | |
145 | |
146 message up tree & CHECK\_DELAY\_REPLY & CHECK\_DELAYへの返信。 \\ \cline{2-3} | |
147 (Node to Root) & SERVER\_CHANGE\_REQUEST & 画面切り替え要求。 \\ \hline \hline | |
148 | |
149 & FRAMEBUFFER\_UPDATE\_REPLY & 画像データの要求。 \\ \cline{2-3} | |
150 send message & SET\_PIXEL\_FORMAT & pixel値の設定。 \\ \cline{2-3} | |
151 (Root to VNCServer) & SET\_ENCODINGS & pixelデータのencodeTypeの設定。 \\ \cline{2-3} | |
152 & KEY\_EVENT & キーボードからのイベント。 \\ \cline{2-3} | |
153 & POINTER\_EVENT & ポインタからのイベント。 \\ \cline{2-3} | |
154 & CLIENT\_CUT\_TEXT & テキストのカットバッファを持った際のmessage。 \\ \hline \hline | |
155 | |
156 & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。 \\ \cline{2-3} | |
157 send message & SET\_COLOR\_MAP\_ENTRIES & 指定されているpixel値にマップするRGB値。 \\ \cline{2-3} | |
158 (VNCServer to Root) & BELL & ビープ音を鳴らす。 \\ \cline{2-3} | |
159 & SERVER\_CUT\_TEXT & サーバがテキストのカットバッファを持った際のmessage。 \\ \hline | |
160 \end{tabular} | |
161 } | |
162 \label{tb:message} | |
163 \end{table} | |
164 | |
165 図\ref{fig:message}は TreeVNC で Node が Root Node に接続し、画像データを受信するまでのメッセージ通信の様子である。 | |
166 図\ref{fig:message}の手順として | |
167 | |
168 \begin{itemize} | |
169 \item 接続を行う Node (以下 Client Node)はMulticast通信で Root Node に対してFIND\_ROOTを送信する(1:findRoot()) | |
170 \item Root NodeがFIND\_ROOTを受信し、FIND\_ROOT\_REPLYを送信する(2:findRootReplay()) | |
171 \item Client Node 側で、どのRoot Nodeに接続するかを選択するパネルが表示される | |
172 \item Client Node はパネルで接続するRoot Nodeを選択し、Rootに対して接続先を要求するWHERE\_TO\_CONNECTを送信する(3:whereToConnect()) | |
173 \item 受信した Root Node は Client Node の接続先をCONNECT\_TOで送信する(4:connectTo) | |
174 \item Client Node は Root の指定した接続先に接続しに行く | |
175 \item Root Node, Client Node間の接続が確立後、Root Node から Clinet Node に対して定期的に画像データFRAME\_BUFFER\_UPDATEを送信する(5:framebufferUpdate()) | |
176 \end{itemize} | |
177 | |
178 を行っている。 | |
179 | |
180 \begin{figure}[ht] | |
181 \begin{center} | |
182 \includegraphics[width=65mm]{./pic/message.pdf} | |
183 \end{center} | |
184 \caption{node 間で行われるメッセージ通信} | |
185 \label{fig:message} | |
186 \end{figure} | |
187 | |
62 \section{MulticastQueue} | 188 \section{MulticastQueue} |
63 \section{木の再構成} | 189 \section{木の再構成} |
190 TreeVNC はバイナリツリーでの接続という特性上 Node が切断されたことを検知できずにいると、Node 同士で構成された木構造が崩れてしまい、新しい Node が接続に来た場合に適切な場所に Node を接続することができなくなってしまう。 | |
191 木構造を崩さないよう、Node 同士の接続を再構成を行う必要がある。 | |
192 | |
193 TreeVNC の木構造のネットワークトポロジーは Root Node が持っている nodeList というリストで管理している。 | |
194 つまり、Node の接続が切れた場合、木の再構成を行うため Root Node に知らせなければならない。 | |
195 | |
196 TreeVNC は Lost\_CHILD というメッセージ通信で Node の切断を検知・木の再構成を行っている。 | |
197 | |
198 TreeVNC は VNC サーバーから送られる画像データ(FRAME\_BUFFER\_Update)を MulticastQueue というキューに蓄積しており、 | |
199 Node はこのキューから画像データを取得し、画面を描画している。 | |
200 Lost\_Child の検出方法はこの MulticastQueue を使用している。 | |
201 ある一定時間 MulticastQueue から画像データが取得されない場合 Memory Over Flow を回避するために Timeout スレッドが用意されている。 | |
202 Timeout を検知した際、Node との接続が切れたと判断する。 | |
203 | |
204 Lost\_Child の検知・木の再構成を以下に示す。 | |
205 \begin{itemize} | |
206 \item 子 Node の切断を検知した Node が Root Node へ LOST\_CHILD メッセージを送信する(図\ref{fig:lostchild1}中, 1:lostChild()) | |
207 \item LOST\_CHILD メッセージを受け取った Root Node は nodeList の更新を行う(図\ref{fig:lostchild1}中, 2:updateNodeList()) | |
208 \item 切断した Node を nodeList から消し、nodeList の最後尾の Node に切断した node number を割り当てる | |
209 \item Root Node は最後尾の Node に、切断した子 Node が接続していた親 Node に接続する様に CONNECT\_TO メッセージを送信する(図\ref{fig:lostchild1}中, 3:connectTo(1)) | |
210 \item 最後尾の Node が子 Node を失った親 Node へ接続しに行く(図\ref{fig:lostchild1}中, 4:connectToParent(1)) | |
211 \end{itemize} | |
212 | |
213 \begin{figure}[ht] | |
214 \begin{center} | |
215 \includegraphics[width=70mm]{./pic/lostChild1.pdf} | |
216 \end{center} | |
217 \caption{LOST\_CHILD を検知・再接続} | |
218 \label{fig:lostchild1} | |
219 \end{figure} | |
220 | |
221 LOST\_CHILD によって、 切断された全ての Node を検知することができるため、 nodeList の更新が正しく行われる。 | |
222 よって、新しく接続に来た Node を適切な場所に接続することが可能となる。 | |
223 | |
224 \section{共有画面切り替え} | |
225 ゼミでは発表者が順々に入れ替わる。発表者が入れ替わる度に共有する画面の切り替えが必要となる。 | |
226 ゼミを円滑に進めるために、画面の切り替えをスムーズに行いたい。 | |
227 | |
228 画面の共有にプロジェクタを使用する場合、 発表者が変わる度にケーブルの抜き差しを行う必要がある。 | |
229 その際に、ディスプレイ解像度を設定し直す必要が出たり、 接続不良が起こる等の煩わしい問題が生じることがある。 | |
230 | |
231 従来のVNCを使用する場合、 画面の切り替えの度に一旦VNCを終了し、発表者の VNC サーバーへと再接続を行う必要がある。 | |
232 | |
233 TreeVNC は配信者の切り替えの度に生じる問題を解決している。 | |
234 TreeVNC を立ち上げることで、ケーブルを使用する必要なしに、各参加者の手元のPCに発表者の画面を共有することができる。 | |
235 画面の切り替えはユーザが VNC サーバーへの再接続を行うことなく、ビューアの Share Screen ボタンを押すことによって、配信者の切り替えを行うことができる。 | |
236 | |
237 TreeVNC の Root Node は配信者の VNC サーバーと通信を行っている。 | |
238 VNC サーバーから画面データを受信し、そのデータを 子 Node へと送信している。 | |
239 配信者切り替え時に Share Screen ボタンが押されると、 | |
240 Root Node は Share Screen ボタン を押したクライアントの VNC サーバーと通信を始める。 | |
241 そのためTreeVNCは配信者切り替えの度に VNC を終了し、再接続する必要がない。 | |
64 \section{複数ネットワークへの対応} | 242 \section{複数ネットワークへの対応} |
65 | 243 |
66 % 実験 | 244 % 実験 |
67 \chapter{TreeVNC の追加機能} | 245 \chapter{TreeVNC の追加機能} |
68 \label{chap:poordirection} | 246 \label{chap:poordirection} |