サーバ側処理後半

サーバ側処理前半処理の最後に送出したSYN+ACKパケットにより、クライアント側のソケットはSYN_SENTからESTABLISH状態に遷移する。このときクライアントはACKパケットを返送して来る。このACKパケットに対し、サーバはESTABLISH状態のソケットを生成する。

パケットはtcp_v4_rcv, tcp_v4_do_rcv関数を通して入って来る。受信ソケットがTCP_LISTEN状態である場合、まずtcp_v4_hdn_req関数が呼び出される。受信したパケットがACKパケットである場合、tcp_v4_hdn_req関数は以下のように動作する。

tcp_v4_hdn_req関数は、まず受信したパケットに対応するopenreqがあるか検索(tcp_v4_search_req関数)し、tcp_check_req関数を呼び出す。

tcp_check_req関数は、受信したパケットがSYNパケットである場合は、パケットをロストしたことを意味するので、SYN+ACKパケットの再送を行う(tcp_v4_send_synack関数)。受信したパケットがACKパケットである場合は、クライアント側のソケットがTCP_ESTABLISHEDになったことを意味する。サーバ側でもそれに対応するのソケットを生成する(tcp_v4_syn_recv_sock関数)。

tcp_v4_syn_recv_sock関数は、新規にSYN_RECV状態のソケット生成をし(tcp_create_openerq_child)初期化する(openreqの情報をソケットにコピー)。処理が完了したらソケットのdata_readyメソッドでaccept待ちのサーバを起こす。

更に、新規に生成したSYN_RECV状態のソケットに対しては、最後にtcp_rcv_state_process関数が呼び出される。この関数中で、ソケットの状態をESTABLISHEDに推移させる。

次々にコネクション要求が到達すると、上図のような状態になる。acceptされるのを待っているESTABLISHED状態のソケットと、コネクション確立処理途中のSYN_RECV状態のopenreqがソケットのsyn_wait_queueに複数リンクされた状態になる。


(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1