Show page source of internal24-262-切断処理第一段階 #25200

[[PageNavi(internal24-navi)]]

{{{ comment
h2w-title:切断処理第一段階
}}}
 

== 切断処理第一段階 == #SECTION05881000000000000000

まず一方のソケットがcloseされた時の動作を説明する。

'''(step 1) ''' TCP用ソケットのcloseを行った場合、tcp_close関数が呼び出される。

  1.  receive_queueにパケットがあるときは、そのパケットを破棄し、	ソケットを即TCP_CLOSE状態にし、終了する。 
    *  TCP_CLOSE状態にする(tcp_set_state関数)と同時に、	TCPポートキャッシュからの削除も行う(tcp_v4_unhash関数)。
    *  コネクション相手に強制的にRESETを送りつける	(tcp_send_active_reset関数) 
  *  setsockoptでlinger指定されているが、待ち時間が0の場合は	tcp_disconnect関数を呼び出す。	tcp_disconnect関数は	全ての保留中のパケットの解放、各種処理のクリアを行い	ソケットの状態をTCP_CLOSE状態にする。
  *  receive_queueのパケットを全て読み出した後でcloseを行った	場合はソケットの状態をTCP_FIN_WAIT1に変更(tcp_close_state)し、	FINパケットを送信する(tcp_send_fin関数) 
    *  まだ未送信のパケットがあればFIN情報を相乗りさせ、	(ソケットのsend_headが指すパケット)パケットを送出	(tcp_transmit_skb)。	パケットがない時は、FIN情報だけのパケットを新規	作成(sock_wmalloc)し、送出(tcp_send_skb)する。 
  *  setsockoptでlinger指定されているときは、	送信相手からFIN対するACKが返送されて来るまで待つ。 
    *  コネクション状態をTCP_TIME_WAIT状態、	サブ状態をTCP_FIN_WAIT2へ移行させる(tcp_time_wait関数)。	ソケットの代わりにtcp_tw_bucketを確保し、	遅延削除タイマにに登録(tcp_tw_schedule関数)する。 
  *  ソケットがTCP_CLOSE状態になっていたら、ソケットを解放する。

 [[Embed(internal24-images:img114.gif)]]
 

'''(step 2) ''' 通信相手から終了処理要求(FINパケット)を受けたときは以下のように動作する。

FINパケット受信処理はtcp_fin関数が行う。
  *  FINのシーケンス番号をソケットのfin_seqメンバに記録する
  *  FINをうけたのがTCP_ESTABLISHED状態であった場合、そのソケットを	TCP_CLOSE_WAIT状態へ推移させる。
  *  (FINのシーケンス番号以降の)out_of_order_queueにリンクされている	パケットを解放する。
  *  このソケットで待ちに入っているプロセスを起床する。(ソケットの	state_changeメソッド呼び出し)

一度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 [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1

[[PageNavi(internal24-navi)]]