Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
まず一方のソケットがcloseされた時の動作を説明する。
(step 1) TCP用ソケットのcloseを行った場合、tcp_close関数が呼び出される。
(step 2) 通信相手から終了処理要求(FINパケット)を受けたときは以下のように動作する。
FINパケット受信処理はtcp_fin関数が行う。
一度FINを受けると、そのシーケンス番号(fin_seq)以降のパケットが到着してもパケットを破棄するようになる(tcp_rcv_state_process関数)。
アプリケーションへのFINの通知は、EOFで行う。パケットの読みだし(tcp_rcvmsg関数)の処理中にFINフラグの立ったパケットを読み出すと、次回の読みだし処理(tcp_rcvmsg関数)はEOFを返すようになる。
(step 3) 先にcloseを行ったソケットは、TCP_FIN_WAIT1状態になっている。これに対し通信相手のソケットからFINに対応するACKが戻ってくるとソケットをTCP_FIN_WAIT2状態に遷移させる(tcp_rcv_state_process関数)。
リンガー指定のソケットの場合、close処理を行っているプロセスを起床する。リンガー指定でない場合、ソケットの代わりにtcp_tw_bucketを確保し、コネクション状態がTCP_TIME_WAIT状態、サブ状態がTCP_FIN_WAIT2状態で初期化し(tcp_time_wait関数)、遅延削除タイマに登録(tcp_tw_schedule関数)する。
もしFINに対応するACKパケットが届く前に、通常のデータパケットが届いた場合は破棄(kfree_skb関数)してしまう。破棄はするがACKの返送は行う(tcp_ack_snd_check関数)。エラーにはならない(tcp_time_state_process関数)。
(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST1
[ページ情報]
更新日時: 2008-08-27 14:18:41, 更新者: hiromichi-m
[権限]
表示:無制限, 編集:ログインユーザ, 削除/設定:メンバー