用語辞典・IP・アドレス

ソケット

ソケットとは

ソケットは、アプリケーションがOSの通信機能を利用するために作る、通信端点を表す操作用の仕組みです。英語ではsocket(ソケット)と呼び、ネットワーク通信を扱うものはnetwork socket(ネットワーク・ソケット)とも呼ばれます。

ソケットは、アプリケーションがOSの通信機能を利用するために作る、通信端点を表す操作用の仕組みです。

アプリは、ネットワーク機器を直接操作してパケットを一つずつ組み立てる代わりに、ソケットを作り、接続、送信、受信、終了といった操作をOSへ依頼します。ソケットは通信の「相手側の機械」ではなく、自分のアプリがOS内で扱う通信の入口です。

アプリとネットワーク処理の間に、操作できる端点を作るアドレス、ポート、通信規則を組み合わせて扱う
アプリケーションがOS内に通信規則、IPアドレス、ポート番号を組み合わせたソケットを作り、相手側ソケットと通信路を結ぶ図解
図1POSIX系OSではソケットをファイルディスクリプターとして操作します。Windowsではソケット用のハンドルとして扱います。どちらも物理的な端子やケーブルそのものではありません。

作った直後のソケットには、まだ相手がいない

socket()のようなAPIで作成した直後は、通信規則や方式は選ばれていますが、通常はローカルのIPアドレスポート番号へまだ結び付けられていません。アプリの操作やOSの自動選択によって端点情報が決まります。

クライアントは接続先を指定してconnect()を行うと、OSが利用する送信元アドレスと一時ポートを選べます。サーバーは、受け付けたいローカルアドレスとポートへbind()して待ち受けます。

TCPサーバーでは、待受用と会話用を分ける

TCPソケットの代表的な流れ接続を受け付けても、待受ソケットは次の要求を待ち続ける

サーバー

  1. socket端点を作る
  2. bindアドレスとポートへ結ぶ
  3. listen接続要求を待つ
  4. accept会話用ソケットを作る
接続双方向のデータ

クライアント

  1. socket端点を作る
  2. connectサーバーへ接続する
  3. send / receiveデータを交換する
  4. close利用を終える
図2accept()が返すのは、特定のクライアントと通信する新しいソケットです。元の待受ソケットを残すことで、サーバーは別のクライアントからの接続要求も受け付けられます。

一つのTCP接続は、両端の組で見分ける

TCP接続は、送信元IPアドレス、送信元ポート、宛先IPアドレス、宛先ポートの四つの値に通信規則を加えて識別されます。そのため、一つのサーバーポートへ多数のクライアントが同時接続しても、クライアント側のアドレスやポートが異なれば別の接続です。

待受ソケットは「このローカルポートへの新しい接続」を受け付けますが、接続済みソケットは「この相手との一つの会話」を表します。同じソケットという名前でも状態と用途が異なります。

UDPソケットは、接続の意味がTCPと異なる

UDPは、TCPのような接続確立や信頼性のあるバイト列を提供しません。UDPソケットは一通ごとに宛先を指定して送受信できます。UDPでconnect()を使う実装もありますが、既定の相手をOSへ登録して送受信を簡単にする意味が中心で、TCPの接続確立と同じ動作ではありません。

ソケットにはネットワーク用以外に、同じ端末内のプロセス間通信に使う種類もあります。「ソケット=IPアドレスとポートの組」だけではなく、それらを扱うOSの通信端点と操作手段として捉えます。

仕様の確認資料:The Open Group「socket — create an endpoint for communication」RFC 9293「Transmission Control Protocol」

関連用語