今日は、ポート番号は、「部屋番号のような...」という説明に終止符を打ちにきました。
職種の都合上、エンジニアの面接をよく行うのですが、ポート番号という基本知識ですら、「マンションの部屋番号みたいな...」というレベルの回答しか答えられない人がほとんどです。
たしかに、部屋番号という例えは、イメージしやすいですが、実際の仕組みや重要性を理解することなく、ふわっと理解したのままでは、具体的なポートフォワーディングの設定を組むときや、実際のポートを設定する際に戸惑うことでしょう。
そこで、本記事では、ポート番号の本質をより深く掘り下げ、その役割や仕組み解説し、二度と「部屋番号のような...」という回答をなくしてもらう目的で書きました。
IPアドレスとの関連付け
ポート番号を理解するためには、IPアドレスとの関係を明確にする必要があります。IPアドレスは、インターネットやローカルネットワーク内でデバイスを識別する住所のような役割を果たしています。
しかし、IPアドレスだけでは、送られてきた様々な種類のデータが、サーバー内のどのアプリケーションやサービスがデータを処理すべきかまで判断できません。
たとえば、1つのコンピュータが複数のサービスを同時に提供している場合を考えてみましょう。
Webサーバー、メールサーバー、ファイル転送サーバー(FTP)などが同じIPアドレス上で動作していることがあります。このような状況で、データがどのサービスに向けられるべきかを区別するのがポート番号です。
OSI参照モデル上の区分け
OSI参照モデルでも、以下のように区分けされています。
- IPアドレス:第3層ネットワーク層
- ポート番号:第4層トランスポート層
ポート番号がなかった場合どうなるのか?
技術の本質を掴むためには、「その技術の必要性(もしも、その技術がなかったらどうなるのか?)」を考える必要があります。
-
複数のサービスが混同される
一つのIPアドレス上で複数のサービスが稼働している場合、ポート番号がなければ、どのサービスにデータを届けるべきかわからなくなります。例えば、同じIPアドレスに対してWebサービス(HTTP)とメールサービス(SMTP)が動作していた場合、どちらがリクエストを処理するべきかを判断する手段がなくなります。 -
ネットワークを介するときには、1つのサーバーで1サービスしか動かせない
結果として、各デバイスが一つのサービスしか提供できない状況に陥ります。
プロセスとの関連付け
ポート番号は、コンピュータ内のプロセスとの関連付けを行います。
プロセスとは何か?
プロセスとは、コンピュータ上で実行されているプログラムやサービスの単位です。たとえば、Webブラウザを開いているとき、そのブラウザはプロセスとして動作しています。同様に、音楽を再生するアプリやチャットアプリもそれぞれ別のプロセスとして存在しています。
ポート番号がプロセスにどう関連付けられるのか?
ポート番号は、オペレーティングシステムの内部で特定のプロセスと紐づきます。
Webページ(http://example.com)にアクセスする時の具体例を示します。
- Webサーバー側は、Apache(Nginx等)を起動します
- Webサーバー側で、Apacheのプロセスが起動します
- 起動時に、OSがApacheのプロセスをポート番号80番と紐づけます
- クライアントから、ポート番号80番を介して、Webサーバーに通信が届きます
- Webサーバーは、80番に紐づくプロセス宛へデータを送信します
ここまでが通信の基本です。次に、ウェルノウンポートの話をします。
ウェルノウンポート番号とエフェメラルポート番号
ポート番号は、2つに分類されます。
ウェルノウンポート番号
ウェルノウンポート番号は、0番から1023番までの範囲で、特定のサービスに標準的に割り当てられています。この割り当ては、IANA(Internet Assigned Numbers Authority)によって管理されています。
ただし、ウェルノウンポート番号は、ネットワークを介した通信の際に、強く推奨されるべき番号であり、HTTPへのアクセスを5050番や8080番のようなポート番号で起動することも可能です。
- HTTP(80番):Webサーバーへのリクエストに使用
- HTTPS(443番):セキュアなWeb通信
- FTP(21番):ファイル転送プロトコル
エフェメラルポート番号
一時的に使用されるポート番号で、1024番から65535番の範囲に含まれます。クライアント側がサーバーとの通信を確立する際、OSが動的に割り当てます。この仕組みは、同じクライアントが複数の接続を並行して処理する場合に非常に有用です。
特徴:
- 範囲:多くのOSでは49152番から65535番がデフォルト
- 動的管理:OSが通信終了後に自動解放
- 利便性:一時的な接続用として効率的
たとえば、Webブラウザが、Webサーバーにアクセスする場合、サーバー側ではウェルノウンポート番号(例:80番)が使用されますが、クライアント側ではエフェメラルポート番号が動的に割り当てられます。これにより、同じクライアントが複数のリクエストを同時に処理可能になります。
まとめ
ポート番号は、単なる「部屋番号のようなもの」ではありません。IPアドレスとは明確な機能の差があり、コンピュータ内では、プロセスと紐づくものなのです。
ポート番号は、「部屋番号のような...」という説明はもうやめましょう!
私は、このような基本的な知識を理解することを「基礎概念」を理解すると定義しています。「基礎概念」については、こちらの記事で解説しております。興味のある方は読んでみてください。