ソケットプログラミング

ソケットプログラミングにおいて、おおまかなサーバ・クライアント双方の状態遷移及びその契機となる操作が何かについて理解できた。

サーバー側の挙動で、listen, acceptの部分がよくわからない。リスニングソケットに対して、カーネル側で「確率済みキュー(ESTABLISHED)」と「確率待ちコネクションキュー(SYN_RCVD)」の二つのキューが作られるというところはわかった。キューへのエントリの合計数は、listen(backlog)で指定するbacklogより小さくなるというところもわかった。

では、このキューとは何なのか?これがわからない。ソケットが格納されているというイメージでいるが(参考書の書き方的にもそう解釈できそう)、その場合、リスニングソケットと(acceptによって確率済みキューの先頭から取り出された)接続済みソケットは同じポートを利用していることになる(リスニングソケットと接続済みソケットは同じポートを使っていることは実験により確認済み)。このことが可能かどうかがわからない。

書いてたら別に問題ないような気がしてきた。リスニングソケットはSYNが届いたらSYN_RCVD状態のソケットを生成して、3WHSが成立したらESTABLISHED状態に変化させるということを行って、かつリスニングソケットの持つキューに生成したソケットを順番に格納しているということか?ちょっと納得できないのは、複数のソケットが同じポートを利用しているというところか。クライアント側で複数のソケットで同じポートをバインドしてみるか実験してみるか。

実験したところ、少なくともbindではAddress already in use エラーが発生することがわかった。これは調べたい。

調べたところ、forkして子プロセスに処理を移譲しているようだ。同一プロセスでは同一のポートは使用できず、異なるプロセスならば可能ということだろうか。子プロセスを作成したら同じアドレスをbindできるのか?マルチプロセス(スレッド?そこも曖昧…)はなあなあで済ませてきたらそこから勉強せねば…