# HG changeset patch # User Tatsuki IHA # Date 1455112355 -32400 # Node ID a4b118dc9da93839713b861560bcbdadaea91935 # Parent 293297611bec711d9a6642955df9a97147b62b88 Update Lost Child diff -r 293297611bec -r a4b118dc9da9 paper/main.pdf Binary file paper/main.pdf has changed diff -r 293297611bec -r a4b118dc9da9 paper/main.tex --- a/paper/main.tex Mon Feb 08 02:49:37 2016 +0900 +++ b/paper/main.tex Wed Feb 10 22:52:35 2016 +0900 @@ -30,7 +30,7 @@ \setlength{\itemsep}{-1zh} \title{PC画面配信システムTreeVNCの NAT への対応} \icon{ - \includegraphics[width=80mm,bb=0 0 595 842]{fig/ryukyu.pdf} + \includegraphics[width=80mm,bb=0 0 595 642]{fig/ryukyu.pdf} %%元は 642じゃなくて842 } \year{平成27年度 卒業論文} \belongto{琉球大学工学部情報工学科} @@ -93,11 +93,19 @@ \section{多人数で VNC を使用する際の問題} VNCを使用すればクライアント側にサーバー側の画面を表示することが可能である。 -しかし、多人数のクライアントが1つのサーバーに接続してしまうと処理性能が落ちてしまうという問題点がある。 +しかし、図\ref{fig:vnc}のように多人数のクライアントが1つのサーバーに接続してしまうと処理性能が落ちてしまうという問題点がある。 また、 ゼミ等の発表で画面配信者が頻繁に切り替わる場合、 配信者が替わる度にアプリケーションを終了し、接続をし直さないといけないという問題がある。 +\begin{figure}[htbp] + \begin{center} + \includegraphics[scale=0.8]{./images/vnc.pdf} + \end{center} + \caption{VNC} + \label{fig:vnc} +\end{figure} + \section{TreeVNC の構造} TreeVNC は Java を用いて作成された TightVNC(Tight Virtual Network Computing)\cite{tightvnc} を元に作成されている。 @@ -120,6 +128,16 @@ \label{fig:tree} \end{figure} +\section{TreeVNC の原理} +TreeVNC のの原理を書く予定 +\begin{itemize} + \item 従来のVNC : Node数 * データ量 + \item TreeVNC : (2(子供の数) + 1) * データ量 +\end{itemize} +% 従来のVNCはNode数に比例 +% TreeVNCはNode数に関係なく一定 +% 計算式 従来 N * データ量, TreeVNC (M+1) * データ量 + \section{圧縮形式} TreeVNC は ZRLEE\cite{taninari:2012a} というエンコードでデータのやり取りを行う。 ZRLEE はRFB プロトコルで使えるエンコーディングタイプの ZRLE を元に生成される。 @@ -137,7 +155,7 @@ \begin{figure}[htbp] \begin{center} - \includegraphics[scale=0.6]{./images/zrleFail.pdf} + \includegraphics[scale=0.5]{./images/zrleFail.pdf} \end{center} \caption{ZRLEでの問題点} \label{fig:zrleFail} @@ -145,13 +163,12 @@ \begin{figure}[htbp] \begin{center} - \includegraphics[scale=0.6]{./images/zrlee.pdf} + \includegraphics[scale=0.5]{./images/zrlee.pdf} \end{center} \caption{ZRLEE} \label{fig:zrlee} \end{figure} - \section{通信経路} TreeVNC の通信経路として以下が挙げられる \begin{itemize} @@ -178,7 +195,7 @@ & FIND\_ROOT\_REPLY & FIND\_ROOTへの返信。 \\ \cline{2-3} send direct message & CONNECT\_TO\_AS\_LEADER & 左子Nodeとして接続する。接続先のNodeが含まれている。 \\ \cline{2-3} - (Root to Node) & CONNECT & 右子Nodeとして接続する。接続先のNodeが含まれている。 \\ \hline \hline + (Root to Node) & CONNECT\_TO & 右子Nodeとして接続する。接続先のNodeが含まれている。 \\ \hline \hline message down tree & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。\\ \cline{2-3} (Root to Node) & CHECK\_DELAY & 通信の遅延を測定する。 \\ \hline \hline @@ -201,32 +218,31 @@ \label{tb:message} \end{table} -図\ref{fig:message}は TreeVNC で Node が Root Node に接続し、画像データを受信するまでのメッセージ通信の様子である。 +図\ref{fig:message}は TreeVNC で 新しいNode が Root Node と通信し、木構造を形成するためのメッセージ通信の流れである。 図\ref{fig:message}の手順として \begin{itemize} - \item 接続を行う Node (以下 Client Node)はMulticast通信で Root Node に対してFIND\_ROOTを送信する(1:findRoot()) - \item Root NodeがFIND\_ROOTを受信し、FIND\_ROOT\_REPLYを送信する(2:findRootReplay()) - \item Client Node 側で、どのRoot Nodeに接続するかを選択するパネルが表示される - \item Client Node はパネルで接続するRoot Nodeを選択し、Rootに対して接続先を要求するWHERE\_TO\_CONNECTを送信する(3:whereToConnect()) - \item 受信した Root Node は Client Node の接続先をCONNECT\_TOで送信する(4:connectTo) - \item Client Node は Root の指定した接続先に接続しに行く - \item Root Node, Client Node間の接続が確立後、Root Node から Clinet Node に対して定期的に画像データFRAME\_BUFFER\_UPDATEを送信する(5:framebufferUpdate()) + \item 接続を行う Node は Multicast 通信で Root Node に対してFIND\_ROOTを送信する。 + \item Root NodeがFIND\_ROOTを受信し、FIND\_ROOT\_REPLYを送信する。 + \item Node 側で、どのRoot Nodeに接続するかを選択するパネルが表示される。 + \item Node はパネルで接続するRoot Nodeを選択し、Rootに対して接続先を要求するWHERE\_TO\_CONNECTを送信する。 + \item 受信した Root Node は Node の接続先をCONNECT\_TOで送信する。 Node 3 が接続する場合、Root Node には既に2台の Node が接続している為、 CONNET\_TO で指定する接続先は Node 1となる。 + \item Node は Root の指定した接続先に接続しに行く。 \end{itemize} -を行っている。 +を行い、木構造を形成する。 -\begin{figure}[ht] +\begin{figure}[htbp] \begin{center} - \includegraphics[width=65mm]{./images/message.pdf} + \includegraphics[scale=0.5]{./images/message.pdf} \end{center} \caption{node 間で行われるメッセージ通信} \label{fig:message} \end{figure} \section{MulticastQueue} -配信側の画面が更新されると、 VNCServer から画像データがFRAME_BUFFER_UPDATE メッセージとして送られる。 -その際、 画像データの更新を複数の Node に同時に伝えるため、 MulticastQueue というキューに画像データを格納する。 +配信側の画面が更新されると、 VNCServer から画像データがFRAME\_BUFFER\_UPDATE メッセージとして送られる。 +その際、 画像データの更新を複数の Node に同時に伝えるため MulticastQueue というキューに画像データを格納する。 MulticastQueue は java.util.concurrent.CountDownLatch を用いて実装されている。 CountDownLatch は java の並列用のAPIで他のスレッドで実行中の操作が完了するまで、複数のスレッドを待機させることが出来るクラスである。 @@ -250,25 +266,25 @@ TreeVNC は VNC サーバーから送られる画像データ(FRAME\_BUFFER\_Update)を MulticastQueue に蓄積しており、 Node はこのキューから画像データを取得し、画面を描画している。 -Lost\_Child の検出方法はこの MulticastQueue を使用している。 +LOST\_CHILD の検出方法はこの MulticastQueue を使用している。 ある一定時間 MulticastQueue から画像データが取得されない場合 Memory Over Flow を回避するために Timeout スレッドが用意されている。 Timeout を検知した際、Node との接続が切れたと判断する。 -LOST\_CHILD の検知・木の再構成を以下に示す。 +図\ref{fig:lostChild}は6台の Node が接続してる状態で、 Node3 が切断した場合の木の再構成を示している。 + \begin{itemize} - \item 子 Node の切断を検知した Node が Root Node へ LOST\_CHILD メッセージを送信する(図\ref{fig:lostchild1}中, 1:lostChild()) - \item LOST\_CHILD メッセージを受け取った Root Node は nodeList の更新を行う(図\ref{fig:lostchild1}中, 2:updateNodeList()) - \item 切断した Node を nodeList から消し、nodeList の最後尾の Node に切断した node number を割り当てる - \item Root Node は最後尾の Node に、切断した子 Node が接続していた親 Node に接続する様に CONNECT\_TO メッセージを送信する(図\ref{fig:lostchild1}中, 3:connectTo(1)) - \item 最後尾の Node が子 Node を失った親 Node へ接続しに行く(図\ref{fig:lostchild1}中, 4:connectToParent(1)) + \item Node3 の切断を検知した Node1 が Root Node へ LOST\_CHILD メッセージを送信する(1: send LOST\_CHILD)。 + \item LOST\_CHILD メッセージを受け取った Root Node は nodeList から切断した Node を消し、最後尾の Node6 に切断した Node Number を割り当てる(2: update nodeList)。 + \item Root Node は最後尾の Node6 に、切断した子 Node3 が接続していた Node1 に接続する様に CONNECT\_TO メッセージを送信する(3: send CONNECT\_TO (Node1))。 + \item 最後尾の Node が子 Node を失った親 Node へ接続しに行く(4: connect (Node1))。 \end{itemize} -\begin{figure}[ht] +\begin{figure}[htbp] \begin{center} - \includegraphics[width=70mm]{./images/lostChild1.pdf} + \includegraphics[scale=0.6]{./images/lostChild.pdf} \end{center} \caption{LOST\_CHILD を検知・再接続} - \label{fig:lostchild1} + \label{fig:lostChild} \end{figure} LOST\_CHILD によって、 切断された全ての Node を検知することができるため、 nodeList の更新が正しく行われる。 @@ -298,9 +314,9 @@ この問題を解決するために、 図\ref{fig:multinetworktree}の様に、ネットワーク別に 木構造を形成するように設計した。 -\begin{figure}[ht] +\begin{figure}[htbp] \begin{center} - \includegraphics[width=70mm]{./images/MultiNetworkTree.pdf} + \includegraphics[width=70mm]{} \end{center} \caption{Multi Network Tree} \label{fig:multinetworktree} @@ -315,7 +331,30 @@ 新しい Node が接続してきた際、 interfaces から Node のネットワークと一致する TreeManager を取得し、 Node 接続の処理を任せる。 そのため、 TreeVNC が複数のネットワーク別に木構造を構成することが可能となる。 -% 実験 +\chapter{NAT 越え} +\section{DirectConnection} +遠隔地からでもゼミや授業に参加できるよう、 NATを越えたネットワークから TreeVNC への接続を可能にした。 + +図\ref{fig:directConnection} にNATを越えたネットワークからの接続を示す。 +別ネットワークからTreeVNCに参加する際、 直接配信側のネットワークの Root Node に接続を行う。 +この接続を Direct Connection と呼ぶ。 + +Direct Connection した Node はそのネットワークの Root Node になる。 +そのネットワークの他の Node はそのネットワークの Root Node に接続し、木構造を生成する。 + +配信側の Root Node は Direct Connection で接続された Root Node に対して Framebuffer Update で 画像データを送信する。 +Framebuffer Update が送信された Root Node は そのネットワークの Node に対して Framebuffer Update を送信する。 + +これにより、NATを越えたネットワークの画面共有が可能となる。 + +\begin{figure}[htbp] + \begin{center} + \includegraphics[scale=0.5]{./images/directConnection.pdf} + \caption{遠隔地 Node からの接続} + \label{fig:directConnection} + \end{center} +\end{figure} + \chapter{TreeVNC の追加機能} \section{マルチディスプレイ対応} 画面配信側のPCがマルチディスプレイの場合、 @@ -333,37 +372,14 @@ 図\ref{fig:multidisplay} は Display1 のみを画面共有する例を示している。 -\begin{figure}[ht] +\begin{figure}[htbp] \begin{center} - \includegraphics[width=70mm]{./images/shareScreenToMultiDisplay.pdf} + \includegraphics[scale=0.5]{./images/shareScreenToMultiDisplay.pdf} \end{center} \caption{マルチディスプレイへの対応} \label{fig:multidisplay} \end{figure} -\section{NAT越え} -遠隔地からでもゼミや授業に参加できるよう、 NATを越えたネットワークから TreeVNC への接続を可能にした。 - -図\ref{fig:directConnection} にNATを越えたネットワークからの接続を示す。 -別ネットワークからTreeVNCに参加する際、 直接配信側のネットワークの Root Node に接続を行う。 -この接続を Direct Connection と呼ぶ。 - -Direct Connection した Node はそのネットワークの Root Node になる。 -そのネットワークの他の Node はそのネットワークの Root Node に接続し、木構造を生成する。 - -配信側の Root Node は Direct Connection で接続された Root Node に対して Framebuffer Update で 画像データを送信する。 -Framebuffer Update が送信された Root Node は そのネットワークの Node に対して Framebuffer Update を送信する。 - -これにより、NATを越えたネットワークの画面共有が可能となる。 - -\begin{figure}[ht] - \begin{center} - \includegraphics[width=80mm]{./images/directConnection.pdf} - \caption{遠隔地 Node からの接続} - \label{fig:directConnection} - \end{center} -\end{figure} - \section{ネックになっているノードへの対処} \section{別 Thread での画面切り替え} @@ -396,7 +412,6 @@ \end{lstlisting} \end{table} - \section{結果} バイナリツリーで木を構成した場合、 Node 数が17台だと深さが4となる。 各木構造の階層毎に、画像データの伝搬にかかった時間を測定した。 @@ -411,8 +426,6 @@ このような極端に遅い Node をそのまま木に配置した場合、その Node の子 Node 以下に影響を及ぼす場合がある。 そのため、遅い Nodeを検出して、木の最後尾に移動させる機能が必要である。 -今回4段分のデータでは30名程度の遅延のみしか判断することができないため、更に大人数での実験を繰り返し行う必要がある。 - \begin{figure}[ht] \begin{center} \includegraphics[scale=0.8]{./images/depth1.eps}