こんにちは、かつコーチです。
「IPアドレスで通信相手の場所はわかった。でも、1台のサーバーでWebもメールも動いているのに、どうやって通信を仕分けているんだろう」。
そんな疑問に答えるのがポート番号です。
この記事では、ポート番号の役割や範囲、実際にコマンドで確認する方法を初心者向けに解説します。
仕組みを理解すると、開発中の「Address already in use」エラーにも落ち着いて対処できるようになります。
ポート番号とは?
マンションの部屋番号のような仕組み
ポート番号とは、1台のコンピュータの中で、どのアプリケーションが通信を受け取るかを識別するための番号です。
0〜65535の範囲の数字で表されます。
イメージしやすいように、マンションに例えてみましょう。
IPアドレスが「マンションの住所」だとすると、ポート番号は「何号室か」を示す部屋番号にあたります。
郵便物が住所だけで届いても、部屋番号がなければどの住人に渡せばいいかわかりません。
同じように、通信データがIPアドレスだけでサーバーに届いても、ポート番号がなければどのアプリケーション(プログラム)に渡せばいいかわかりません。
なぜポート番号が必要なのか
1台のサーバーは、多くの場合Webサーバー・メールサーバー・データベースなど、複数のアプリケーションを同時に動かしています。
すべてが同じIPアドレスを共有しているため、IPアドレスだけでは「どの通信をどのアプリに渡すか」を区別できません。
そこでポート番号を組み合わせることで、同じ住所(IPアドレス)の中でも「何号室(ポート番号)宛てか」を明確にし、通信を正しく仕分けられるようにしています。
代表的なポート番号と確認方法
よく使われるポート番号(Well-Knownポート)
0〜1023番はWell-Knownポートと呼ばれ、代表的なサービスに割り当てが決まっています。
| ポート番号 | 用途 |
|---|---|
| 80 | HTTP(Webサイトの通信) |
| 443 | HTTPS(暗号化されたWeb通信) |
| 22 | SSH(リモートログイン) |
| 3306 | MySQL |
| 5432 | PostgreSQL |
たとえば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アドレスに変換する仕組み」を読んでみてください。
タグ: ネットワーク, 初心者向け, ポート