第19章 ネットワークプログラム

Download Report

Transcript 第19章 ネットワークプログラム

第19章 ネットワークプログラム
サーバプログラム
逐次処理と並行処理


複数のrequestを平行して処理するか,逐
次に処理するか.
逐次処理サーバ
– 作りやすく、理解しやすい.
– 性能が上がりにくい.(サービス待ち)

並行処理サーバ
– 設計がむつかしい.
– より優れた性能
Connection / connectionless

どちらがよいか?
– Application protocol に依存する.
Connection-oriented server


プログラミングが容易 ― 面倒な処理はす
べてTCPに任せる.
欠点もある.
– connectionごとにsocketが必要になる.
– 3-way handshake は高価である.
– 相手がcrashしてもわからずconnectionを継
続・・・OSの資源の枯渇
Connectionless server

Unreliable である.
– 再送とtimeout 適応的なtimeout時間管理!
– reliabilityの確保はapplication protocolによる.
– 容易なことではない.(専門知識が必要)
– multicast 通信の場合はUDPのみ
Stateful or stateless

状態を保持すると,効率をよくすることが望
める.
–例
ファイルサーバ
• バッファへの先読み、


しかしclient のリブートなどがあると,資源
の枯渇やthrashing現象につながる.
状態の導入による最適化には用心
サーバの4つの基本タイプ
逐次処理
コネクションなし
逐次処理
コネクションあり
並行処理
コネクションなし
並行処理
コネクションあり
逐次サーバ



設計、プログラム、デバグが容易である.
予期される負荷に対して、逐次処理で十分
に応答が速ければよい.
UDPサービスの使われることが多い.
– TCPで使うことも可能である.
TCP逐次処理サーバ
1.ソケット生成、well-known port に bind
2.Passive mode
3.Request の accept,新しいソケットで
connect
4.Clientから繰り返しrequestをreadし
protocolにしたがってreplyをwrite
5.終わったらconnectionをcloseし,3.へ行
く.
Well-known address へのbind


たとえば、getportservbynameでport # を
得る.
Local IP address は?
INADDR_ANY を用いる.このホストのもつすべ
てのIPアドレスに合致する (wild card).

bindシステムコールによってsocketを
local port に結合する.
Socket を passive modeにする

listen システムコールによる
– queue の長さも指定できる.(接続要求の待
ち行列)
接続要求の受け付けとサービス

accept システムコールによる.
– 待ち行列から一つ接続要求を取り出し、
– 3-way handshake
– slave socket を返す.
– 要求が来ていなければ block する.

read/write を繰り返し、slave socket を
close する.
UDP逐次処理サーバ
処理時間の短いサービスは逐次処理に適し
ている.多くはオーバーヘッドの少ない
UDPを使う.
1.ソケット生成、well-known addr に bind
コネクトはしない.
2.Clientから繰り返しrequestを読み込み、
protocolにしたがってreplyを送る.
UDP server と remote addr
UDPではコネクトしないので、メッセージと
いっしょに reomte endpoint をもらう.
retcode = recvfrom (s, buf, len, flags,
from, fromlenp);
retcode = sendto(s, message, len, flags,
toaddr, toaddrlen);
並行処理サーバ

複数のclientに対する応答時間を速める.
有効な場合は?
– replyするのにかなりのI/O処理を必要とする.
– 要求によっては処理時間が大幅に異なる.
– Multiple CPUの環境
UDP並行処理サーバ
M1.ソケット生成、well-known port に bindする.
コネクトしない.
M2.繰り返し recvfrom を呼び出し、clientからの
新しい要求を受け付け、slave process を生成し、
処理をさせる.
S1.masterからrequest messageとclient のソ
ケットを受け取る.
S2.protocol にしたがって reply をsendto
S3.exit
UDP並行処理



プロセス生成のコストは比較的高価
並行処理のコストがスピードアップに見合
うか?
UDPサーバでは逐次処理が多い.
TCP並行処理サーバ (master)

並行性
– コネクションごとに並行(リクエストごとでな
い)
M1.ソケット生成、well-known addr に bindす
る.コネクトしない.
M2.ソケットを passive mode にする.
M3.繰り返しclientからの新しい要求を accept,
slave process を生成し、処理をさせる.
TCP並行処理サーバ (slave)
S1.masterから接続要求とslave socketを
受け取る.
S2.protocolにしたがって繰り返しread/
writeして要求にこたえる.
S3.一つのclientからのリクエストが終わる
と、connectionをcloseしてexitする.
一つのプロセスによる見かけの
並行処理



UNIXのselect システムコールを使い,複
数のI/O割り込みを一箇所で待つ.
masterのソケットでpassive openする.
acceptで得たslave socketとmaster
socketでselectする.
selectで起こされたら、acceptまたは
read/write する.
サーバタイプの比較






逐次か並行か?
TCPかUDPか?
見かけの並行か複数プロセスの並行か?
4種類のサーバの特徴?
非同期I/Oによる見かけの並行処理?
何のコストが高いか?
サーバ・プログラムの例

Server の各バージョンのテストを容易にするた
めに、以下の例では
u_short portbase
に適当なオフセットを与えて、実際に使用する
ポートが現用中の特権ポートでなくても動かせ
るようにしてある.
UDP逐次処理サーバ・ツール
プロセスの構造
server
Well-known port
のsocketがすべての
通信で使われる.
UDP逐次処理サーバ(単一プロセスが多くの
clientとたった一つのsocketを通して通信)
TIMEサーバの例

UDP逐次処理サーバ
TCP逐次処理サーバの例
プロセスの構造
server
接続要求
に対する
ソケット
独自に使われた
ソケット
Daytime server
TCP並行処理サーバ

プロセスの構造
並行処理echo
サーバの例
子プロセスの終了を完了
その他の応用








単一プロセスによるTCP並行処理サーバ
多重プロトコルサーバ(TCP,UDP)
多重サービスサーバ(TCP,UDP)
並行性の制御 (server, client)
トンネリング
application gatewayと防火壁
RPCとXDR
分散環境でのプログラミング