Select Language

AI Technology Community

9.2、ソケットとは何か

前述の説明を通じて、TCP/IP はとても複雑だと思われるでしょう。実際、これらのプロトコルの内部詳細を完全に理解する必要はありません。なぜなら、大多数のユーザーにとって、これらのプロトコルをどのように使ってデータを転送するかが関心の対象だからです。

この節では、歴史のあるインターフェース——ソケット(socket)を紹介します。ソケットを使用すれば、直接これらのプロトコルとやり取りする必要もなく、これらのプロトコルの多くの詳細を知る必要もありません。このインターフェースは多くのオペレーティングシステムでサポートされています。つまり、あなたのコードがソケットインターフェースを使用している場合、ほとんどのオペレーティングシステムで利用可能です。

異なるオペレーティングシステムでは、TCP/IP プロトコルの実装が異なる場合がありますが、どれもソケットインターフェースを提供しています。

ソケットは、もともと 20 世紀 70 年代にバークレー加利福尼亚大学が UNIX システム上で実装したものです。当時は様々なタイプのインターフェースが開発されましたが、現在ではソケットだけが残っています。当時のソケットインターフェースは C 言語で実装されていましたが、私たちがこれから使用するのは基本的に Python 版のソケットです。ただし、その使い方は基本的に同じです。

ソケットインターフェースには主に以下のものが含まれます:

  • socket():ソケットを作成します。

  • bind():ローカルの指定された IP アドレスとポートにバインドします。

  • listen():リモートからの接続要求を待ちます。

  • accept():リモートからの接続要求を受け付けます。

  • connect():リモートに接続要求を送信します。

  • send():リモートにデータを送信します。

  • recv():リモートから送信されたデータを読み取ります。

  • close():ソケットを閉じます。


ソケットはサーバー側とクライアント側に分かれており、つまり私たちがよく言う C/S 構造です。C はクライアント、S はサーバーです。サーバー側は一般的にクライアントからの接続要求を待ち、接続要求を受け付け、ユーザーのデータ要求を読み取り、クライアントが必要とするデータを送信します。クライアント側は接続要求を送信し、要求データを送信し、サーバーからのデータを受信して処理します。

図 1 はサーバー側コードの基本構造を示しています。

TCPサーバー側の基本的な動作フロー
図 1 TCPサーバー側の基本的な動作フロー


図 1 では、listen が返されるということは、ユーザーからの接続要求を受け取ったことを意味します。サーバーは多くのクライアントにサービスを提供する必要があるため、一般的には複数のスレッドまたはプロセスを起動する必要があります。これにより、現在のユーザーの要求を処理している間も、他のユーザーにサービスを続けることができます。そのため、listen の後に accept を使用して新しいユーザーの接続要求を受け取り、read、send、close などの操作を含む新しいチェーンを起動します。このチェーンを起動した後、現在のプロセスは直接 listen に戻り、新しい接続要求を待ちます。

クライアント側は比較的簡単です。図 2 は一般的なクライアント側のコードフローを示しています。

TCPクライアント側の基本的な動作フロー
図 2 TCPクライアント側の基本的な動作フロー


図 2 では、まずソケットを申請し、サーバーに接続します。接続が成功すると(つまりサーバーが accept を呼び出した後)、要求データを送信することができ、最後にサーバーからの処理データを待ちます。処理するデータがなくなったら、close を使用してソケットを閉じ、リソースを解放することができます。


post
  • 5

    item of content
初期には、コンピュータ同士は相互に接続されておらず、孤立していました。それらの間のデータ交換は主にフロッピーディスク(現在のUSBフラッシュドライブに相当)を通じて行われていました。その後、人々はネットワークを創造し、コンピュータ間で情報の交換が可能になりました。
初期のコンピュータネットワークも種類が豊富で、サポートされているプロトコルも多岐にわたっていました。時間の経過とともに、現在広く使用されているのはIPネットワークとなり、他のタイプのネットワークは次第に姿を消しました。現在、オフィス内のローカルエリアネットワークでもインターネットでも、基本的にはIPネットワークを使用しています。
この章では、Pythonのネットワークプログラミングに関する知識を読者に紹介します。具体的には、TCP/IPプロトコル、ソケットインターフェース、TCP/UDPクライアントおよびサーバーの構築方法などを含みます。