view paper/prosym.tex @ 2:d964ad17d606

Add oc-thesis
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Tue, 10 Nov 2015 02:10:48 +0900
parents 10e5ea7ae31e
children 74034b769a12
line wrap: on
line source

% withpage: ページ番号をつける (著者確認用)
\documentclass{ipsjprosym}
\usepackage{listings, jlisting}
\usepackage[dvipdfmx]{graphicx}
\usepackage{latexsym}

\lstset{
 language={Java},
  tabsize=2,
  frame=single,
  basicstyle={\ttfamily\footnotesize},%
  identifierstyle={\footnotesize},%
  commentstyle={\footnotesize\itshape},%
  keywordstyle={\footnotesize\bfseries},%
  ndkeywordstyle={\footnotesize},%
  stringstyle={\footnotesize\ttfamily},
  breaklines=true,
  captionpos=b,
  columns=[l]{fullflexible},%
  xrightmargin=0zw,%
  xleftmargin=1zw,%
  aboveskip=1zw,
  numberstyle={\scriptsize},%
  stepnumber=1,
  numbersep=1zw,%
  lineskip=-0.5ex%
}

\input{dummy.tex} %% Font 

\begin{document}

% ユーザー定義したマクロなど
\makeatletter
\let\@ARRAY\@array \def\@array{\def\<{\inhibitglue}\@ARRAY}
\def\<{\(\langle\)} 
\def\>{\(\rangle\)} 
%\def\|{\verb|} 
\def\Underline{\setbox0\hbox\bgroup\let\\\endUnderline} 
\def\endUnderline{\vphantom{y}\egroup\smash{\underline{\box0}}\\} 
\def\LATEX{\iLATEX\Large} 
\def\LATEx{\iLATEX\normalsize} 
\def\LATex{\iLATEX\small} 
\def\iLATEX#1{L\kern-.36em\raise.3ex\hbox{#1\bf A}\kern-.15em 
\   T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX} 
\def\LATEXe{\ifx\LaTeXe\undefined \LaTeX 2e\else\LaTeXe\fi} 
\def\LATExe{\ifx\LaTeXe\undefined \iLATEX\scriptsize 2e\else\LaTeXe\fi} 
\def\Quote{\list{}{}\item[]} 
\let\endQuote\endlist
\def\TT{\if@LaTeX@e\tt\fi}
\def\CS#1{\if@LaTeX@e\tt\expandafter\string\csname#1\endcsname\else
    $\backslash$#1\fi}

% Title, Author %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title{有線上のPC画面配信システムTreeVNCの改良}

\affiliate{IE}{琉球大学工学部情報工学科}

\author{伊波 立樹}{Tatsuki IHA}{IE}
\author{河野 真治}{Shinji KONO}{IE}

\begin{abstract}
    ゼミや授業等で、それぞれがPC端末を持っている場合では、PCの機能を活かしたコミュニケーションが可能である。教員が操作する画面をそのまま学生に配信したり, ゼミなどで、発表する学生の画面を切り替えたりすることを可能にしたい。
    TreeVNCは参加したクライアントをバイナリツリー状に接続し、配信コストを分散させる仕組みを取っている。そのため,多人数が参加しても処理性能が下がらない。また、ツリーのRootが見ているVNCサーバーを変更することで、ケーブルの差し替えなしに画面の切替が可能となる。
    今研究ではTreeVNCの改良として、WANへの対応、 マルチディスプレイへの対応を行う。
\end{abstract}

\begin{jkeyword}
\end{jkeyword}

\maketitle

% Body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{研究背景と目的}
ゼミや授業等で、それぞれがPC端末を持っている場合では、
PCの機能を活かしたコミュニケーションが可能である。
教員が操作する画面をそのまま学生に配信したり、
ゼミなどで、発表する学生の画面を切り替えたりすることを可能にしたい。

TreeVNC画面配信システムは、
参加したクライアントをバイナリツリー状に接続し、
配信コストをクライアントにバランスさせる仕組みになっている。
なので、多人数が参加しても処理性能が下がらない。
また、RFBプロトコルを用いているので、ケーブルの差し替えなしに
共有している画面の切り替えが可能になっている。

今研究では、TreeVNCのリファクタリングをすると共に、
port番号の割り当てや、プロトコルの見直しを行った。
これにより、
マルチディスプレイへの対応や、
TreeVNCを遠隔地から利用することを可能にした。
また、マルチスクリーンを使用する際のスクリーンの選択や
サイズの自動変更の問題を解決した。
また、複数のネットワークインターフェスに対応し、
ルータ越えを可能にすることができた。

\section{画面配信システムTreeVNC}
\subsection*{[RFBプロトコル]}
RFB(remote frame buffer)プロトコル\cite{rfbProtocol}とは、自身の画面を送信し、ネットワーク越しに他者の画面に表示するプロトコルである。
ユーザが居る側をRFBクライアント側と呼び、Framebufferへの更新が行われる側はRFBサーバと呼ぶ。
Framebufferとは、メモリ上に置かれた画像データのことである。
RFBプロトコルでは、最初にプロトコルバージョンの確認や認証が行われる。
その後、クライアントに向けてFramebufferの大きさやデスクトップに付けられた名前などが含まれている初期メッセージが送信される。
RFBサーバ側はFramebufferの更新が行われるたびに、RFBクライアントに対してFramebufferの変更部分だけを送信する。
更にRFBクライアントのFramebufferUpdateRequestが来るとそれに答え返信する。
RFBプロトコルは、描画データに使われるエンコードが多数用意されており、また独自のエンコードを実装することもできるプロトコルである。

\subsection*{[TightVNC]}
TightVNC(Tight Virtual Network Computing)\cite{tightvnc}はJavaを用いて作成されたRFBプロトコルのクライアントである。
本研究で作成したTreeVNCはTightVNCを元に作成されている。

\subsection*{[多人数で VNC を使用する時の問題点]}
多人数で従来の VNC を使用する際、1つのコンピュータに多人数が同時につながり、
処理が集中してしまい、性能が大幅に落ちてしまうという問題が生じる。

ゼミ等の画面配信者が頻繁に切り替わる場合、
配信者が替わる度にアプリケーションを終了し、接続をし直さないといけないという問題がある。

\subsection*{[TreeVNC の構造]}
多人数で VNC を用いるために、クライアントの接続がサーバに一極集中してしまう問題を解決する。
そのために、 TreeVNC はサーバへ接続しに来たクライアントをバイナリツリー状に接続する(図\ref{fig:tree})。
バイナリツリーなら、各nodeに最大2台分のクライアントしか接続されない。
$N$台のクライアントが接続しに来た場合、画面配信の画像データをコピーする回数は、
従来の VNC ではサーバ側で$N$回する必要があるが、TreeVNCでは各 node が2回ずつコピーするだけで済む。
TreeVNC は、root への負荷を各 node に分散することにより、処理性能が向上している。

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/TreeVNC.pdf}
    \end{center}
    \caption{構成される木構造}
    \label{fig:tree}
\end{figure}

\subsection*{[Multicast や Broadcast を用いたVNC]}
Multicast とは、
同一ネットワーク内でマルチキャストアドレスを持っている端末に対してデータを送信することである。
Broadcast とは、
同一ネットワーク上の全ての端末に対してデータを送信することである。
どちらの通信方法も、root からのデータ送信は1回でよく、
1度データの送信を行うとデータの複製はルータが行う。

VNC を Multicast や Broadcast の通信方法を用いて実装すると、
画像データの送信が1度で済むため、負荷分散のために木構造を形成する必要もなくなる。

しかし、これらの通信方法でのパケットの扱いには
\begin{itemize}
    \item 送信可能なパケットのブロックサイズが 64000byte までであると決まっている
    \item パケットが途中で消失してしまっても特定することができない
\end{itemize}
といった性質がある。


VNC でこれらの通信方法を用いて実装する場合、
パケットの扱いの性質を乗り越えなければならない。

送信可能なパケットのサイズが決まっているので、
画面データは 64000byte 以下に分割し送信しなければならない。
しかし、現在の TreeVNC で用いている方法では、
データ分割の処理には時間がかかってしまう。

パケットの消失を検知するために、
各パケットに対してシリアル番号を振り分ける。
パケットを受信した node 側で、
シリアル番号が連番で届いているのかどうかを調べれば、消失を検知することが可能である。
もしパケットが届いていなかった場合は、root に対して再送要求を送信すれば良い。
しかし、Multicast や Broadcast 通信ではパケットロス率が高かった。

これらの通信方法を用いての VNC の実装にはもう更なる工夫が必要である。



\subsection*{[node 間で行われるメッセージ通信]}

RFBプロトコルで提供されているメッセージに加え、 TreeVNC 独自のメッセージを使用している。
%TreeVNC で使用されるメッセージの一覧を表\ref{tb:message}に示す。
%
%
%\begin{table*}[htb]
%  \scriptsize
%  \begin{tabular}{|l|l|l|} \hline
%    通信経路            & message                    & 説明 \\ \hline \hline
%                        & FIND\_ROOT                 & TreeVNC接続時にrootを探す。 \\ \cline{2-3}
%    send direct message & WHERE\_TO\_CONNECT         & 接続先をrootに聞く。 \\ \cline{2-3}
%    (child to root)     & LOST\_CHILD                & 子nodeの切断をrootに知らせる。 \\ \hline \hline
%
%                        & FIND\_ROOT\_REPLY          & FIND\_ROOTへの返信。 \\ \cline{2-3}
%    send direct message & CONNECT\_TO\_AS\_LEADER    & 左子nodeとして接続する。接続先のnodeが含まれている。 \\ \cline{2-3}
%    (root to child)     & CONNECT                    & 右子nodeとして接続する。接続先のnodeが含まれている。 \\ \hline \hline
%
%    message down tree   & FRAMEBUFFER\_UPDATE        & 画像データ。EncodingTypeを持っている。\\ \cline{2-3}
%    (root to child)     & CHECK\_DELAY               & 通信の遅延を測定する。 \\ \hline \hline
%
%    message up tree     & CHECK\_DELAY\_REPLY        & CHECK\_DELAYへの返信。 \\ \cline{2-3}
%    (child 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        & 画像データ。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}
%  \caption{通信経路とmessage一覧}
%  \label{tb:message}
%\end{table*}


図\ref{fig:message}は、
TreeVNC で node が root に接続し、画像データを受信するまでのメッセージ通信の様子である。

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/message.pdf}
    \end{center}
    \caption{node 間で行われるメッセージ通信}
    \label{fig:message}
\end{figure}

\begin{itemize}
    \item nodeはMulticast通信でrootに対してFIND\_ROOTを送信する(1:findRoot())
    \item rootがFIND\_ROOTを受信し、FIND\_ROOT\_REPLYを送信する(2:findRootReplay())
    \item node側で、どのrootに接続するかを選択するパネルが表示される
    \item nodeはパネルで接続するrootを選択し、rootに対して接続先を要求するWHERE\_TO\_CONNECTを送信する(3:whereToConnect())
    \item 受信したrootはnodeの接続先をCONNECT\_TOで送信する(4:connectTo)
    \item nodeはrootの指定した接続先に接続しに行く
    \item root・node間の接続が確立後、rootからnodeに対して定期的に画像データFRAME\_BUFFER\_UPDATEを送信する(5:framebufferUpdate())
\end{itemize}



\subsection*{[配信画面切り替え]}

ゼミでは発表者が順々に入れ替わる。発表者が入れ替わる度に共有する画面の切り替えが必要となる。
ゼミを円滑に進めるために、画面の切り替えをスムーズに行いたい。

画面の共有にプロジェクタを使用する場合、
発表者が変わる度にケーブルの抜き差しを行わないとならない。
その際に、ディスプレイ解像度を設定し直す必要が出たり、
接続不良が起こる等の煩わしい問題が生じることがある。

従来のVNCを使用する場合、
画面の切り替えの度に一旦VNCを終了し、発表者のVNCServerへと再接続を行う必要がある。

TreeVNC は、配信者の切り替えの度に生じる問題を解決している。
TreeVNC を立ち上げることで、ケーブルを使用する必要なしに、
各参加者の手元のPCに発表者の画面を共有することができる。
画面の切り替えは、ユーザがVNCSeverへの再接続を行うことなく、
share button を押すことによって、配信者の切り替えを行うことができる。

TreeVNC の root は配信者の VNCServer と通信を行っている。
VNCServer から画面データを受信し、そのデータを node へと送信している。
配信者切り替え時に share button が押されると、
root は share button を押したクライアントの VNCServer と通信を始める。
TreeVNCは、配信者切り替えの度に VNC を終了し、再接続する必要がない。

しかし、配信者と受信者の画面サイズの違いや、
マルチディスプレイ全体を共有してしまう問題があるので、
それらを解決する必要がある。


\subsection*{[MulticastQueue]}

配信側の画面が更新されると、 VNCServer から画像データが FRAME\_BUFFER\_UPDATE messageとして送られてくる。
TreeVNC は、画像の更新を複数の node に同時に伝えるため、
MulticastQueue という Queue に画像データを格納する。

各 node は MulticastQueue からデータを取得するスレッドを持つ。
MulticastQueue は複数のスレッドから使用される。

MulticastQueue は、
java.util.concurrent.CountDownLatch を用いて実装されている。
CountDownLatch とは、
java の並列用に用意された API で、他のスレッドで実行中の操作が完了するまで、
複数のスレッドを待機させることのできるクラスである。
スレッドを解放するカウントを設定することができ、
カウントが 0 になるまで await メソッドでスレッドをブロックすることができる。

TreeVNC では、それぞれの画像データにカウントが追加され、
カウントが 0 になると、その画像データは消される。
親 node がMulticastQueueを持っており、
接続されている子 node の数だけ画像データにカウントを設定する。
子 node が画像データを取得すると、そのカウントが減る。
接続している全ての子 node が画像データを取得するとカウントが 0 になり、
MulticastQueueから画像データが消される。

親node は、接続している全ての子nodeが画像データを取得するまで
MulticastQueueの中に持っている画像データを削除することができない。
node が MulticastQueue からデータを取得せずに、
Queue にデータが溜まり続けると、Memory Over Flowを起こしてしまう。
この問題を避けるために、Timeout用のスレッドを用意している。
Timeout スレッドは、ある一定時間取得されない画像データがある場合、
そのデータを node の代わりにpollするという仕組みである。
Timeout スレッドにより、Memory Over Flowを防ぐことができる。

\section{QUALITYモードとSPEEDモード}
高解像度のまま拡大・縮小の処理を行うと、
PC のスペックによっては描画処理に時間がかかってしまうことがある。
配信者の画面をリアルタイムに取得するため、
描画処理に時間のかからないモードを追加する。

画像描画処理には、
高画質優先の QUALITY モードと描画速度優先の SPEED モードがある。
今まで TreeVNC は QUALITY モードで使用していた。

今回、どちらのモードを使用するかをビューワから変更出来るようにした。
これにより、描画処理の遅延を解決することができた。

\section{表示画面サイズ調整機能}

配信側PCによって、配信される画面サイズが変わる。
配信側とクライアントで画面サイズに差がある場合、
画面に入りきらない、或いは表示画面が小さすぎる等の問題が生じる。

ユーザ毎に適切な画面サイズがあり、
簡単に表示画面を適切な大きさに変更できるようにしたい。

今回、ビューワに HD ボタンと fit screen ボタンを追加した。
HD ボタンは、画面サイズを 1920x1080 サイズに拡大・縮小し、
fit screen ボタンは、クライアントの画面サイズに合わせてフルサイズで拡大・縮小する。

更に、rootとして起動し、viewer も表示される -d オプションを使用した場合は、
表示される画面を常に画面にフィットする様にした。

\section{マルチディスプレイ対応}

画面配信側のPCがマルチディスプレイの場合、
VNCServer からは複数の画面全体の画像データが送信され、
図\ref{fig:multidisplay}の様に画面が配信される。

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/multidisplay.pdf}
    \end{center}
    \caption{マルチディスプレイの描画}
    \label{fig:multidisplay}
\end{figure}

授業やゼミ等でTreeVNCを使用する場合、複数画面の表示は必要ない。

そこで、一画面のみをフィルタリングし表示するためのオプション機能(${\mathchar`-}$${\mathchar`-}$filterSingleDisplay)を追加した。
オプションを追加した起動方法をソースコード\ref{filtersingledisplay}に記述する。

root はVNCServerから送られてくる全画面データから一画面のみをフィルタリングする必要がある。
シングルディスプレイサイズは、個々のクライアントでしか取得できない。
なので、配信側は画面の切り替えを行う際に、シングルディスプレイサイズを取得し、
root へ送信する画面切り替えを要求する SERVER\_CHANGE\_REQUEST message に
シングルディスプレイサイズを付加する様にした。

root はメッセージを受け取り initData を変更する。
initData は、RFB プロトコルで行われる通信中に VNCServer が送信するServerInit message から生成される。
画像データが送られてくる前の段階で、これから送信されるデータの情報を取得し、描画の準備をする。
ServerInit messageに含まれているデータは、
配信先の画面サイズ、pixel format、配信先のPCの名前である。

マルチディスプレイの場合、VNCServerは数画面全体のサイズを送信する。
そのまま initData を使用すると複数画面全体を描画することになる。
それを避けるため、initData をシングルディスプレイサイズ用の originalInitData に生成し直す。
図\ref{fig:initdata}の様に、root は接続されている node へ originalInitData を送信する。

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/sendInitData.pdf}
    \end{center}
    \caption{シングルディスプレイサイズ用の initData}
    \label{fig:initdata}
\end{figure}

これにより、一画面のみの表示が可能となる。


\section{無線LANへの対応}
授業でTreeVNCを使用する場合、
有線を使用するか否かは学生によって違う。
TreeVNCを有線・無線の両方からの接続に対応したい。

従来の TreeVNC は、クライアントの接続する木構造が単一であった。
そのため、単一のネットワークインターフェースでしか使用することができなかった。

この問題を解決するために、
図\ref{fig:multinetworktree}の様に、ネットワークインターフェース別に
木構造を形成するように設計した。

\begin{figure}[h]
  \begin{center}
    \includegraphics[width=70mm]{./pic/MultiNetworkTree.pdf}
  \end{center}
  \caption{Multi Network Tree}
  \label{fig:multinetworktree}
\end{figure}

TreeVNC は、root が TreeManager というオブジェクトを持っている。
TreeManager は TreeVNC の接続部分を管理している。
TreeManager では木構造を管理する nodeList が生成される。
この nodeList を元に、新しい node の接続や、node の切断検出時の接続の切り替え等を行う。

root の保持しているネットワークインタフェース毎に
TreeManager を生成する様に変更した。
ソースコード\ref{createtreemanager}に、nodeList を生成する部分を示す。

\newpage

\lstinputlisting[breaklines=true,caption=TreeManager の生成,label=createtreemanager]{source/GetNetworkInterfaces.java}

\begin{itemize}
  \item for 文を使用し root が所持しているネットワークインタフェースを取得する(2行目)
  \item その中から、起動しており Multicast に対応しており、また、ループバックインタフェースでないネットワークインタフェースを取得する(4行目)
  \item 取得してきたネットワークインタフェースの、ネットマスク、ホストネームを取得する(6,7行目)
  \item TreeManager を生成する(8行目)
  \item TreeManager にネットマスクとネットアドレスを追加する(14行目)
  \item HashMap である interfaces に ネットワークインタフェースと対応する TreeManager を追加する(15行目)
\end{itemize}

新しい node が接続してきた際、
interfaces から node のネットワークインタフェースと一致する TreeManager を取得する。
その TreeManager に、node 接続の処理を任せる。

こうすることによって、TreeVNC を複数のネットワークインターフェース別に
木構造を構成することができる。

\section{WANへの対応}
遠隔地からでもゼミや授業に参加できるよう、
異なるネットワークインタフェースから TreeVNC への接続を可能にした。

遠隔地からの接続を実現した TreeVNC を図\ref{fig:remotetreevnc}に示す。
図\ref{fig:remotetreevnc}では、
ネットワーク A で立ち上げた TreeVNC に対し、
遠隔地のネットワーク B, C, D から接続している状態である。
図の様に、各ネットワーク毎に TreeManager を持つ root node が存在する。
TreeManager を持つ node は、そのネットワーク上での接続の木構造を管理する root となる。
遠隔地ネットワークから直接 TreeVNC に接続した node は root となる。

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/remoteTreeVnc.pdf}
    \end{center}
    \caption{Remote Network Tree}
    \label{fig:remotetreevnc}
\end{figure}



以下に、遠隔地からの接続の手順を記述する。

\begin{itemize}
    \item 遠隔地 node から接続したい root に対して接続を要求する WHERE\_TO\_CONNECT message を送信する(図\ref{fig:remotevncconnect}中, 1:)
    \item root は、遠隔地 node に対して接続先を含む CONNECT\_TO message を送信する(図\ref{fig:remotevncconnect}中, 2:)
    \item 遠隔地 node は指定された接続先に対して接続しに行く(図\ref{fig:remotevncconnect}中, 3:)
\end{itemize}

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/remoteVncConnect.pdf}
    \end{center}
    \caption{遠隔地 node からの接続}
    \label{fig:remotevncconnect}
\end{figure}

ネットワーク毎に TreeVNC の木構造は管理される。
図\ref{fig:remotenetworktree1}の TreeVNC の木構造はバイナリツリーを形成している。
しかし、遠隔地 node が接続している node には合計3つ node が接続している。
遠隔地 node は、root の管理する nodeList に追加されない。
これは、node の接続・切断・切り替えに遠隔地 node を関与させないためである。

ネットワーク毎に root が存在する。
root は同じネットワーク上の新しい node からの
接続を受け付ける(図\ref{fig:remotenetworktree1}中, 1,2,1',2':)。

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/remotenetwork.pdf}
    \end{center}
    \caption{Remote Network Tree}
    \label{fig:remotenetworktree1}
\end{figure}


遠隔地 node からでも、画面を配信できるようにする。
遠隔地 node から画面配信を行う場合の画面の切り替えを図\ref{fig:remotenetworktree2}、図\ref{fig:remotenetworktree5}に示す。
以下に、画面切り替えの説明を記述する。

\begin{itemize}
    \item 遠隔地 node が親 node へと SERVER\_CHANGE\_REQUEST を送信する(図\ref{fig:remotenetworktree2}中, 1:)
    \item SERVER\_CHANGE\_REQUEST には、id が付いており、遠隔地 node からであれば -1 が付加されている
    \item SERVER\_CHANGE\_REQUEST は root へと送信される(図\ref{fig:remotenetworktree2}中, 2:)
    \item root は SERVER\_CHANGE\_REQUEST の id を確認し、id = -1 の場合、遠隔地 root に対して WHERE\_TO\_CONNECT を送信する(図\ref{fig:remotenetworktree2}中, 3:)
    \item 遠隔地 root は WHERE\_TO\_CONNECT の返信として、接続先を含む CONNECT\_TO を送信する(図\ref{fig:remotenetworktree5}中, 4:)
    \item root は指定された接続先へと接続しに行く(図\ref{fig:remotenetworktree5}中, 5:)
\end{itemize}

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/remotenetwork2.pdf}
    \end{center}
    \caption{Remote Network Tree}
    \label{fig:remotenetworktree2}
\end{figure}

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/remotenetwork5.pdf}
    \end{center}
    \caption{Remote Network Tree}
    \label{fig:remotenetworktree5}
\end{figure}

\section{評価}

\subsection*{[木の深さによるメッセージ伝達の遅延]}
VNCServer から受信する画像データ、
TreeVNC で扱われるメッセージ通信は構成された木を伝って伝達される。
接続する人数が増える毎に木の段数は増えていく。
そこで root から木の末端の node まで、
メッセージが遅延することなく伝達できているかを検証する実験を行った。


\subsection*{[実験環境]}
授業を受講している学生が TreeVNC を使用した状態で実験を行った。
TreeVNC には最大で34名が接続していた。

\subsection*{[メッセージを使用した実測]}
TreeVNC を伝搬するメッセージに、CHECK\_DELAY・CHECK\_DELAY\_REPLY を追加した。
CHECK\_DELAY は root から node の末端まで伝達するメッセージ(図\ref{fig:checkdelay}, 左)、
CHECK\_DELAY\_REPLY は各 node から root まで伝達するメッセージ(図\ref{fig:checkdelay}, 右)である。

% heart beat 代わりにも使える等の違ったメリットも書く?
% デバッグに使用できたとかって

\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/checkDelay.pdf}
    \end{center}
    \caption{CHECH\_DELAY, CHECK\_DELAY\_REPLY}
    \label{fig:checkdelay}
\end{figure}

CHECK\_DELAY message は、送信時刻を付けて送信する。
root から CHECK\_DELAY 送信し、
末端 node まで各 node を伝いながら伝達して行く。

CHECK\_DELAY\_REPLY には、CHECK\_DELAY から受け取った送信時刻をそのまま付つけて送信する。
CHECK\_DELAY を受け取った各 node は、
CHECK\_DELAY\_REPLY を接続している親 node に送信する。

CHECK\_DELAY\_REPLY を受け取った root は、
メッセージの伝達にどれだけの時間がかかったかを計算する。

計算方法を以下のソースコード\ref{calc}に記述する。
各 node にデータを下ろす際も、root にデータが上る際も、
木を伝い受け渡されている。
なので、データが root から末端 node に伝わる時間は、
CHECK\_DELAY を送信した時間と、
CHECK\_DELAY\_REPLY を受信した時間の半分であるといえる。

% あとでコメントアウトはずす
\begin{lstlisting}[caption=遅延時間の計算方法,label=calc]
Long delay = System.currentTimeMillis() - time;
double halfDelay = (double) delay / 2;
\end{lstlisting}


\subsection*{[depth毎の遅延結果]}
バイナリツリーで木を構成した場合、
node 数が34台だと深さが5となる。
各木構造の階層毎に、メッセージの伝搬にかかった時間を測定した。

図\ref{fig:test}は遅延の分布を示したヒストグラムである。
X軸はメッセージ伝達にかかった秒数(ms)、
Y軸は CHECK\_DELAY\_REPLY を送信した node の割合を表している。

ほとんどのメッセージの伝達は 0.0 〜 4.0 ミリ秒内に収まっている。
木の段数毎に、メッセージ伝達速度の差が生じている。
深い段数の node ほど、メッセージ伝達速度が落ちている。


\begin{figure}[h]
    \begin{center}
        \includegraphics[width=70mm]{./pic/test.pdf}
    \end{center}
    \caption{step1}
    \label{fig:test}
\end{figure}

\section{まとめ}

\begin{acknowledgment}
    謝辞が必要であれば,ここに書く.
\end{acknowledgment}

% BibTeX を使用する場合 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \bibliographystyle{ipsjsort}
% \bibliography{ref}

% BibTeX を使用しない場合
\begin{thebibliography}{9}
    \bibitem{latex} 奥村晴彦, 黒木裕介: \textbf{LaTeX2e美文書作成入門}. 技術評論社, 2013.
\end{thebibliography}

\end{document}