1999/10/18
ネットワーク (17)
TCP (Transmission Control Protocol)
TCPハーフ・クローズ
- ハーフ・クローズ ---
TCP では、コネクションの一方のエンドが他方のエンドからのデータを
受信中でも、データの出力を終了することができる。
すなわち、「データの送信は終了したので、相手に対してFINを送るが、
相手からはFINが送られてくるまでデータの通信ができる」。
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));
リセット・セグメント
一般的に、ソケットペアに対して正しくないセグメントが到着した
とき、リセットが送られる。
使用されていないポート番号へのデータグラム
- UDP --- 「ICMPポート到達不能」が返る
- TCP --- 「リセット」が返る (例)使用されていないポートへのtelnet
ハーフ・オープン・コネクションの検知
一方のエンドが他方のエンドに知らせずに終了あるいは中断したとき、
TCPコネクションはハーフ・オープンであるといわれる
(1台がクラッシュしたときに起きる)。
(例)bsdi上で telentクライアントを実行し、srv4のサーバに接続する。
1行入力した後、srv4のEthernetケーブルを取り外して、srv4をrebootする。
srv4が再起動した後、srv4にEthernetケーブルをつないでから、
bsdi上からもう1行送る。
srv4は、bsdiからの接続について何も知らないので リセットを返す。