TCP/UDPポート番号体系とソケット枯渇(Port Exhaustion)完全解説
トランスポート層のポート多重化、IANAによる3大ポート分類、TCP 4-Tuple接続の仕組み、マイクロサービスでのTIME_WAIT蓄積とエフェメラルポート枯渇対策を解説します。
ポート番号一覧リファレンス
データをサーバーに送信せず、すべてブラウザ内で安全に検証・実行できます。
TCP/IPネットワークにおけるポート多重化(Multiplexing)の役割
TCP/IPネットワークモデルにおいて、IPアドレス(第3層・ネットワーク層)はインターネット上に存在する物理的または仮想的なホストマシンを識別します。しかし現代のサーバーやPCでは、1台のマシンの中でWebサーバー(Nginx)、データベース(PostgreSQL)、SSHデーモンなど、数多くのプロセスが同時に通信を行っています。
届いたパケットをどのアプリケーションプロセスに引き渡すべきかを識別するために、トランスポート層(第4層)に導入された番号体系がポート番号(Port Number)です。ポートは16ビットの符号なし整数(0〜65535)で表され、IPアドレスとポート番号の組み合わせによって一意な通信終端であるソケット(Socket)が形成されます。
IANAによる公式な3大ポート区分
インターネットの標準番号を管理するIANAは、65,536個のポート空間を用途に応じて3つの領域に分類しています:
- ウェルノウンポート(Well-Known Ports, 0 〜 1023): 基本的なインターネット標準プロトコルに事前割り当てされているポートです(HTTP 80, HTTPS 443, SSH 22, DNS 53, SMTP 25)。Unix系OSでは、セキュリティ上の理由から特権(
rootやCAP_NET_BIND_SERVICE)を持つプロセスのみがバインドできます。 - 登録済みポート(Registered Ports, 1024 〜 49151): 特定のアプリケーションやミドルウェア向けにIANAに登録されているポートです(PostgreSQL 5432, MySQL 3306, Redis 6379, MongoDB 27017)。
- 動的・エフェメラルポート(Dynamic/Ephemeral Ports, 49152 〜 65535): クライアントが外部サーバーへのアウトバウンド接続を開始する際に、OSカーネルが一時的に割り当てるポートです。
TCP 4-Tupleとサーバーの大規模同時接続の仕組み
初学者が陥りやすい誤解に、「Webサーバーのポートは443番の1つだけなので、同時に接続できるクライアントは最大65,535台までだ」というものがあります。実際のTCP接続は、単一のポートではなく4-Tuple(4要素の組み合わせ)によって一意に識別されます:
{ 送信元IP, 送信元ポート, 送信先IP, 送信先ポート }
サーバー側の送信先IPとポート(例: 203.0.113.1:443)が同一であっても、アクセスしてくる全世界のクライアントのIPと、クライアント側が一時的に開いた送信元ポートの組み合わせはすべて固有です。そのため、サーバーのメモリとファイルディスクリプタの上限が許す限り、単一のポートであっても数十万〜数百万の同時TCPソケットを維持できます。
マイクロサービスの障害要因:エフェメラルポート枯渇とTIME_WAITソケット
外部からのアクセスを受け付けるサーバー側とは対照的に、他のAPIを頻繁に呼び出すクライアント側のバックエンドではエフェメラルポート枯渇(Port Exhaustion)が頻発します:
コネクションプーリング(HTTP Keep-Alive)を使わずに毎秒数千回のリクエストを送信して即座に切断すると、その都度OSのローカルポートが消費されます。TCP規格では、遅れて届いたパケットが次回の接続と混同されるのを防ぐため、切断後のソケットを1〜2分間TIME_WAIT状態で保持します。
大量リクエスト下では、Linuxのデフォルト範囲(約28,000個)のエフェメラルポートが瞬時にすべてTIME_WAITで埋まり、EADDRNOTAVAIL: Cannot assign requested address例外が発生してサーバー間通信が完全に麻痺します。この問題はHTTPクライアントの接続プーリングを適切に設定することで解決できます。
# Linuxシステムで利用可能なエフェメラルポート範囲の確認
cat /proc/sys/net/ipv4/ip_local_port_range
# 出力例: 32768 60999 (約28,000個のポートが利用可能)
# 現在TIME_WAIT状態にあるソケット数の監視
ss -tan state time-wait | wc -l
# ソケットの再利用を有効化(sysctl.confのチューニング)
net.ipv4.tcp_tw_reuse = 1ポートセキュリティと運用のベストプラクティス
0.0.0.0ではなく127.0.0.1にバインドする: Redisや社内データベースなどの内部通信用サービスは、絶対にグローバル公開インターフェースに開かず、localhostやプライベートVPC内IPにのみバインドします。- ファイアウォールによるデフォルト遮断(Default-Deny): 必要な80/443ポート以外はインバウンドを原則すべて遮断します。
- DevUtils Port Numbersツールでポート番号を確認: アプリケーション開発時のポート競合を防ぐため、DevUtilsのPort Numbers検索ツールで予約済みポート一覧を事前に確認しましょう。
ポート番号一覧リファレンス
主要TCP/UDPポート番号とサービス名の検索リファレンス。