サーバ側処理前半

まず最初にLISTEN状態のソケットが、コネクション確立要求(SYNパケット)を受け取った時の動作を説明する。SYNパケットを受け取るとサーバはSYN_RECV状態のコネクションを生成し、クライアントにSYN+ACKパケットを返送する。

パケットはtcp_v4_rcv, tcp_v4_do_rcv関数を通して入って来る。受信ソケットがTCP_LISTEN状態である場合、まずtcp_v4_hdn_req関数が呼び出されるが、SYNパケットである場合(基本的に)何も処理をしない。その後tcp_rcv_state_process関数を呼び出す。

tcp_rcv_state_process関数は、TCP_LISTEN状態のソケットがSYNパケットを受け取った場合は、tcp_v4_conn_request関数を呼び出す。

tcp_v4_conn_request関数は、SYN要求に対応してSYN_RECV状態のopenreq構造体を生成する。(LinuxにおいてSYN_RECV状態は、ソケットではない)

  • openreq構造体を確保(tcp_openreq_alloc関数)し、初期化する。 初期シーケンス番号はtcp_v4_init_sequence関数で求める。
  • コネクション接続要求してきた相手にSYN+ACKパケットを返送する。 (tcp_v4_send_synack関数)
  • SYN+ACKパケットの再送タイマを起動する (tcp_inc_slow_timer(TCP_SLT_SYNACK)関数)
  • 生成したopenreqをソケットのsyn_wait_queueの最後にリンクする (tcp_synq_queue関数)。
img109.gif

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