【ネットワーク】ポート番号とは?1台の機器で複数の通信を扱う仕組み

ネットワーク

こんにちは、かつコーチです。

「IPアドレスで通信相手の場所はわかった。でも、1台のサーバーでWebもメールも動いているのに、どうやって通信を仕分けているんだろう」。
そんな疑問に答えるのがポート番号です。
この記事では、ポート番号の役割や範囲、実際にコマンドで確認する方法を初心者向けに解説します。
仕組みを理解すると、開発中の「Address already in use」エラーにも落ち着いて対処できるようになります。

ポート番号とは?

マンションの部屋番号のような仕組み

ポート番号とは、1台のコンピュータの中で、どのアプリケーションが通信を受け取るかを識別するための番号です。
0〜65535の範囲の数字で表されます。

イメージしやすいように、マンションに例えてみましょう。
IPアドレスが「マンションの住所」だとすると、ポート番号は「何号室か」を示す部屋番号にあたります。
郵便物が住所だけで届いても、部屋番号がなければどの住人に渡せばいいかわかりません。
同じように、通信データがIPアドレスだけでサーバーに届いても、ポート番号がなければどのアプリケーション(プログラム)に渡せばいいかわかりません。

なぜポート番号が必要なのか

1台のサーバーは、多くの場合Webサーバー・メールサーバー・データベースなど、複数のアプリケーションを同時に動かしています。
すべてが同じIPアドレスを共有しているため、IPアドレスだけでは「どの通信をどのアプリに渡すか」を区別できません。
そこでポート番号を組み合わせることで、同じ住所(IPアドレス)の中でも「何号室(ポート番号)宛てか」を明確にし、通信を正しく仕分けられるようにしています。

代表的なポート番号と確認方法

よく使われるポート番号(Well-Knownポート)

0〜1023番はWell-Knownポートと呼ばれ、代表的なサービスに割り当てが決まっています。

ポート番号用途
80HTTP(Webサイトの通信)
443HTTPS(暗号化されたWeb通信)
22SSH(リモートログイン)
3306MySQL
5432PostgreSQL

たとえばhttps://example.comにアクセスするとき、実際には裏側で443番ポート宛ての通信が行われています。
普段ポート番号を意識しないのは、ブラウザが用途ごとの標準ポート番号を自動的に補ってくれているからです。

curlでポート番号を指定してアクセスする

ポート番号は明示的に指定することもできます。

# 標準ポート(80番)を省略した場合
curl http://example.com

# ポート番号を明示的に指定した場合
curl http://example.com:80

この2つは同じ結果になります。
一方、開発環境でよく使う8080番などの独自ポートでは、番号の指定を省略できません。

# ローカル開発サーバー(8080番ポート)にアクセスする例
curl http://localhost:8080

使用中のポートを確認するコマンド

自分のPCでどのポートが使われているかは、次のコマンドで確認できます。

# macOS/Linuxで特定のポートを使っているプロセスを調べる
lsof -i :3000
# 開いているポート一覧を確認する
netstat -an | grep LISTEN

よくあるつまずきポイント・エラー対処

「Address already in use」エラーで開発サーバーが起動しない

❌Before(つまずいた実例)

開発中、Node.jsのローカルサーバーを何度も再起動していたときに、次のエラーに遭遇しました。

$ npm run dev
Error: listen EADDRINUSE: address already in use :::3000

原因を調べずに再起動を繰り返し、しばらく困っていました。

✅After(解決方法)

lsofコマンドで3000番ポートを使っているプロセスを特定し、そのプロセスを終了させたところ、正常に起動できました。

# 3000番ポートを使っているプロセスIDを確認する
lsof -i :3000
# COMMAND   PID   USER   ...
# node    12345  katsu   ...

# プロセスIDを指定して終了させる
kill -9 12345

このエラーは、前回のサーバーが正常終了せず、ポートを解放できないまま残ってしまうことが原因です。
「ポート番号は1つのアプリケーションしか使えない」という仕組みを理解していれば、エラーメッセージを見た瞬間に対処法を思いつけるようになります。

応用・一歩先の使い方

Dockerでのポートマッピング

Dockerでコンテナを使う場合、コンテナ内部のポートとホスト側のポートを紐付けるポートマッピングという考え方が登場します。

# ホストの8080番をコンテナ内の80番に紐付ける
docker run -p 8080:80 nginx

これは「マンションの外階段(ホスト側の8080号室)から、内部の共用ポスト(コンテナ内の80号室)につながる専用通路を作る」ようなイメージです。
コンテナという別の建物の中の部屋番号を、外部からアクセスできるように橋渡ししています。

エフェメラルポートという仕組み

自分のPCがサーバーに接続するとき、実は自分側にも一時的なポート番号(エフェメラルポート、多くは49152〜65535番)が割り当てられています。
1つのIPアドレスから同時に複数のWebサイトを開けるのは、このエフェメラルポートによって、それぞれの通信が別の部屋番号として区別されているためです。

まとめ

この記事のポイント

  • ポート番号は、1台の機器の中でどのアプリケーションが通信を受け取るかを識別する番号(0〜65535)
  • IPアドレスが「住所」なら、ポート番号は「部屋番号」にあたる
  • 80番はHTTP、443番はHTTPS、22番はSSHなど、代表的な用途にはWell-Knownポートが割り当てられている
  • 「Address already in use」エラーは、lsof -i :ポート番号でプロセスを特定し解決できる

次に読むべき記事

ポート番号の仕組みがわかったら、次はドメイン名の裏側を支える「DNSとは?ドメイン名をIPアドレスに変換する仕組み」を読んでみてください。

タグ: ネットワーク, 初心者向け, ポート

タイトルとURLをコピーしました