1999/10/18

ネットワーク (17)


TCP (Transmission Control Protocol)

TCPハーフ・クローズ

p.272 (例) rsh bsdi sort < datafile

TCP状態遷移ダイアグラム

通常のクライアント→太字の実線
通常のサーバ→太字の破線

2MSL待ち状態

「TIME_WAIT状態」を「2MSL待ち状態」とも呼ぶ。 TCPがアクティブ・クローズを実行し、最後のACKを送ったあと、コネクションは MSL(最大セグメント寿命)×2 の期間 TIME_WAIT にとどまっている必要がある。 最後のACKが消失した場合(他方のエンドがタイムアウトし、最後のFINを再送する)、 でも、TCPが再度ACKを送ることを可能にするため。

3年のソフトウェア工学で、サーバが Ctl-cで殺されたときに、 しばらくはそのポート番号が使えなくなったことのはそのため。 再利用するためには、プログラムで以下のオプションを設定した。

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&flag,sizeof(flag));

リセット・セグメント

一般的に、ソケットペアに対して正しくないセグメントが到着した とき、リセットが送られる。

使用されていないポート番号へのデータグラム

ハーフ・オープン・コネクションの検知

一方のエンドが他方のエンドに知らせずに終了あるいは中断したとき、 TCPコネクションはハーフ・オープンであるといわれる (1台がクラッシュしたときに起きる)。

(例)bsdi上で telentクライアントを実行し、srv4のサーバに接続する。 1行入力した後、srv4のEthernetケーブルを取り外して、srv4をrebootする。 srv4が再起動した後、srv4にEthernetケーブルをつないでから、 bsdi上からもう1行送る。 srv4は、bsdiからの接続について何も知らないので リセットを返す。