annotate chapter3.tex @ 6:1bc81f8b7517

update chapter3
author oc
date Mon, 16 Feb 2015 17:20:04 +0900
parents 14e96778c600
children f6b14e3b72e0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
1 \chapter{TreeVNC のリファクタリング}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
2
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
3 \section{動的な port 番号の指定}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
4 TreeVNCは複雑な分散アルゴリズムを用いたシステムであり、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
5 デバッグを行う環境を整える必要がある。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
6
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
7 従来のTreeVNCでは、固定port番号を複数利用していた。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
8 port番号は一意なので、1台で複数のTreeVNCを立ち上げることができない。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
9
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
10 動的にport番号を割り当てることで、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
11 1つのnodeに対して複数のTreeVNCを起動することを可能にした。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
12 最低限のソケットポートを開けることによって、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
13 メモリの使用量を抑えることにも繋がる。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
14
6
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
15 以下に、動的に port 番号を割り当てているソースコード\ref{selectport}を記述する。
4
oc
parents: 3
diff changeset
16
oc
parents: 3
diff changeset
17
6
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
18 \begin{lstlisting}[caption=動的な port 番号の割り当て,label=selectport]
4
oc
parents: 3
diff changeset
19 public int selectPort(int p) {
oc
parents: 3
diff changeset
20 int port = p;
oc
parents: 3
diff changeset
21 while (true) {
oc
parents: 3
diff changeset
22 try {
oc
parents: 3
diff changeset
23 servSock = new ServerSocket(port);
oc
parents: 3
diff changeset
24 acceptPort = port;
oc
parents: 3
diff changeset
25 myAddress = "127.0.0.1";
oc
parents: 3
diff changeset
26 nets.getNetworkInterfaces();
oc
parents: 3
diff changeset
27 break;
oc
parents: 3
diff changeset
28 } catch (BindException e) {
oc
parents: 3
diff changeset
29 port++;
oc
parents: 3
diff changeset
30 continue;
oc
parents: 3
diff changeset
31 } catch (SocketException e) {
oc
parents: 3
diff changeset
32 e.printStackTrace();
oc
parents: 3
diff changeset
33 } catch (IOException e) {
oc
parents: 3
diff changeset
34 e.printStackTrace();
oc
parents: 3
diff changeset
35 }
oc
parents: 3
diff changeset
36 }
oc
parents: 3
diff changeset
37 System.out.println("accept port = " + port);
oc
parents: 3
diff changeset
38 return port;
oc
parents: 3
diff changeset
39 }
oc
parents: 3
diff changeset
40 \end{lstlisting}
oc
parents: 3
diff changeset
41
6
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
42 \newpage
4
oc
parents: 3
diff changeset
43
6
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
44
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
45 selectPort メソッドは、TreeVNC を立ち上げた際に呼ばれる。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
46 ソースコード\ref{selectport}の try 節で ServerSocket を生成する。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
47 ServerSocket 生成の際に port 番号を結びつける。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
48 この時に既に port 番号が使用されている場合、
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
49 BindException error が起こる。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
50 その場合、catch 節に処理が移行する。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
51 port をインクリメントし、
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
52 continue でもう一度 ServerSocket を生成しに行く。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
53 成功するまで port はインクリメントされるので、
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
54 ユニークな port 番号を使用することが可能となる。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
55
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
56 以前は固定port番号を使用しmessageの通信を行っていたが、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
57 一意なportを割り当てられているnodeが通信を行うことによって、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
58 どのport番号が使用されているかを意識する必要がなくなった。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
59
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
60
3
oc
parents: 1
diff changeset
61 \section{QUALITYモードとSPEEDモード}
oc
parents: 1
diff changeset
62
oc
parents: 1
diff changeset
63 高解像度のまま拡大・縮小の処理を行うと、
oc
parents: 1
diff changeset
64 PCのスペックによって描画処理に時間がかかってしまうことがある。
oc
parents: 1
diff changeset
65 授業中に TreeVNC を使用する際、
oc
parents: 1
diff changeset
66 拡大・縮小をしてしまうと描画処理が重くなり遅延が生じていた。
oc
parents: 1
diff changeset
67
oc
parents: 1
diff changeset
68 画像描画処理には、品質優先( QUALITY モード)・スピード優先( SPEED モード)がある。
oc
parents: 1
diff changeset
69 今まで TreeVNC は基本的に QUALITY モードを設定していた。
oc
parents: 1
diff changeset
70
oc
parents: 1
diff changeset
71 どちらのモードを使用するかをビューワから変更出来るようにした。
oc
parents: 1
diff changeset
72 これにより、描画処理の遅延を解決することができた。
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
73
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
74
4
oc
parents: 3
diff changeset
75 \section{ホスト切り替え時の挙動の修正}
oc
parents: 3
diff changeset
76 画面の切り替えを行う際、新しいホスト側の画面に生じた
oc
parents: 3
diff changeset
77 ビデオフィードバックが他のユーザに配信されてしまう問題があった。
oc
parents: 3
diff changeset
78
oc
parents: 3
diff changeset
79 ホストの切り替えの際、
oc
parents: 3
diff changeset
80 新しいホスト側のviewerを閉じることで問題を解決した。
oc
parents: 3
diff changeset
81
oc
parents: 3
diff changeset
82
oc
parents: 3
diff changeset
83 \newpage
oc
parents: 3
diff changeset
84
oc
parents: 3
diff changeset
85
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
86 \section{Tree の構成の変更}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
87
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
88 従来のTreeVNCは、クライアントの接続する木構造が単一であった。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
89 そのため、ネットワークインターフェースが違うクライアントが
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
90 同じ木に混在している状況が生じた。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
91 速度の遅いクライアントが木に存在すると、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
92 そのクライアント以下の通信速度が遅くなってしまう。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
93
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
94 この問題を解決するために、
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
95 図\ref{fig:multinetworktree}の様に、ネットワークインターフェース別に
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
96 木構造を形成するように設計した。
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
97
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
98 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
99 \begin{center}
6
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
100 \includegraphics[scale=0.6]{./images/chapter3/MultiNetworkTree.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
101 \end{center}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
102 \caption{Multi Network Tree}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
103 \label{fig:multinetworktree}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
104 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
105
6
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
106 TreeVNC は、root が TreeManager というオブジェクトを持っている。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
107 TreeManager は TreeVNC の接続部分を管理している。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
108 TreeManager では木構造を管理する nodeList が生成される。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
109 この nodeList を元に、新しい node の接続や、node の切断検出時の接続の切り替え等を行う。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
110
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
111 今回 TreeManager を、 root の保持しているネットワークインタフェース毎に
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
112 生成する様に変更した。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
113 ソースコード\ref{createtreemanager}に、nodeList を生成する部分を示す。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
114
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
115 \newpage
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
116
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
117 \lstinputlisting[breaklines=true,caption=TreeManager の生成,label=createtreemanager]{source/GetNetworkInterfaces.java}
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
118
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
119 \begin{itemize}
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
120 \item for 文を使用し root が所持しているネットワークインタフェースを取得する(\ref{createtreemanager}中, 2行目)
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
121 \item その中から、起動しており Multicast に対応しており、また、ループバックインタフェースでないネットワークインタフェースを取得する(\ref{createtreemanager}中, 4行目)
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
122 \item 取得してきたネットワークインタフェースの、ネットマスク、ホストネームを取得する(\ref{createtreemanager}中, 6,7行目)
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
123 \item TreeManager を生成する(\ref{createtreemanager}中, 8行目)
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
124 \item TreeManager にネットマスクとネットアドレスを追加する(\ref{createtreemanager}中, 14行目)
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
125 \item HashMap である interfaces に ネットワークインタフェースと対応する TreeManager を追加する(\ref{createtreemanager}中, 15行目)
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
126 \end{itemize}
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
127
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
128 新しい node が接続してきた際、
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
129 interfaces から node のネットワークインタフェースと一致する TreeManager を取得する。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
130 その TreeManager に、node 接続の処理を任せる。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
131
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
132 こうすることによって、TreeVNC を複数のネットワークインターフェース別に
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
133 木構造を構成することができる。
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
134
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
135
1bc81f8b7517 update chapter3
oc
parents: 4
diff changeset
136
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
137
3
oc
parents: 1
diff changeset
138 \newpage
oc
parents: 1
diff changeset
139
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
140 \section{切断時の検知方法の変更}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
141
3
oc
parents: 1
diff changeset
142 接続していたクライアントとの接続が切れた際の検知方法を変更した。
oc
parents: 1
diff changeset
143
oc
parents: 1
diff changeset
144 root は nodeList という TreeVNC のネットワークトポロジーを管理するためのリストを持っている。
oc
parents: 1
diff changeset
145 root は TreeVNC の接続処理の全てを担っている。
oc
parents: 1
diff changeset
146 %node が切断された場合、 root は TreeVNC の木構造を崩さないように切断を検知し、
oc
parents: 1
diff changeset
147 %木構造を崩さないよう、 node 同士の接続を再構成しなければならない。
oc
parents: 1
diff changeset
148 node の接続が切れた場合、代わりとなる node の接続が必要となるため root に知らせなければならない。
oc
parents: 1
diff changeset
149
oc
parents: 1
diff changeset
150 変更前は、lostParent という検知方法を採用していた。
oc
parents: 1
diff changeset
151 この方法は、親となる node の接続が切れた場合、
oc
parents: 1
diff changeset
152 子となる node から root に対して lostParent message を送信する。
oc
parents: 1
diff changeset
153 これにより root は lostParent を検知し、代替 node の接続を行う。
oc
parents: 1
diff changeset
154
4
oc
parents: 3
diff changeset
155 以下に、lostParent の検知・再接続方法を記述する。
oc
parents: 3
diff changeset
156
oc
parents: 3
diff changeset
157 \begin{itemize}
oc
parents: 3
diff changeset
158 \item 親 node の接続が切れる
oc
parents: 3
diff changeset
159 \item 切れた親 node に接続していた子 node が root に LOST\_PARENT message を送信する
oc
parents: 3
diff changeset
160 \item root が nodeList の更新を行う
oc
parents: 3
diff changeset
161 \item 切れた親 node の代わりに、nodeList の最後尾 node を配置する
oc
parents: 3
diff changeset
162 \item 親 node を失った子 node は、新しい親 node に接続する
oc
parents: 3
diff changeset
163 \end{itemize}
oc
parents: 3
diff changeset
164
3
oc
parents: 1
diff changeset
165 この方法では、子のいない末端の node の接続が切れた際に root にメッセージが送信されない。
oc
parents: 1
diff changeset
166 root は切断を検知できないと、nodeList の更新を行うことができない。
oc
parents: 1
diff changeset
167 nodeList が正しく更新されない場合、図\ref{fig:lostparent}のように、
oc
parents: 1
diff changeset
168 新しい node を既に切断されている node に接続しようと試み、失敗してしまう。
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
169
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
170 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
171 \begin{center}
3
oc
parents: 1
diff changeset
172 \includegraphics[scale=0.7]{./images/chapter3/lostParent.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
173 \end{center}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
174 \caption{lostParent}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
175 \label{fig:lostparent}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
176 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
177
4
oc
parents: 3
diff changeset
178 \newpage
oc
parents: 3
diff changeset
179
3
oc
parents: 1
diff changeset
180 末端 node の切断が検知できない問題を解決するために、
oc
parents: 1
diff changeset
181 lostChild という検知方法に変更した。
oc
parents: 1
diff changeset
182
4
oc
parents: 3
diff changeset
183 TreeVNC は、画像データ(framebufferUpdate)が MulticastQueue という Queue に蓄積される。
3
oc
parents: 1
diff changeset
184 node はこの Queue から画像データを取得し、描画している。
oc
parents: 1
diff changeset
185 lostChild の検出方法は、この MulticastQueue を使用している。
oc
parents: 1
diff changeset
186 ある一定時間、MulticastQueue から画像データが取得されない場合、
4
oc
parents: 3
diff changeset
187 その node との接続が切れたと判断することができる。
oc
parents: 3
diff changeset
188
oc
parents: 3
diff changeset
189 以下に、lostChild の検知・再接続方法を記述する。
3
oc
parents: 1
diff changeset
190
4
oc
parents: 3
diff changeset
191 \begin{itemize}
oc
parents: 3
diff changeset
192 \item 子 node の切断を検知した node が root へ LOST\_CHILD message を送信する(図\ref{fig:lostchild1}中, 1:)
oc
parents: 3
diff changeset
193 \item LOST\_CHILD message を受け取った root は nodeList の更新を行う(図\ref{fig:lostchild1}中, 2:)
oc
parents: 3
diff changeset
194 \item 切断した node を nodeList から消し、nodeList の最後尾の node に切断した node number を割り当てる
oc
parents: 3
diff changeset
195 \item root は最後尾の node に、切断した子 node が接続していた親 node に接続する様に CONNECT\_TO message を送信する(図\ref{fig:lostchild1}中, 3:)
oc
parents: 3
diff changeset
196 \item 最後尾の node が子 node を失った親 node へ接続しに行く(図\ref{fig:lostchild1}中, 4:)
oc
parents: 3
diff changeset
197 \end{itemize}
3
oc
parents: 1
diff changeset
198
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
199 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
200 \begin{center}
3
oc
parents: 1
diff changeset
201 \includegraphics[scale=0.7]{./images/chapter3/lostChild1.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
202 \end{center}
3
oc
parents: 1
diff changeset
203 \caption{lostChild を検知・再接続}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
204 \label{fig:lostchild1}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
205 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
206
4
oc
parents: 3
diff changeset
207 \newpage
oc
parents: 3
diff changeset
208
oc
parents: 3
diff changeset
209 lostChild を検知することより、
oc
parents: 3
diff changeset
210 切断されてしまった全ての node を検知することができるので、
oc
parents: 3
diff changeset
211 nodeList の更新が正しく行われる。
oc
parents: 3
diff changeset
212
oc
parents: 3
diff changeset
213 新しい node からの接続要求 WHERE\_TO\_CONNECT message に対して、
oc
parents: 3
diff changeset
214 適切な node への接続を提供することができる(図\ref{fig:lostchild2}中, 1,2:)。
oc
parents: 3
diff changeset
215
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
216 \begin{figure}[htpd]
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
217 \begin{center}
3
oc
parents: 1
diff changeset
218 \includegraphics[scale=0.7]{./images/chapter3/lostChild2.pdf}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
219 \end{center}
3
oc
parents: 1
diff changeset
220 \caption{新 node の接続}
1
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
221 \label{fig:lostchild2}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
222 \end{figure}
dc17ac172c7d add thesis in production.
oc
parents:
diff changeset
223