サーバ側 accept処理

サーバにおけるaccept処理は下記のように動作する。

アプリケーションからのaccept処理要求は、まずsocketレイヤ(sys_accept)でもう一つ空のソケットを作成する(inet_stream_opsのdupメソッド呼び出し)ところから始まる。TCPの場合inet_create関数が呼び出される(通常のソケット生成と同じ)。その後inet_accept関数を呼び出す(struct proto_ops inet_stream_opsインターフェイステーブル経由)。

  1. inet_accept関数は、まずtcp_accept関数を呼び出す (tcp_protインターフェイステーブル経由)。
    • TCP_LISTEN状態のソケットのsyn_wait_queueから TCP_ESTABLISHED状態のソケットを捜し出し(tcp_find_establised関数)、 syn_wait_queueから外す(tcp_synq_unlink関数)。
    • もしTCP_ESTABLISHED状態のソケットが無い場合、 TCP_ESTABLISHED状態のソケット ができるまで待ちに入る(wait_for_connect関数)。
    • 取得したTCP_ESTABLISHED状態のソケットとリンクされている open_req構造体を解放する(tcp_openreq_free関数)。
    • もしsetsockoptでKEEP ALIVE有効を指定されていた場合は、 KEEPALIVEタイマの起動をかける (tcp_inc_slow_timer(TCP_SLT_KEEPALIVE)関数)。
  • tcp_accept関数が返却してきたTCP_ESTABLISHED状態の sock構造体とソケットのリンクを行う。元もとソケットに リンクされていた空のsock構造体は解放(destroy_sock関数)する。

サーバはaccept処理のよって得られた新しいソケットを通して通信を開始する。


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