ソケット通信
ソケットとは
ソケット(socket)は、プログラムがネットワーク通信を行うための出入口となる仕組みです。「差込口」を意味し、電源コンセントのように「ここに繋げば通信できる」窓口を提供します。OS が用意する API であり、アプリケーションは複雑な [[TCP/IP]] の処理を自分で書かずに「ソケットを作る」「データを書き込む」「読み出す」といった操作だけで通信できます。ファイルの読み書きとよく似た手触りで扱えるのが特徴です。
ソケットは IPアドレス+ポート番号の組で識別されます。「どのコンピュータの、どのアプリか」をこの2つで特定するわけです([[ポート番号]] を参照)。
サーバー側とクライアント側の流れ
TCP を使う場合、両者の手順は次のように非対称です。
| 手順 | サーバー側 | クライアント側 |
|---|---|---|
| 1 | socket — ソケットを作る | socket — ソケットを作る |
| 2 | bind — 自分のIP/ポートに紐づける | — |
| 3 | listen — 接続待ち受け開始 | — |
| 4 | accept — 接続要求を受け入れる | connect — サーバーへ接続する |
| 5 | send / recv — データをやり取り | send / recv — データをやり取り |
| 6 | close — ソケットを閉じる | 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を使うデータグラムソケットは接続不要で軽量ですが、順序や到達の保証はありません。