サーバ側処理前半

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

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

tcp_rcv_state_process関数は、TCP_LISTEN状態のソケットがSYNパケットを受け取った場合は、tcp_v4_conn_request関数(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関数)
  • 生成したopenreqをソケットのsyn_table[]に登録し、 KEEPALIVEタイマの起動を要求する(tcp_v4_synq_add関数)。
img113.gif

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1