ソケットの仕組み

ソケットは一般にクライアントとサーバーの対話で使用されます。 通常のシステム構成では、一方のマシンにサーバーを、 もう一方のマシンにクライアントを置きます。 クライアントはサーバーに接続して情報を交換し、その後切断します。

ソケットには定型のイベント・フローがあります。 コネクション型クライアント/サーバー・モデルでは、 サーバー・プロセス上のソケットはクライアントからの要求を待ちます。 これを行うため、サーバーはまず、 クライアントがサーバーを探せるようにアドレスを確立 (バインド) します。 アドレスが確立されると、サーバーはクライアントがサービスを要求してくるのを待ちます。 クライアントとサーバーとの間のデータ交換は、 クライアントがソケットを経由してサーバーに接続しているときに行われます。 サーバーは、クライアントの要求を実行し、クライアントに応答を送信し返します。

注: 現在、IBM は、大部分のソケット API について、2 つのバージョンをサポートしています。 デフォルトの IBM® i ソケットはバークレー・ソケット・ディストリビューション (BSD) 4.3 の構造と構文を使用します。 もう一方のバージョンのソケットは、BSD 4.4 および UNIX 98 プログラミング・インターフェース仕様と互換性のある構文および構造を使用します。 プログラマーは、_XOPEN_SOURCE マクロを指定することにより、UNIX 98 と互換性のあるインターフェースを使用することができます。

以下の図は、コネクション型ソケット・セッションの典型的なイベント・フロー (および API が発行される順序) を表しています。 各イベントの説明が、図の後に続きます。

2 つの端点が接続を確立し、クライアントとサーバーを結び付けます。

これが、コネクション型ソケットの一般的なイベント・フローです。

  1. socket() API は、通信用の端点を作成し、端点を表すソケット記述子を戻します。
  2. アプリケーションがソケット記述子をもつと、アプリケーションはソケットに固有な名前をバインドできます。 サーバーは、ネットワークからのアクセスを可能にするために、名前をバインドする必要があります。
  3. listen() API は、クライアントの接続要求を受け入れる態勢を示しています。 listen() API がソケットに対して発行されると、そのソケットは接続要求を積極的には開始しません。 listen() API は、ソケットが socket() API で 割り当てられ、bind() API がそのソケットに名前をバインドした後に発行されます。 listen() API は accept() API の発行前に発行されていなければなりません。
  4. ストリーム・ソケットの connect() API は、クライアント・アプリケーションがサーバーへの接続を確立するのに使用されます。
  5. サーバー・アプリケーションは accept() API を使用して、クライアント接続要求を受け入れます。 サーバーは、accept() API を発行する前に、 bind() API と listen() API を正常に発行している必要があります。
  6. ストリーム・ソケット間 (クライアントとサーバーの間) に接続が確立されると、ソケット API データ転送 API をどれでも使用できるようになります。 クライアントとサーバーには、選択可能な多くのデータ転送 API があります。 例えば、send()recv()read()write() などです。
  7. サーバーまたはクライアントが操作を停止するときは、 ソケットが獲得したシステム・リソースを解放するために close() API を発行します。
注: ソケット API は、通信モデルの中でアプリケーション層とトランスポート層の間に位置します。ソケット API は、 通信モデルの中の層ではありません。ソケット API を使用することにより、 アプリケーションは一般的な通信モデルのトランスポート層やネットワーク層と対話できます。 以下の図の矢印は、ソケットの位置とソケットが提供する通信層とを示しています。
通信層におけるソケットの位置

一般に、ネットワーク構成では、 セキュア内部ネットワークと非セキュア外部ネットワークとを接続することはできません。 しかし、ソケットがファイアウォール (高度なセキュア・ホスト) の外部にあるシステムのサーバー・プログラムと通信できるようにすることもできます。

ソケットはマルチプロトコル・トランスポート・ネットワーキング (MPTN) 体系を支える、IBM の AnyNet® 実装の一部でもあります。MPTN 体系は、 追加のトランスポート・ネットワークの中から 1 つのトランスポート・ネットワークを操作できるようにしたり、 異なるタイプのトランスポート・ネットワーク間でもアプリケーション・プログラムを接続したりできるようにします。