Mercurial > hg > Papers > 2015 > parusu-prosym
changeset 14:d9ab81f7ca04
Add lost child section
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 30 Nov 2015 15:16:03 +0900 |
parents | 956ebac058fb |
children | 956d526ec6e5 |
files | paper/prosym.pdf paper/prosym.tex |
diffstat | 2 files changed, 101 insertions(+), 59 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/prosym.tex Mon Nov 30 02:33:06 2015 +0900 +++ b/paper/prosym.tex Mon Nov 30 15:16:03 2015 +0900 @@ -74,8 +74,7 @@ 授業やゼミ等で、それぞれがPC端末を持っている場合では、 PCの機能を活かしたコミュニケーションが可能である。 -通常の授業では先生の用意した資料、 PC画面を見ながら授業が進むことが多い。 - +通常の授業では先生の用意した資料、 PC画面を見ながら授業が進むことが多い。 ゼミでは発表者を切り替えながら発表を行う。 通常これらの画面を表示するためにプロジェクタが使用されている。 @@ -127,8 +126,9 @@ また、サーバへ接続しに来たクライアントをバイナリツリー状に接続する(図\ref{fig:tree})。 バイナリツリー状に接続することで、$N$台のクライアントが接続しに来た場合、画面配信の画像データをコピーする回数は従来の VNC ではサーバ側で$N$回する必要があるが、TreeVNCでは各ノードが2回ずつコピーするだけで済む。 -バイナリツリーのルートのノードを Root Node と呼ぶ。 -Root Node は子ノードにデータを流す機能に加え、各ノードの管理と VNC サーバーから流れてきた画像データの管理を行う。 +バイナリツリーのルートのノードを Root Node と呼び、 Root Node に接続されるノードを Node と呼ぶ +Root Node は子 Nodeにデータを流す機能に加え、各 Node の管理、 VNC サーバーから流れてきた画像データの管理を行う。 +Node は 親 Node から送られたデータを 自分の子 Node に流す機能、 逆に子 Node から送られてきたデータを 親 Node に流す機能がある。 \begin{figure}[ht] \begin{center} @@ -138,51 +138,60 @@ \label{fig:tree} \end{figure} +\subsection{TreeVNC の通信経路} +TreeVNC の通信経路として以下が挙げられる +\begin{itemize} + \item ある Node から Root Node に直接通信を行う send direct message (Node to Root) + \item Root Node からある Node に直接通信を行う send direct message (Root to Node) + \item Root Node から末端の Node までのすべての Nodeに通信を行う messeage down tree (Root to Node) + \item ある Node から木構造を上に辿って Root Nodeまで通信を行う message up tree (Node to Root) + \item Root Node から配信者の VNC サーバーへの通信を行う send message (Root to VNCServer) + \item VNC サーバーから Root Node への通信を行う send message (VNCServer to Root) +\end{itemize} -\subsection{node 間で行われるメッセージ通信} + +\subsection{ノード間で行われるメッセージ通信} RFBプロトコルで提供されているメッセージに加え、 TreeVNC 独自のメッセージを使用している。 TreeVNC で使用されるメッセージの一覧を表\ref{tb:message}に示す。 +\begin{table}[h!] + \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 -\begin{table}[h!] - \caption{通信経路とメッセージ一覧} - \large - \scalebox{0.4} { - \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 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 child) & CONNECT & 右子nodeとして接続する。接続先のnodeが含まれている。 \\ \hline \hline - - message down tree & FRAMEBUFFER\_UPDATE & 画像データ。EncodingTypeを持っている。\\ \cline{2-3} - (root to child) & 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} - (child 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} - } - \label{tb:message} + & 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} - 図\ref{fig:message}は TreeVNC で Node が Root Node に接続し、画像データを受信するまでのメッセージ通信の様子である。 -図 \ref{fig:message}の手順として +図\ref{fig:message}の手順として \begin{itemize} \item 接続を行う Node (以下 Client Node)はMulticast通信で Root Node に対してFIND\_ROOTを送信する(1:findRoot()) @@ -204,8 +213,42 @@ \label{fig:message} \end{figure} +\subsection{切断時の木の再構成} +TreeVNC はバイナリツリーでの接続という特性上 Node が切断されたことを検知できずにいると、Node 同士で構成された木構造が崩れてしまい、新しい Node が接続に来た場合に適切な場所に Node を接続することができなくなってしまう。 +木構造を崩さないよう、Node 同士の接続を再構成を行う必要がある。 -\subsection{配信画面切り替え} +TreeVNC の木構造のネットワークトポロジーは Root Node が持っている nodeList というリストで管理している。 +つまり、Node の接続が切れた場合、木の再構成を行うため Root Node に知らせなければならない。 + +TreeVNC は Lost\_CHILD というメッセージ通信で Node の切断を検知・木の再構成を行っている。 + +TreeVNC は VNCサーバーから送られる画像データ(FRAME\_BUFFER\_Update)を MulticastQueue というキューに蓄積しており、 +Node はこのキューから画像データを取得し、画面を描画している。 +Lost\_Child の検出方法は、この MulticastQueue を使用している。 +ある一定時間 MulticastQueue から画像データが取得されない場合 Memory Over Flow を回避するために Timeout スレッドが用意されている。 +Timeout を検知した際、Node との接続が切れたと判断する。 + +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)) +\end{itemize} + +\begin{figure}[ht] + \begin{center} + \includegraphics[width=70mm]{./pic/lostChild1.pdf} + \end{center} + \caption{lostChild を検知・再接続} + \label{fig:lostchild1} +\end{figure} + +Lost\_Child によって、 切断された全ての Node を検知することができるため、 nodeList の更新が正しく行われる。 +よって、新しく接続に来た Node を適切な場所に接続することが可能となる。 + +\subsection{共有画面切り替え} ゼミでは発表者が順々に入れ替わる。発表者が入れ替わる度に共有する画面の切り替えが必要となる。 ゼミを円滑に進めるために、画面の切り替えをスムーズに行いたい。 @@ -216,12 +259,12 @@ TreeVNC は、配信者の切り替えの度に生じる問題を解決している。 TreeVNC を立ち上げることで、ケーブルを使用する必要なしに、各参加者の手元のPCに発表者の画面を共有することができる。 -画面の切り替えは、ユーザがVNCSeverへの再接続を行うことなく、ビューワの ``Share Screen'' ボタンを押すことによって、配信者の切り替えを行うことができる。 +画面の切り替えは、ユーザがVNCSeverへの再接続を行うことなく、ビューワの Share Screen ボタンを押すことによって、配信者の切り替えを行うことができる。 TreeVNC の Root Node は配信者の VNCServer と通信を行っている。 VNCServer から画面データを受信し、そのデータを 子 Node へと送信している。 -配信者切り替え時に ``Share Screen'' ボタン が押されると、 -Root Node は ``Share Screen'' ボタン を押したクライアントの VNC サーバー と通信を始める。 +配信者切り替え時に Share Screen ボタン が押されると、 +Root Node は Share Screen ボタン を押したクライアントの VNC サーバー と通信を始める。 そのためTreeVNCは配信者切り替えの度に VNC を終了し、再接続する必要がない。 \section{TreeVNCの新機能} @@ -273,23 +316,22 @@ この問題を解決するために、 図\ref{fig:multinetworktree}の様に、ネットワークインターフェース別に 木構造を形成するように設計した。 \begin{figure}[ht] - \begin{center} - \includegraphics[width=70mm]{./pic/MultiNetworkTree.pdf} - \end{center} - \caption{Multi Network Tree} - \label{fig:multinetworktree} + \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 を元に、新しい Client Node の接続や、切断検出時の接続の切り替え等を行う。 +この nodeList を元に、新しい Node の接続や、切断検出時の接続の切り替え等を行う。 Root Node の保持しているネットワークインタフェース毎にTreeManager を生成する様に変更した。 -新しい Client Node が接続してきた際、 interfaces から Client Node のネットワークインタフェースと一致する TreeManager を取得する。 -その TreeManager に、Client Node 接続の処理を任せる。 -こうすることによって、TreeVNC を複数のネットワークインターフェース別に -木構造を構成することができる。 +新しい Node が接続してきた際、 interfaces から Node のネットワークインタフェースと一致する TreeManager を取得する。 +その TreeManager に Node 接続の処理を任せる。 +こうすることによって、TreeVNC を複数のネットワークインターフェース別に木構造を構成することができる。 \subsection{WANへの対応} 遠隔地からでもゼミや授業に参加できるよう、 @@ -299,11 +341,11 @@ 別ネットワークからTreeVNCに参加する際、 直接配信側のネットワークの Root Node に接続を行う。 この接続を Direct Connection と呼ぶ。 -Direct Connection した Client Node はそのネットワークの Root Node になる。 -そのネットワークの他の Client Node はそのネットワークの Root Node に接続し、木構造を生成する。 +Direct Connection した Node はそのネットワークの Root Node になる。 +そのネットワークの他の Node はそのネットワークの Root Node に接続し、木構造を生成する。 配信側の Root Node は Direct Connection で接続された Root Node に対して Framebuffer Update で 画像データを送信する。 -Framebuffer Update が送信された Root Node は そのネットワークの Client Node に対して Framebuffer Update を送信する。 +Framebuffer Update が送信された Root Node は そのネットワークの Node に対して Framebuffer Update を送信する。 これにより、別ネットワークでの画面共有が可能となる。 @@ -327,14 +369,14 @@ \subsection{メッセージを使用した実測} TreeVNC を伝搬するメッセージに、CHECK\_DELAY・CHECK\_DELAY\_REPLY を追加した。 -CHECK\_DELAY は Root Node から 末端の Client Node まで伝達するメッセージと画像データ、 -CHECK\_DELAY\_REPLY は各 Client Node から Root Node まで伝達するメッセージである。 +CHECK\_DELAY は Root Node から 末端の Node まで伝達するメッセージと画像データ、 +CHECK\_DELAY\_REPLY は各 Node から Root Node まで伝達するメッセージである。 CHECK\_DELAY メッセージは送信時刻を付けて送信する。 -Root Nodeから CHECK\_DELAY 送信し、末端の Client Node まで各 Node を伝いながら伝達して行く。 +Root Nodeから CHECK\_DELAY 送信し、末端の Node まで各 Node を伝いながら伝達して行く。 -CHECK\_DELAY\_REPLY には CHECK\_DELAY から受け取った送信時刻に画像データのサイズを付けて送信する。 -CHECK\_DELAY を受け取った各 Client Node は CHECK\_DELAY\_REPLY を接続している親 Node に送信する。 +CHECK\_DELAY\_REPLY は CHECK\_DELAY から受け取った送信時刻に画像データのサイズを付けて送信する。 +CHECK\_DELAY を受け取った各 Node は CHECK\_DELAY\_REPLY を接続している親 Node に送信する。 CHECK\_DELAY\_REPLY を受け取った Root Node はメッセージと画像データの伝達にどれだけの時間がかかったかを計算する。 データ計算方法を以下のソースコード\ref{calc}に記述する。 この変数``time''は CHECK\_DELAY\_REPLY に付いている送信時刻である。