1. はじめに|抱いた疑問
以前まで、私は「ポートは PC が外部システムと通信する際の接続口」といった理解をしていました。
しかし、アプリを作る中で、Localhost という PC 内部への接続が発生するので、理解に矛盾が生じました。
さまざまなWebサイトを探してみましたが、ポートの所在地について網羅されて説明されているサイトが見当たらなかったため、その調査結果を整理しました。
2. 対象読者
- 「ポートは PC と外部システムとの通信する際の接続口」と理解している人
- 「PC とネットワークの境界にポートが存在する」と考えている人
- Docker やインフラ管理などを行い、ポートの管理を行う人
3. 結論
ポートは「OS・サーバと接続する際に使用されるOS・サーバの接続口」です。
私のアプリとポートの関係性を図解すると下記の通りとなります。
4. 【間違い】当初の理解
当初、私は「ポートは PC と外部システムとの通信する際の接続口」程度の理解だったため、絵にすると下記のように理解していました。
そのため、MySQL をインストールすると、接続する際のイメージは下記の通りになります。
この絵を描いた際に、何かおかしいとを感じました。
おかしいと感じた点は下記です。
4-1. おかしいと考えた 2 つの点
おかしい点①localhost ってインターネットに接続していなくても動くのに、この絵だとインターネット上に出て行っている
「ポートは外部システムとのやりとりをするための接続口」という理解をしていると、一度、通信が PC 外部に出ていく必要があります。
ただ、アプリを localhost で動かしてみるとわかる通り、ローカルサーバを利用する場合、インターネット接続をしていなくても、接続できるんですよね。。
だから、PC から外に矢印が伸びているのはおかしいと考えました。
おかしい点②そもそもPCの境界って何?ハードウェアの境界ってPCケースじゃない?
「PC とネットワークの境界にポートが存在する」と考えていると、「境界って何ですか?」という質問に回答することができません。
普通に考えると、境界は PC ケースとなります。PC ケースが通信の接続口となるポートとなるわけがないからです。
4-2. 上記おかしい点が生む更なる疑問点→より細かい視点を持つ必要性
おかしい点①・②を見ると、PC 内部で接続が行われていると考えるのが順当です。
そうすると、登場人物は、PC ではなく、PC の中の複数の何かであることがわかります。(登場人物は誰か)
そして、その登場人物たちがどのように接続しているかを明らかにするべきです。(登場人物の関係性)
私はこの「登場人物は誰か」と「登場人物の関係性」についてを調べました。
5.現在の理解
私の現在の理解はこちらです。
- 登場人物は、「OS」と「サーバ」
- (プロトコル名)://(ホスト名):(ポート番号) の形で「接続先」を指定する
- 「接続元」のポート番号は自動的に決まる
5-1. 登場人物は、「OS」と「サーバ」
登場人物は、「OS」と「サーバ」です。OSはサーバから情報を受け取ったり、演算をしたりします。一方、サーバは情報を渡したり、受け取ったりします。
処理では接続してデータの受け渡しを行うわけですから、順当に考えると、この 2 人がポートを所持していると考えられます。
5-2. (プロトコル名)://(ホスト名):(ポート番号) の形で「接続先」を指定する
接続する際、「(プロトコル名)://(ホスト名):(ポート番号) 」の形で接続方法・場所を指定します。
5-3. 「接続元」のポート番号は自動的に決まる
http 通信で使用する 80 番ポートはあくまで「接続先」のポート番号です。そのため、接続元のポート番号ではありません。
接続元のポートは、「エフェメラルポート」という用途が決まっていないポートから自動的に決められます。
この送信元ポート番号と宛先ポート番号はネットサーフィンをしたり、メールを受信したり、FTPでコンテンツをアップロード[ダウンロード] したり、つまりなんらかの通信が発生した時点で必ずセットされるもので、例えば、特定のWebページを閲覧した場合には送信元ポート番号に25456番がセットされ、宛先ポート番号に80番がセットされるようになります。この25456番という数字は常にこの番号を使用すると言うわけでもなく上記で述べたようにランダムな値がセットされるようになります。
ポート番号とは?|Server Architecture for Windows
※ 逆に、用途が決まっているポート番号(例えば、http通信の 80 番ポート、SSH 通信の 22 番ポートなど)は「ウェルノウンポート」と言います。
※おまけ 私のアプリでの実例
私のアプリでは Docker を利用していますので、ポート番号の関係性は上記の通りとなる理解です。
おわりに
最後までお読みいただきありがとうございました。
本記事は正確な内容となるように、可能な限り、調査・表現をしていますが、誤植などが含まれる可能性がございます。
もし、お気づきになられた場合には、ご指摘いただけますと幸いです。