ソケット通信

ソケットとは

ソケット(socket)は、プログラムがネットワーク通信を行うための出入口となる仕組みです。「差込口」を意味し、電源コンセントのように「ここに繋げば通信できる」窓口を提供します。OS が用意する API であり、アプリケーションは複雑な [[TCP/IP]] の処理を自分で書かずに「ソケットを作る」「データを書き込む」「読み出す」といった操作だけで通信できます。ファイルの読み書きとよく似た手触りで扱えるのが特徴です。

ソケットは IPアドレス+ポート番号の組で識別されます。「どのコンピュータの、どのアプリか」をこの2つで特定するわけです([[ポート番号]] を参照)。

サーバー側とクライアント側の流れ

TCP を使う場合、両者の手順は次のように非対称です。

手順サーバー側クライアント側
1socket — ソケットを作るsocket — ソケットを作る
2bind — 自分のIP/ポートに紐づける
3listen — 接続待ち受け開始
4accept — 接続要求を受け入れるconnect — サーバーへ接続する
5send / recv — データをやり取りsend / recv — データをやり取り
6close — ソケットを閉じるclose — ソケットを閉じる

ポイントは accept が新しいソケットを返すことです。待ち受け用のソケットはそのまま次の接続を待ち、実際の通信は接続ごとに生まれた別のソケットが担当します。これにより1つのサーバーが多数のクライアントを同時に相手にできます。

TCPソケットとUDPソケット

ストリームソケットデータグラムソケット
使うプロトコルTCP[[UDP]]
接続事前に接続を確立する接続不要でいきなり送る
順序と到達保証される保証されない
向いている用途Web、ファイル転送、メール音声・動画、ゲーム、DNS

信頼性が必要なら TCP、速度と軽さを優先するなら UDP という使い分けになります。

身近な例

Node.js で TCP サーバーを立てると、ソケットの姿がそのまま見えます。

import net from 'node:net';

const server = net.createServer((socket) => {
  socket.write('hello\n'); // 接続ごとに socket が1つ渡される
  socket.on('data', (chunk) => console.log(chunk.toString()));
});

server.listen(8080); // ポート8080で待ち受け

普段書いている [[HTTP]] のリクエストも、内部ではこのソケット通信の上に組み立てられています。ライブラリが隠してくれているだけで、土台は同じです。

初学者向けポイント

  • 「Address already in use」エラーは、そのポートを別のプロセスが既に bind している合図です
  • 使い終わったら必ず close します。閉じ忘れるとファイルディスクリプタを食い潰し、新規接続を受けられなくなります
  • 通信はバイト列の流れであって、送った単位で届くとは限りません。TCP では1回の send が2回に分かれて届くこともあり、区切り(改行や長さヘッダ)は自分で決める必要があります

関連技術とのつながり

  • [[TCP/IP]] — ソケットはTCP/IPの機能をプログラムから使うための窓口
  • [[UDP]] — データグラムソケットが使うプロトコル。軽量だが到達保証はない
  • [[ポート番号]] — ソケットはIPアドレスとポート番号の組で識別される
  • [[WebSocket]] — HTTP上で双方向通信を実現する仕組み。ソケットの手触りをWebに持ち込んだもの
  • [[HTTP]] — 内部的にはTCPソケットの上でやり取りされている
  • [[並行処理と非同期]] — 多数の接続を同時に相手にするための実装手段(スレッド方式・イベントループ)
Q: ソケットを識別するために使う組み合わせはどれ?
- [x] IPアドレスとポート番号
- [ ] ドメイン名とMACアドレス
- [ ] ユーザー名とパスワード
解説: ソケットは「どのコンピュータの、どのアプリか」をIPアドレスとポート番号の組で特定します。

Q: TCPサーバー側の手順として正しい並びはどれ?
- [ ] socket → connect → send
- [x] socket → bind → listen → accept
- [ ] listen → socket → close
解説: サーバーはソケットを作り、自分のIP/ポートに bind し、listen で待ち受け、accept で接続を受け入れます。connect はクライアント側の操作です。

Q: データグラムソケット(UDP)の特徴はどれ?
- [ ] 到達順序と再送が保証される
- [x] 接続を確立せずに送れるが到達は保証されない
- [ ] 必ず暗号化される
解説: UDPを使うデータグラムソケットは接続不要で軽量ですが、順序や到達の保証はありません。