# HG changeset patch # User oc # Date 1424114246 -32400 # Node ID 42b6994eac8044d70996004458190f3499f3aefb # Parent f6b14e3b72e04cc720a848a30b4cf20724d7487a update chapter2 diff -r f6b14e3b72e0 -r 42b6994eac80 chapter2.tex --- a/chapter2.tex Mon Feb 16 18:22:56 2015 +0900 +++ b/chapter2.tex Tue Feb 17 04:17:26 2015 +0900 @@ -33,9 +33,8 @@ そのために、 TreeVNC はサーバへ接続しに来たクライアントをバイナリツリー状に接続する(図\ref{fig:tree})。 バイナリツリーなら、各nodeに最大2台分のクライアントしか接続されない。 $N$台のクライアントが接続しに来た場合、画面配信の画像データをコピーする回数は、 -従来のVNCでは$N$回、TreeVNCでは$log N * 2$回となる。 -TreeVNCは、rootへの負荷を各nodeに分散することにより、 -処理性能が向上している。 +従来の VNC ではサーバ側で$N$回する必要があるが、TreeVNCでは各 node が2回ずつコピーするだけで済む。 +TreeVNC は、root への負荷を各 node に分散することにより、処理性能が向上している。 \begin{figure}[htpd] \begin{center} @@ -46,22 +45,50 @@ \end{figure} +\section{Multicast や Broadcast を用いたVNC} + +Multicast とは、 +同一ネットワーク内でマルチキャストアドレスを持っている端末に対してデータを送信することである。 +Broadcast とは、 +同一ネットワーク上の全ての端末に対してデータを送信することである。 +どちらの通信方法も、root からのデータ送信は1回でよく、 +1度送信するとデータの複製はルータが行う。 + +VNC を Multicast や Broadcast の通信方法を用いて実装すると、 +画像データの送信が1度で済み、負荷分散のために木構造を形成する必要もなくなる。 + +しかし、これらの通信方法でのパケットの扱いには +\begin{itemize} + \item 送信可能なパケットのブロックサイズが 64000byte までであると決まっている + \item パケットが途中で消失してしまっても特定することができない +\end{itemize} +といった性質がある。 + +\newpage + +VNC でこれらの通信方法を用いて実装する場合、 +パケットの扱いの性質を乗り越えなければならない。 + +送信可能なパケットのサイズが決まっているので、 +画面データは 64000byte 以下に分割し送信しなければならない。 +しかし、現在の TreeVNC で用いている方法では、 +データ分割の処理には時間がかかってしまう。 + +パケットの消失を検知するためには、 +各パケットに対してシリアル番号を振り分ける。 +パケットを受信した node 側で、 +シリアル番号が連番で届いているのかどうかを調べれば検知することが可能である。 +もし届いていなかった場合は、root に対して再送要求を送信すれば良い。 +しかし、Multicast や Broadcast 通信ではパケットロス率が高かった。 + +これらの通信方法を用いての VNC の実装にはもう少し工夫が必要である。 + + + \section{node 間で行われるメッセージ通信} RFBプロトコルで提供されているメッセージに加え、 TreeVNC 独自のメッセージを使用している。 TreeVNC で使用されるメッセージの一覧を表\ref{tb:message}に示す。 -図\ref{fig:message}は、 -TreeVNC で node が root に接続し、画像データを受信するまでのメッセージ通信の様子である。 -node は Multicast 通信で root に対して FIND\_ROOT を送信する(図\ref{fig:message}中, 1:)。 -同じネットワークインタフェースにいる root が受信し、FIND\_ROOT\_REPLY を送信する(図\ref{fig:message}中, 2:)。 -それを受け取ると node は root に対して接続先を要求する WHERE\_TO\_CONNECT を送信する(図\ref{fig:message}中, 3:)。 -root は、node の接続先を CONNECT\_TO で送信する(図\ref{fig:message}中, 4:)。 -root・ node 間の接続が確立後は、 -root から定期的に画像データ FRAME\_BUFFER\_UPDATE が送信される(図\ref{fig:message}中, 4:)。 - - -\newpage - \begin{table*}[htb] \scriptsize @@ -97,28 +124,71 @@ \label{tb:message} \end{table*} -\begin{figure}[!htbp] -\begin{center} -\includegraphics[width=67mm]{./images/chapter2/message.pdf} -\end{center} -\caption{node 間で行われるメッセージ通信} -\label{fig:message} -\end{figure} + +図\ref{fig:message}は、 +TreeVNC で node が root に接続し、画像データを受信するまでのメッセージ通信の様子である。 + \newpage -\section{配信画面切り替え} -TreeVNC は、配信者の切り替えの度に生じる煩わしさを解決している。 -配信者となるクライアント側で share button を押すと、配信者を切り替えることができる。 +\begin{figure}[htbp] + \begin{center} + \begin{tabular}{c} + + \begin{minipage}{0.5\hsize} + \begin{center} + \includegraphics[width=67mm]{./images/chapter2/message.pdf} + \end{center} + \caption{node 間で行われるメッセージ通信} + \label{fig:message} + \end{minipage} + + \begin{minipage}{0.5\hsize} + \begin{itemize} + \item nodeはMulticast通信でrootに対してFIND\_ROOTを送信する(1:findRoot()) + \item rootが受信し、FIND\_ROOT\_REPLYを送信する(2:findRootReplay()) + \item node側でどのrootに接続するか選択するパネルが表示される + \item nodeはパネルでrootを選択し、接続先を要求するWHERE\_TO\_CONNECTを送信する(3:whereToConnect()) + \item 受信したrootはnodeの接続先をCONNECT\_TOで送信する(4:connectTo) + \item nodeはrootの指定した接続先に接続する + \item root・node間の接続が確立後、rootからnodeに対して定期的に画像データFRAME\_BUFFER\_UPDATEを送信する(4:framebufferUpdate()) + \end{itemize} + \end{minipage} + + \end{tabular} + \end{center} +\end{figure} -root は配信者の VNCServer と通信を行っており、 + + +\section{配信画面切り替え} +ゼミ等では参加者が順々に発表を行う度に、画面の切り替えが必要となる。 +ゼミを円滑に進めるために、この画面の切り替えをスムーズに行う必要がある。 + +プロジェクタを使用する場合、ケーブルの抜き差しを行わないとならない。 +その際に、ディスプレイの解像度の設定をし直す、 +接続不良が起こる等の煩わしい問題が生じることがある。 + +従来のVNCを使用する場合、 +画面の切り替えの度に一旦VNCを終了し、発表者のVNCServerへと再接続を行う必要がある。 + +TreeVNC は、これらの配信者の切り替えの度に生じる問題を解決している。 +TreeVNC を立ち上げることで、ケーブルを使用せずに手元のPCに発表者の画面を表示させることができる。 +画面の切り替えは、ユーザがVNCSeverへの再接続を行うことなく、切り替えた発表者の画面を取得することができる。 + +\newpage + +TreeVNC の root は配信者の VNCServer と通信を行っており、 VNCServer から画面データを受信し、そのデータを node へと送信している。 -share button が押されると、 +画面切り替え用の share button が押されると、 root は share button を押したクライアントの VNCServer と新しく通信をし直す。 +これにより、配信者切り替えのために VNC を終了し、再接続する必要がなくなる。 -これにより、配信者切り替えのために VNC を終了し、再接続する必要がなくなる。 +しかし、配信者が変わることで起きる画面サイズの違いや、 +マルチディスプレイ全体を表示してしまうことがあるので、 +それを解決する必要がある。 \section{MulticastQueue} @@ -126,6 +196,10 @@ TreeVNC は、画像の更新を複数の node に同時に伝えるため、 MulticastQueue という Queue に画像データを格納する。 +各 node は MulticastQueue からデータを取得するスレッドを持つ。 +node それぞれがデータを取得するため、 +MulticastQueue は複数のスレッドから使用される。 + MulticastQueue は、CountDownLatch を用いている。 java.util.concurrent.CountDownLatch とは、 java の並列用に用意された API で、他のスレッドで実行中の操作が完了するまで、 @@ -139,6 +213,13 @@ 子 node が画像データを pull すると、そのカウントが減る。 全ての子 node が画像データを pull するとカウントが 0 になり、画像データが消される。 +node が MulticastQueue からデータを取得せずに、 +Queue にデータが溜まり続け、メモリのオーバーフローが起こる場合がある。 +この問題を避けるために、Timeout用のスレッドを用意している。 +ある一定時間データが取得されなければ、Timeout を検知し、 +取得されなかったデータが全てpollされるという仕組みである。 + + diff -r f6b14e3b72e0 -r 42b6994eac80 images/chapter2/message.pdf Binary file images/chapter2/message.pdf has changed diff -r f6b14e3b72e0 -r 42b6994eac80 thesis-paper.pdf Binary file thesis-paper.pdf has changed