Mímisbrunnr知恵の泉

← コンピュータネットワーク 一覧

🎓 レベル:基礎 | 重要度:A(必須) 📎 前提:UDP

要点(BLUF)

なぜポートが要るのか

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〜1023well-known(システム)標準サービス(HTTP・SSH等)
1024〜49151登録済みアプリ固有(DBなど)
49152〜65535動的/エフェメラルクライアントが一時的に使う

覚えておきたい代表的なwell-knownポート:

ポートプロトコルL4
20/21FTP(データ/制御)TCP
22SSHTCP
23TelnetTCP
25SMTPTCP
53DNSUDP/TCP
67/68DHCPUDP
80HTTPTCP
443HTTPSTCP
123NTPUDP
161SNMPUDP

ソケット: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:*

他層との関係(境界)

ソケットをプログラムから操作するAPIsocket()bind()connect())はOSの機能で、コンピュータ基礎分野で扱います。ここでは「ポートが多重化を担い、ソケットが端点を表す」というネットワーク側の役割に絞ります。

なぜサーバは固定ポートなのか(設計の直観)

クライアントは「Webが欲しい=443へ行けばよい」と事前に知っている必要があります。サーバ側が毎回違うポートで待つと、相手は見つけられません。だからサービス側は約束された固定ポートで待ち受け、接続を仕掛ける側は一時ポートで構いません。電話の代表番号(固定)と、かける側の電話番号(任意)の関係に似ています。

⚠️ よくある誤解

対応 lab

関連