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}
 
 % 付録