Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
次に、残された他方のソケットがcloseされた時の動作を説明する。
(step 4)
アプリケーションがTCP_CLOSE_WAIT状態のソケットからデータを読み尽くすとEOFが戻される。(一般に)これを契機にアプリケーションは、残されたTCP_CLOSE_WAIT状態のソケットをcloseする。
基本的に一つ目のソケットのcloseと同じ処理を行う。異なるのは、ソケットの状態がTCP_CLOSE_WAITからTCP_LAST_ACKに移行する点である。
(step 5) 先にcloseしたソケットはTCP_FIN_WAIT2状態になっている。TCP_FIN_WAIT2状態がFINパケットを受信(tcp_rcv_state_process関数)すると、tcp_fin関数を呼び出す。tcp_fin関数は、TCP_FIN_WAIT2状態のソケットをTIME_WAIT状態のtcp_tw_bucketとTCP_CLOSE状態のソケットの二つに作り直す(tcp_time_wait関数)。
(step 6) 後からcloseしたソケットは、TCP_LAST_ACK状態になっている。これに対し通信相手のソケットからFINに対応するACKが戻ってくる。このACKを受信(tcp_rcv_state_process関数)すると、ソケットをTCP_CLOSE状態に遷移させ、一定時間後に削除されるようにタイマの起動要求をだす。
(step 7) TIME_WAIT状態のtcp_tw_bucketは、システム上に2MSL時間存在し続ける。生成されてから2MSL時間立つと、タイマ(tcp_twkill関数)がこのTIME_WAIT状態のtcp_tw_bucketの削除を行う。
TIME_WAIT状態のtcp_tw_bucketは、この2MSL時間TCPポートを占有し続けることになる。このTCPポート宛のパケットはtcp_tw_bucketが受信(tcp_timewait_state_process関数)し、応答を返す。
'step 4'で送ったFINに対し、'step 5'で送り返したACKがネットワーク上でロストしたとき、再びFINが送られて来ることもあり、再度ACKを送り返さなければならない。
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:05, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members