Mercurial > hg > Papers > 2016 > parusu-thesis
changeset 4:77b8edf27879
Update
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Feb 2016 00:02:39 +0900 |
parents | 0fa28652aa74 |
children | 15eff3ba94ce |
files | paper/main.tex |
diffstat | 1 files changed, 197 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/main.tex Thu Feb 04 18:50:39 2016 +0900 +++ b/paper/main.tex Fri Feb 05 00:02:39 2016 +0900 @@ -3,6 +3,30 @@ \usepackage{mythesis} \usepackage{multirow} \usepackage{here} +\usepackage{listings, jlisting} +\lstset{% + language={java},%使用言語 + basicstyle={\small},%書体 + commentstyle={\small\itshape},%コメントの書体 + keywordstyle={\small\bfseries},%キーワードの書体 + %identifierstyle={\small},% + %ndkeywordstyle={\small},% + stringstyle={\small},%文字列の書体 + frame={trlb},%外枠 + breaklines=true,%改行 + columns=[l]{fullflexible},% + xrightmargin=0zw,% + xleftmargin=3zw,% + numbers=left,%行番号の表示 + numberstyle={\scriptsize},%行番号の書体 + numbersep=1zw,% + stepnumber=1, + lineskip=-0.5ex,% + captionpos=b,%キャプションの位置 + moredelim=**[s][\color{red}]{\"compressed}{\"}, +} +\renewcommand{\lstlistingname}{Code} + \setlength{\itemsep}{-1zh} \title{PC画面配信システムTreeVNCの NAT への対応} \icon{ @@ -126,39 +150,37 @@ RFBプロトコルで提供されているメッセージに加え、 TreeVNC 独自のメッセージを使用している。 TreeVNC で使用されるメッセージの一覧を表\ref{tb:message}に示す。 -\begin{table}[h!] +\begin{table*}[htb] \caption{通信経路とメッセージ一覧} - \large - \scalebox{0.4} { - \begin{tabular}{|l|l|l|} \hline - 通信経路 & message & 説明 \\ \hline \hline - & FIND\_ROOT & TreeVNC接続時にRoot Nodeを探す。 \\ \cline{2-3} - send direct message & WHERE\_TO\_CONNECT & 接続先をRoot Nodeに聞く。 \\ \cline{2-3} - (Node to Root) & LOST\_CHILD & 子Nodeの切断をRoot Nodeに知らせる。 \\ \hline \hline + \scriptsize + \begin{tabular}{|l|l|l|} \hline + 通信経路 & message & 説明 \\ \hline \hline + & FIND\_ROOT & TreeVNC接続時にRoot Nodeを探す。 \\ \cline{2-3} + send direct message & WHERE\_TO\_CONNECT & 接続先をRoot Nodeに聞く。 \\ \cline{2-3} + (Node to Root) & LOST\_CHILD & 子Nodeの切断をRoot Nodeに知らせる。 \\ \hline \hline - & 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 + & 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 - message down tree & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。\\ \cline{2-3} - (Root to Node) & CHECK\_DELAY & 通信の遅延を測定する。 \\ \hline \hline + message down tree & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。\\ \cline{2-3} + (Root to Node) & CHECK\_DELAY & 通信の遅延を測定する。 \\ \hline \hline - message up tree & CHECK\_DELAY\_REPLY & CHECK\_DELAYへの返信。 \\ \cline{2-3} - (Node to Root) & SERVER\_CHANGE\_REQUEST & 画面切り替え要求。 \\ \hline \hline + message up tree & CHECK\_DELAY\_REPLY & CHECK\_DELAYへの返信。 \\ \cline{2-3} + (Node to Root) & SERVER\_CHANGE\_REQUEST & 画面切り替え要求。 \\ \hline \hline - & FRAMEBUFFER\_UPDATE\_REPLY & 画像データの要求。 \\ \cline{2-3} - send message & SET\_PIXEL\_FORMAT & pixel値の設定。 \\ \cline{2-3} - (Root to VNCServer) & SET\_ENCODINGS & pixelデータのencodeTypeの設定。 \\ \cline{2-3} - & KEY\_EVENT & キーボードからのイベント。 \\ \cline{2-3} - & POINTER\_EVENT & ポインタからのイベント。 \\ \cline{2-3} - & CLIENT\_CUT\_TEXT & テキストのカットバッファを持った際のmessage。 \\ \hline \hline + & FRAMEBUFFER\_UPDATE\_REPLY & 画像データの要求。 \\ \cline{2-3} + send message & SET\_PIXEL\_FORMAT & pixel値の設定。 \\ \cline{2-3} + (Root to VNCServer) & SET\_ENCODINGS & pixelデータのencodeTypeの設定。 \\ \cline{2-3} + & KEY\_EVENT & キーボードからのイベント。 \\ \cline{2-3} + & POINTER\_EVENT & ポインタからのイベント。 \\ \cline{2-3} + & CLIENT\_CUT\_TEXT & テキストのカットバッファを持った際のmessage。 \\ \hline \hline - & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。 \\ \cline{2-3} - send message & SET\_COLOR\_MAP\_ENTRIES & 指定されているpixel値にマップするRGB値。 \\ \cline{2-3} - (VNCServer to Root) & BELL & ビープ音を鳴らす。 \\ \cline{2-3} - & SERVER\_CUT\_TEXT & サーバがテキストのカットバッファを持った際のmessage。 \\ \hline - \end{tabular} - } + & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。 \\ \cline{2-3} + send message & SET\_COLOR\_MAP\_ENTRIES & 指定されているpixel値にマップするRGB値。 \\ \cline{2-3} + (VNCServer to Root) & BELL & ビープ音を鳴らす。 \\ \cline{2-3} + & SERVER\_CUT\_TEXT & サーバがテキストのカットバッファを持った際のmessage。 \\ \hline + \end{tabular} \label{tb:message} \end{table} @@ -186,6 +208,10 @@ \end{figure} \section{MulticastQueue} +画用データの送信は MulticastQueue という Queue で行っている。 +MulticastQueue は java.util.concurrent.CountDownLatch を用いて実装されている。 + + \section{木の再構成} TreeVNC はバイナリツリーでの接続という特性上 Node が切断されたことを検知できずにいると、Node 同士で構成された木構造が崩れてしまい、新しい Node が接続に来た場合に適切な場所に Node を接続することができなくなってしまう。 木構造を崩さないよう、Node 同士の接続を再構成を行う必要がある。 @@ -201,21 +227,21 @@ ある一定時間 MulticastQueue から画像データが取得されない場合 Memory Over Flow を回避するために Timeout スレッドが用意されている。 Timeout を検知した際、Node との接続が切れたと判断する。 -Lost\_Child の検知・木の再構成を以下に示す。 +LOST\_CHILD の検知・木の再構成を以下に示す。 \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 子 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)) \end{itemize} \begin{figure}[ht] - \begin{center} - \includegraphics[width=70mm]{./pic/lostChild1.pdf} - \end{center} - \caption{LOST\_CHILD を検知・再接続} - \label{fig:lostchild1} + \begin{center} + \includegraphics[width=70mm]{./pic/lostChild1.pdf} + \end{center} + \caption{LOST\_CHILD を検知・再接続} + \label{fig:lostchild1} \end{figure} LOST\_CHILD によって、 切断された全ての Node を検知することができるため、 nodeList の更新が正しく行われる。 @@ -239,22 +265,145 @@ 配信者切り替え時に Share Screen ボタンが押されると、 Root Node は Share Screen ボタン を押したクライアントの VNC サーバーと通信を始める。 そのためTreeVNCは配信者切り替えの度に VNC を終了し、再接続する必要がない。 -\section{複数ネットワークへの対応} + +\section{複数のネットワークの対応} +従来の TreeVNC は、クライアントの接続する木構造が単一であった。 +そのため、Root Node が複数のネットワークに接続していても、 単一のネットワークでしか使用することができなかった。 + +この問題を解決するために、 図\ref{fig:multinetworktree}の様に、ネットワーク別に 木構造を形成するように設計した。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=70mm]{./pic/MultiNetworkTree.pdf} + \end{center} + \caption{Multi Network Tree} + \label{fig:multinetworktree} +\end{figure} + +TreeVNC は Root Node が TreeManager というオブジェクトを持っている。 +TreeManager は TreeVNC の接続部分を管理している。 +TreeManager では木構造を管理する nodeList が生成される。 +この nodeList を元に、新しい Node の接続や、切断検出時の接続の切り替え等を行う。 + +Root Node の保持しているネットワーク毎にTreeManager を生成する用に変更を行った。 +新しい Node が接続してきた際、 interfaces から Node のネットワークと一致する TreeManager を取得し、 Node 接続の処理を任せる。 +そのため、 TreeVNC が複数のネットワーク別に木構造を構成することが可能となる。 % 実験 \chapter{TreeVNC の追加機能} -\label{chap:poordirection} \section{マルチディスプレイ対応} +画面配信側のPCがマルチディスプレイの場合、 +VNC サーバーからは複数の画面全体の画像データが送信されてしまう。 + +授業やゼミ等でTreeVNCを使用する場合、複数画面の表示は必要ない。 +そこで、画面を共有する際、ディスプレイを選択させ、画面共有を行う機能を追加した。 + +ディスプレイの情報は個々のクライアントでしか取得ができない。 +そのため、配信側は画面の切替を行う際に、ディスプレイを選択し、そのディスプレイの左上と右下の座標を取得する。 +その座標を Root Node への画面切り替えを要求する SERVER\_CHANGE\_REQUEST メッセージに付加させる。 +Root Node は 配信側の VNC サーバー に画像データを要求する FRAMEBUFFER\_UPDATE\_REPLY メッセージに送信された座標を付加する。 +VNC サーバーは要求された座標内の画像データを FRAMEBUFFER\_UPDATE メッセージで Root Node に送信する。 +これにより、一画面のみの表示が可能となる。 + +図\ref{fig:multidisplay} は Display1 のみを画面共有する例を示している。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=70mm]{./pic/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]{./pic/directConnection.pdf} + \caption{遠隔地 Node からの接続} + \label{fig:directConnection} + \end{center} +\end{figure} + \section{ネックになっているノードへの対処} \section{別 Thread での画面切り替え} \chapter{TreeVNC の評価} \section{画像データ伝達の遅延} +VNC サーバー から受信する画像データ、 TreeVNC で扱われるメッセージ通信は構成された木を伝って伝達される。 +接続する人数が増える毎に木の段数は増えていく。 そこで Root Node から木の末端の Node までの画像データ伝達の遅延を検証する実験を行った。 + \section{実験環境} +授業を受講している学生が TreeVNC を使用した状態で実験を行った。 +TreeVNC には最大で17名が接続していた。 + \section{メッセージを使用した実測} +TreeVNC を伝搬するメッセージに、CHECK\_DELAY,CHECK\_DELAY\_REPLYを追加した。 +CHECK\_DELAY は Root Node から 末端の Node まで伝達するメッセージと画像データ、 +CHECK\_DELAY\_REPLY は各 Node から Root Node まで伝達するメッセージである。 + +CHECK\_DELAY メッセージは送信時刻を付けて送信する。 +Root Nodeから CHECK\_DELAY 送信し、末端の Node まで各 Node を伝いながら伝達して行く。 + +CHECK\_DELAY\_REPLY は CHECK\_DELAY から受け取った送信時刻をそのままに、 画像データのサイズを付けて送信する。 +CHECK\_DELAY を受け取った各 Node は CHECK\_DELAY\_REPLY を接続している親 Node に送信する。 + +CHECK\_DELAY\_REPLY を受け取った Root Node はメッセージと画像データの伝達にどれだけの時間がかかったかを計算する。 +データ計算方法を以下の Code \ref{calc}に記述する。 この変数 time は CHECK\_DELAY\_REPLY に付いている CHEKC\_DELAY の送信時刻である。 + +\begin{table}[htb] + + \begin{lstlisting}[label=calc, caption=遅延時間の計算方法] + Long delay = System.currentTimeMillis() - time; + \end{lstlisting} +\end{table} + + \section{結果} +バイナリツリーで木を構成した場合、 Node 数が17台だと深さが4となる。 +各木構造の階層毎に、画像データの伝搬にかかった時間を測定した。 +図\ref{fig:depth}は遅延の分布を示した散布図である。 +X軸はメッセージ伝達にかかった秒数(ms)、 Y軸は画像データのサイズ(Byte)である。 + +画像データの伝達はほぼ1秒以内に収まっているが、容量が小さい場合でも時間がかかる場合がある。 +それはその送信の前に大容量の画像を送信した後の回線のDelayが残っているためだと考えられる。 + +また、深さ3で極端に遅い場合がある。 遅い原因として、1つの Node がボトルネックになっていることが判明している。 +このような極端に遅い Node をそのまま木に配置した場合、その Node の子 Node 以下に影響を及ぼす場合がある。 +そのため、遅い Nodeを検出して、木の最後尾に移動させる機能が必要である。 + +今回4段分のデータでは30名程度の遅延のみしか判断することができないため、更に大人数での実験を繰り返し行う必要がある。 + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=60mm]{./pic/depth1.eps} + \end{center} + \begin{center} + \includegraphics[width=60mm]{./pic/depth2.eps} + \end{center} + \begin{center} + \includegraphics[width=60mm]{./pic/depth3.eps} + \end{center} + \begin{center} + \includegraphics[width=60mm]{./pic/depth4.eps} + \end{center} + \caption{深さ毎のデータサイズと遅延の関係(上から深さ1, 2, 3, 4)} + \label{fig:depth} +\end{figure} % 今後の課題 \chapter{まとめ} @@ -265,14 +414,14 @@ \def\line{−\hspace*{-.7zw}−} \begin{thebibliography}{99} -%\bibitem{*}内の * は各自わかりやすい名前などをつけて、 -%論文中には \cite{*} のように使用する。 -%これをベースに書き換えた方が楽かも。 -%書籍、論文、URLによって若干書き方が異なる。 -%URLを載せる人は参考にした年月日を最後に記入すること。 + %\bibitem{*}内の * は各自わかりやすい名前などをつけて、 + %論文中には \cite{*} のように使用する。 + %これをベースに書き換えた方が楽かも。 + %書籍、論文、URLによって若干書き方が異なる。 + %URLを載せる人は参考にした年月日を最後に記入すること。 -\bibitem{hoge} -hoge + \bibitem{hoge} + hoge \end{thebibliography} % 謝辞 @@ -296,7 +445,7 @@ 最後に、有意義な時間を共に過ごした情報工学科の学友、並びに物心両面で支えてくれた両親に深く感謝致します。 \begin{flushright} - 2010年 3月 \\ hoge + 2010年 3月 \\ hoge \end{flushright} % 付録