🎓 レベル:基礎 | 重要度:A(必須) 📎 前提:UDP
要点(BLUF)
- ポート番号(0〜65535)は、1台のホスト上で動く多数のアプリを区別するための番号です。
- サーバ側は決まった番号(well-knownポート)で待ち受け、クライアント側は一時的な番号(動的ポート)を使います。
- 通信は「送信元IP・送信元ポート・宛先IP・宛先ポート・プロトコル」の5つ組(5-tuple)で一意に識別されます。
なぜポートが要るのか
1台のPCで、ブラウザ・メール・ビデオ会議が同時に通信します。IPアドレスは1つしかないのに、どの応答をどのアプリへ渡せばよいか——これを解くのが**ポートによる多重化(multiplexing)**です。トランスポート層は宛先ポートを見て、正しいアプリへデータを振り分けます。
graph TD IP["1つのIP: 192.168.1.10"] IP --> P80["ポート443 → ブラウザ"] IP --> P25["ポート25 → メール送信"] IP --> P53["ポート53 → DNS"]
ポート番号の区分
| 範囲 | 区分 | 用途 |
|---|---|---|
| 0〜1023 | well-known(システム) | 標準サービス(HTTP・SSH等) |
| 1024〜49151 | 登録済み | アプリ固有(DBなど) |
| 49152〜65535 | 動的/エフェメラル | クライアントが一時的に使う |
覚えておきたい代表的なwell-knownポート:
| ポート | プロトコル | L4 |
|---|---|---|
| 20/21 | FTP(データ/制御) | TCP |
| 22 | SSH | TCP |
| 23 | Telnet | TCP |
| 25 | SMTP | TCP |
| 53 | DNS | UDP/TCP |
| 67/68 | DHCP | UDP |
| 80 | HTTP | TCP |
| 443 | HTTPS | TCP |
| 123 | NTP | UDP |
| 161 | SNMP | UDP |
ソケット:IPとポートの組
ソケットは「IPアドレス+ポート番号」の組で、通信の端点を表します。1本のTCPコネクションは、両端のソケットの組で識別されます。
# 5-tuple がコネクションを一意に識別することを示す擬似例
conn = {
"src_ip": "192.168.1.10", "src_port": 51514,
"dst_ip": "93.184.216.34", "dst_port": 443,
"proto": "TCP",
}
key = (conn["proto"], conn["src_ip"], conn["src_port"],
conn["dst_ip"], conn["dst_port"])
print("connection key:", key)
print("同じサーバへの2本目は src_port だけ変えれば別コネクション")
key2 = (conn["proto"], conn["src_ip"], 51515,
conn["dst_ip"], conn["dst_port"])
print("second connection:", key2)
print("distinct:", key != key2)
実行結果:
connection key: ('TCP', '192.168.1.10', 51514, '93.184.216.34', 443)
同じサーバへの2本目は src_port だけ変えれば別コネクション
second connection: ('TCP', '192.168.1.10', 51515, '93.184.216.34', 443)
distinct: True
同じサーバの同じポート(443)へ複数タブで接続できるのは、クライアント側の送信元ポートが異なるため、5-tupleが別物になるからです。
実機での確認(Linux)
# 待ち受け中のポートと接続を見る
ss -tuln
# 例: tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
他層との関係(境界)
ソケットをプログラムから操作するAPI(socket()・bind()・connect())はOSの機能で、コンピュータ基礎分野で扱います。ここでは「ポートが多重化を担い、ソケットが端点を表す」というネットワーク側の役割に絞ります。
なぜサーバは固定ポートなのか(設計の直観)
クライアントは「Webが欲しい=443へ行けばよい」と事前に知っている必要があります。サーバ側が毎回違うポートで待つと、相手は見つけられません。だからサービス側は約束された固定ポートで待ち受け、接続を仕掛ける側は一時ポートで構いません。電話の代表番号(固定)と、かける側の電話番号(任意)の関係に似ています。
⚠️ よくある誤解
- 「ポートはIPの一部」ではない。IPはL3(どのホストか)、ポートはL4(そのホストのどのアプリか)。層が違います。
- 「同じポートには1接続だけ」ではない。サーバの443には同時に何千もの接続が来ます。区別は5-tuple(特にクライアント側ポート)で行われます。
- 「ポート番号はアプリが自由に決める」ではない。well-known帯(0〜1023)は標準で予約され、待ち受けには管理者権限が要ります。
対応 lab
[[networking-study/labs/04-03_socket_tuple.py]]— 5-tupleによるコネクション識別
関連
- 前:
[[04-02_UDP]]/章ハブ:[[04-00_トランスポート層_目次]] - ポートを使うアプリ群:
[[05-02_HTTP_HTTPS]]/[[05-04_メール・ファイル転送等]]/ポート制御:[[07-02_ACL]]