第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
分散環境でのプログラミング