TCP/UDPの仕組み

ソケット そけっと

ソケット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サーバーとクライアントのソケット通信フロー

サーバー側 クライアント側 socket() ソケット作成 bind() アドレス割当 listen() 接続待機 accept() 接続受付 send/recv() 通信 socket() ソケット作成 connect() 接続要求 send/recv() 通信 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 793TCP(ソケット通信の基盤)
RFC 3493IPv6用ソケット拡張API
POSIX.1-2008ソケットAPIの標準規格

関連用語