ソケット そけっと
ソケットsocketIPアドレスポート番号TCPAPI
ソケットについて教えて
簡単に言うとこんな感じ!
アプリケーションがネットワーク通信をするための「差し込み口(コンセント)」みたいなものだよ。IPアドレスとポート番号を組み合わせた通信の端点で、プログラムはソケットを通じてデータを送受信するんだ!
ソケットとは
ソケット(Socket)は、ネットワーク通信を行うためのプログラムインターフェースおよびその端点です。具体的にはIPアドレスとポート番号の組み合わせで表現される通信の「窓口」であり、アプリケーションはOSが提供するソケットAPIを通じてネットワーク通信を行います。
TCP通信では、通信を一意に識別するために5つの要素が使われます:プロトコル(TCP)、送信元IPアドレス、送信元ポート番号、宛先IPアドレス、宛先ポート番号。この5-tupleがソケットペアを定義します。
ソケットはもともとUNIXの概念で、1983年にBSD UNIXで導入されました。現在ではLinux・macOS・Windowsなどすべての主要OSが「Berkeley Sockets API(BSD Socket API)」互換のインターフェースを提供しており、プログラミング言語を問わずネットワーク通信の標準的な方法として使われています。
ソケットの種類
| 種類 | 説明 | 使用プロトコル |
|---|---|---|
| ストリームソケット | 信頼性ある双方向バイトストリーム | TCP |
| データグラムソケット | 非接続型の独立したメッセージ | UDP |
| RAWソケット | IPレベルで直接アクセス | IP (ICMP等) |
| UNIXドメインソケット | 同一ホスト内のプロセス間通信 | - |
歴史と背景
- 1983年:4.2BSD UNIXでBerkeley Socketsが初めて実装
- 1988年:Winsock(Windows向けSocket API)の元となる仕様が議論される
- 1993年:Windows NT 3.1でWinsock 1.0がサポートされる
- 1996年:IPv6対応のSocket APIが追加(getaddrinfo等)
- 現在:Python・Node.js・Javaなど主要言語のネットワークライブラリはすべてSocketをベースにしている
TCPサーバーとクライアントのソケット通信フロー
Pythonでの簡単なソケット例
import socket
# TCPソケットの作成
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 接続(IPアドレスとポート番号の指定)
s.connect(("example.com", 80))
# データ送信
s.send(b"GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
# データ受信
data = s.recv(1024)
s.close()
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 793 | TCP(ソケット通信の基盤) |
| RFC 3493 | IPv6用ソケット拡張API |
| POSIX.1-2008 | ソケットAPIの標準規格 |
関連用語
- ポート番号 — ソケットの構成要素
- TCP — ストリームソケットで使うプロトコル
- UDP — データグラムソケットで使うプロトコル
- 3ウェイハンドシェイク — ソケット接続確立の詳細