MySQL を立ち上げると 3306、PostgreSQL を立ち上げると 5432。
普段は何となく受け入れているポート番号ですが、ふと「この数字って誰がどう決めたんだろう」と気になりました。80 や 443 のように標準っぽい番号もあれば、3000 や 8080 のようにローカル開発でよく見る番号もあります。
そこで、MySQL と PostgreSQL を入口に、データベース、HTTP、開発サーバーまわりのポート番号について、公式ドキュメントや IANA の登録情報を中心に調べてみました。
先にざっくりまとめると、ポート番号には大きく二つのタイプがありそうです。
ひとつは、HTTP の 80、HTTPS の 443、FTP の 20/21、SSH の 22、SMTP の 25 のように、標準仕様や IANA 登録と強く結びついている番号です。このあたりは「現在その番号を使う理由」が比較的はっきりしています。
もうひとつは、MySQL の 3306、PostgreSQL の 5432、Tomcat の 8080、Rails や Next.js の 3000、Flask の 5000、Django の 8000、Jupyter の 8888 のように、製品やツールのデフォルト設定として定着した番号です。こちらは、現在のデフォルト値は公式に確認できても、「なぜその数字が選ばれたのか」までは文書化されていないことが多いようでした。
まず、ポート番号はどう管理されているのか
ポート番号は IANA によって管理されています。RFC 6335 では、ポート番号は大きく次の三つに分けられています。
| 範囲 | 名前 | 用途のイメージ |
|---|---|---|
| 0-1023 | System Ports | HTTP、SSH、DNS などの標準的なサービス |
| 1024-49151 | User Ports | アプリケーションやサービスが登録して使う領域 |
| 49152-65535 | Dynamic / Private Ports | 一時的・私的に使う領域 |
Linux などの Unix 系 OS では、1024 未満のポートに bind するには特権が必要、という扱いが長くあります。いわゆる「特権ポート」です。
この制約を考えると、8080、3000、5000、8000、8888 のような高番ポートがローカル開発やアプリケーションサーバーで好まれたのは、かなり自然に見えます。root 権限なしでサーバーを立てられるからです。
ただし、ここで注意したいのは、IANA に登録されていることと、あるソフトウェアがデフォルトで使うことは別だという点です。
たとえば 3000 は、Web 開発ではおなじみの番号ですが、IANA 上で「Web 開発用ポート」として登録されているわけではありません。Oracle Database の 1521 も、Oracle 製品では長くデフォルトリスナーポートとして扱われていますが、IANA 上の名義は Oracle ではありません。Kubernetes API Server の 6443 も、Kubernetes では既定値としてよく使われますが、IANA 上では Kubernetes 用の登録ではありません。
つまり、現場で強く定着している番号でも、IANA 上の名義と一致するとは限らないようです。
MySQL の 3306 はどこまで分かるのか
MySQL について公式に確認できるのは、classic MySQL protocol のデフォルトポートが 3306 である、ということです。MySQL の公式ドキュメントでも 3306 は既定値として扱われていますし、IANA のレジストリでも 3306 はmysql として登録されています。
IANA の登録情報を見ると、assignee/contact には Monty の名前が出てきます。MySQL の作者である Michael "Monty" Widenius に紐づく登録だと見てよさそうです。
ただ、肝心の「なぜ 3306 なのか」については、今回調べた一次資料の範囲でははっきりした説明を見つけられませんでした。
よくある話として、「3305 の次に空いていたから 3306 になった」という説明を見かけることがあります。もっともらしくはあるのですが、少なくとも今回見た MySQL 公式ドキュメントや IANA の登録情報だけでは、その説明を断定するのは難しそうです。
なので、MySQL 3306 については次のくらいに整理するのが安全そうです。
| 観点 | 見方 |
|---|---|
| MySQL のデフォルトか | 公式に確認できる |
IANA に mysql として登録されているか | 確認できる |
| 誰に紐づく登録か | Monty の名前が見える |
| なぜ 3306 という数字なのか | 今回の範囲では不明 |
PostgreSQL の 5432 も、数字の理由までは追いにくい
PostgreSQL についても、5432 が PostgreSQL Database のポートとして IANA に登録されています。assignee/contact には Tom Lane の名前があります。
また、PostgreSQL の古い公式ドキュメントを見ても、かなり早い時期から default port 5432 が使われていたことは確認できます。少なくとも、PostgreSQL 系の歴史の中で 5432 が早くから定着していた、とは言えそうです。
ただし、こちらも「なぜ 5432 なのか」までは、今回見た公式アーカイブからは分かりませんでした。
PostgreSQL は Berkeley POSTGRES の流れをくむので、「5432 の理由も Berkeley 時代にあるのでは」と考えたくなります。ですが、今回の資料だけで「5432 の数字の意味は Berkeley 起源です」と言い切るのは少し危ういと思います。
MySQL 3306 と PostgreSQL 5432 は、どちらも「製品デフォルトとして定着し、IANA にも登録されている」番号です。一方で、「数字そのものの由来」はまた別問題で、そこは一次資料が少ない領域のようでした。
ほかのデータベースのポートも似た事情がある
SQL Server の 1433 は、Microsoft の公式ドキュメントで default instance が使う TCP ポートとして説明されています。IANA にもms-sql-s 1433 として登録されています。ただし、なぜ 1433 なのかという数字の由来までは、今回の一次資料では見つけられませんでした。
Oracle Database の 1521 は、少し事情が違います。Oracle の公式ドキュメントでは Oracle Net Listener の default port として 1521 が説明されています。現場でも非常によく知られた番号です。
しかし IANA で 1521 を見ると、登録名は Oracle ではなくncube-lm です。さらに Oracle による利用については、IANA 側では「Unauthorized Use Known on port 1521」という注記がされています。
つまり、Oracle 1521 は「Oracle の世界では定番」ではあるものの、「IANA 上で Oracle 用に正式登録されている」とは言いにくい例です。このズレはかなり面白いところでした。
Redis の 6379、MongoDB の 27017 も、公式ドキュメント上のデフォルト値は確認できます。MongoDB 27017 は IANA にも登録されています。ただ、これらも数字そのものの由来までは、今回の範囲でははっきりしませんでした。
Elasticsearch はさらに少しややこしく、公式ドキュメントではhttp.port のデフォルトが 9200-9300、transport.port のデフォルトが 9300-9400 という範囲で説明されています。会話では「Elasticsearch は 9200 と 9300」と言いがちですが、厳密には「最初に使われやすい値」と「設定上の範囲」を分けて見たほうがよさそうです。
HTTP の 80 と HTTPS の 443 はかなりはっきりしている
HTTP 80 と HTTPS 443 は、今回見た中ではかなり由来が分かりやすい部類でした。
RFC 1945 では、http:// URL でポートが省略されている場合は 80 を前提にする、という扱いが示されています。現在の RFC 9110 でも、http のデフォルトは TCP 80、https のデフォルトは TCP 443 と説明されています。
このあたりは、ローカル開発の慣習というより、仕様として決まっている番号と見てよさそうです。
8080 は「80 を二つ並べたから」なのか
8080 は、IANA ではhttp-alt として登録されています。説明も HTTP Alternate、つまり HTTP の代替ポートという位置づけです。
Tomcat もデフォルトで 8080 に bind しようとします。Tomcat のドキュメントでは、ポートを変えるなら 1024 より大きい番号にするのが望ましい、という説明もあります。Unix 系 OS の特権ポート制約を考えると、80 の代わりに 8080 のような高番ポートを使う理由はよく分かります。
一方で、よく言われる「8080 は 80 を二つ並べたから」という説明については、今回確認した IANA、RFC、Tomcat の一次資料には出てきませんでした。
もちろん、数字の見た目としてそう受け取られやすいのは分かります。ただ、一次資料ベースで書くなら、「8080 は HTTP の代替ポートとして登録されている」までは言えても、「80 を二つ並べたから 8080 になった」とまでは言い切らないほうがよさそうです。
3000 は Web 開発の標準ポートなのか
3000 は、今回調べていて特に印象に残った番号です。
Rails、Express、Create React App、Next.js、Grafana など、多くの開発ツールやアプリケーションで 3000 が使われています。Web 開発をしていると、localhost:3000 はかなり見慣れた存在です。
ただし、IANA 上の 3000 は Web 開発用ポートではありません。IANA で 3000 を見ると、HBCI など別の用途が出てきます。
つまり、3000 は「公式な Web 開発ポート」というより、ローカル開発の世界で広く定着したデファクトと見たほうがよさそうです。
Rails の古いガイドでも 3000 は使われており、比較的早い時期から Rails が 3000 を使っていたことは確認できます。ただし、「Rails が 3000 の起源です」と言えるところまでは、今回の資料だけでは踏み込めません。
現在の感覚としては、Rails などの人気プロジェクトが使い、Express や Next.js などでも使われ、結果として「Web 開発なら 3000」という空気が強まっていった、と見るのが自然かもしれません。
5000、8000、8888、4200、5173 も「由来」までは難しい
Flask は 5000、Django は 8000、Jupyter Notebook は 8888、Angular CLI は 4200、Vite は 5173 をデフォルトとして使います。どれも公式ドキュメント上で現在のデフォルト値は確認できます。
ただ、5000 だから Flask、8000 だから Django、8888 だから Jupyter になった理由までは、今回見た公式ドキュメントでは分かりませんでした。
Vite の 5173 や Angular の 4200 についても、外部ではいろいろな説を見かけます。けれど、一次資料で確認できる範囲に絞るなら、「現在のデフォルトは確認できるが、数字の理由は分からない」としておくのがよさそうです。
Docker、Kubernetes、Prometheus など
Docker daemon のリモート API では、2375 が非 TLS、2376 が TLS の慣例的なポートとして説明されています。Docker のドキュメントでは conventional という表現が使われており、標準仕様で固定された番号というより、Docker の運用慣習として見るほうが近そうです。
Kubernetes API Server は、既定で 6443 を listen します。ただし、IANA 上の 6443 は Kubernetes ではなくsun-sr-https です。ここでも、製品のデフォルトと IANA の登録名が一致しない例になっています。
Prometheus は 9090 をデフォルトとして使います。これも公式ドキュメント上のデフォルト値は確認できますが、なぜ 9090 なのかという数字の由来までは、今回の範囲では追いきれませんでした。
俗説っぽいものを整理してみる
調べていて感じたのは、ポート番号には「現在そう使われていること」と「その数字が選ばれた理由」が混ざって語られやすい、ということです。
| よくある説明 | 調べた範囲での見方 |
|---|---|
| HTTP は 80 を使う | RFC で確認できる |
| HTTPS は 443 を使う | RFC で確認できる |
| 8080 は HTTP の代替ポート | IANA で確認できる |
| 8080 は 80 を二つ並べたから | 今回の一次資料では確認できなかった |
| MySQL 3306 は 3305 の次の空き番号だった | 今回の一次資料では確認できなかった |
| PostgreSQL 5432 は Berkeley 由来で理由も説明済み | 5432 の利用は確認できるが、数字理由は確認できなかった |
| 3000 は公式な Web 開発ポート | IANA 上はそうではなく、デファクトと見るのがよさそう |
| Oracle 1521 は IANA でも Oracle 用 | IANA 上の名義は Oracle ではない |
| Elasticsearch のデフォルトは厳密に 9200 と 9300 | 公式設定では範囲として説明されている |
| Kubernetes 6443 は IANA でも Kubernetes 用 | IANA 上は Kubernetes 用ではない |
ポート番号まとめ
最後に、今回見た番号をまとめておきます。
| ポート | よく見る用途 | 今回の見方 |
|---|---|---|
| 20/21 | FTP | 標準プロトコル側の番号 |
| 22 | SSH | 標準プロトコル側の番号 |
| 25 | SMTP | 標準プロトコル側の番号 |
| 53 | DNS | 標準プロトコル側の番号 |
| 67/68 | DHCP | 標準プロトコル側の番号 |
| 80 | HTTP | RFC で既定値が示されている |
| 443 | HTTPS | RFC で既定値が示されている |
| 8080 | HTTP alternate / Tomcat | HTTP 代替ポートとしては確認できるが、語呂の由来は未確認 |
| 3000 | Rails / Express / Next.js など | Web 開発のデファクト。ただし IANA 上の Web 標準ではない |
| 3306 | MySQL | 公式既定と IANA 登録は確認できるが、数字理由は未確認 |
| 5432 | PostgreSQL | 公式既定と IANA 登録は確認できるが、数字理由は未確認 |
| 1433 | SQL Server | 公式既定と IANA 登録は確認できるが、数字理由は未確認 |
| 1521 | Oracle Net Listener | Oracle の定番だが、IANA 上の名義は Oracle ではない |
| 5000 | Flask | 公式デフォルトは確認できるが、数字理由は未確認 |
| 6379 | Redis | 公式デフォルトは確認できるが、数字理由は未確認 |
| 8000 | Django | 公式デフォルトは確認できるが、数字理由は未確認 |
| 8888 | Jupyter Notebook | 公式デフォルトは確認できるが、数字理由は未確認 |
| 1883 | MQTT | IANA に登録された MQTT の標準ポート |
| 8883 | MQTT over TLS | IANA に登録された secure MQTT の標準ポート |
| 2375/2376 | Docker daemon remote API | Docker の慣例的ポート |
| 27017 | MongoDB | 公式既定と IANA 登録は確認できるが、数字理由は未確認 |
| 4200 | Angular CLI | 公式デフォルトは確認できるが、数字理由は未確認 |
| 5173 | Vite | 公式デフォルトは確認できるが、数字理由は未確認 |
| 6443 | Kubernetes API Server | Kubernetes の既定値だが、IANA 上の名義は別用途 |
| 9090 | Prometheus | 公式デフォルトは確認できるが、数字理由は未確認 |
| 9200/9300 | Elasticsearch | 厳密には HTTP / transport ともに範囲で説明されている |
調べてみて思ったこと
ポート番号は、見慣れているほど「何か明確な理由があるはず」と思ってしまいます。ですが実際に調べてみると、数字の由来まで一次資料で追えるものは意外と少ない印象でした。
HTTP 80 や HTTPS 443 のように標準仕様の中で説明しやすいものもあります。一方で、MySQL 3306、PostgreSQL 5432、3000、5000、4200、5173 のような番号は、今では当たり前のように使われていても、「なぜその数字か」まではあまり語られていないようです。
このあたりは、ソフトウェアの歴史らしいところかもしれません。最初は小さなデフォルト値だったものが、ユーザー、ドキュメント、サンプルコード、Docker イメージ、クラウド設定などを通じて広まり、いつの間にか「そういうもの」として固定されていく。
なので、ポート番号について話すときは、「現在その番号を使う」ことと、「その番号が選ばれた理由が分かっている」ことを分けて考えると、かなり見通しがよくなりそうです。
MySQL は 3306、PostgreSQL は 5432。
この二つも、使われていること自体ははっきりしています。ただ、その数字に込められた最初の理由については、少なくとも今回調べた範囲では、まだ余白が残っているように感じました。