コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
ポート番号と well-known port
1 台のサーバーで、Web と管理用ログインが同時に動くのはなぜか
1 台のサーバーには IP アドレスが 1 つしかありません。それなのに、そのサーバーは Web サイトを配りながら、同時に管理用のログインも受け付けています。
宛先の住所が同じなら、届いたデータはどちらのアプリのものなのでしょうか。この行き先を決めているのがポート番号です。
住所と、部屋番号
IP アドレスが建物の住所だとすれば、ポート番号は部屋番号です。住所だけでは建物までしか届きません。部屋番号があって初めて、中の誰宛かが決まります。
ポート番号は 16 ビットの数値で、0 から 65535 までを取ります。サーバー側のアプリは起動時に「私は何番で待ちます」と宣言し、そこへ来たデータだけを受け取ります。HTTPS は 443 番、SSH は 22 番、PostgreSQL は 5432 番、というふうに、よく使われるものには慣例の番号が決まっています。慣例なので技術的には変えられますが、変えると相手が探せなくなるので、公開するものは慣例に従います。
番号の範囲は、おおまかに 3 つに分かれています。
- 0 から 1023 は、標準的なサービス用に予約されている範囲です。ここで待ち受けるには管理者権限が要ります
- 1024 から 49151 は、登録済みだが必須ではない範囲です。開発中に 3000 番や 8080 番を使うのはここです
- 49152 以降は、その場限りの用途に空けてある範囲です
番号を指定せずに通信することはできません。ブラウザに https://example.com と打ったとき番号が見えないのは、省略しているだけで、種類に応じた慣例の番号が自動で補われているからです。慣例と違う番号で動かしているサーバーに繋ぐときだけ、末尾に番号を書く必要が出てきます。
頼む側の番号は、毎回変わる
見落としやすいのが、頼む側にも番号が要るという点です。応答をどの部屋に返すかを決めないといけないからです。
この番号は OS がその都度、空いているものを自動で割り当て、使い終われば回収します。ふだん意識する必要はありません。ただし、同じ相手へ短い接続を大量に張り続けると、割り当てる番号が尽きて接続に失敗することがあります。バッチ処理で「しばらく動いてから急に接続できなくなる」という症状の定番の原因です。接続を毎回捨てずに使い回す、という対策が効きます。
待ち受ける側にも決まりがあります。1 つのアプリが複数の番号で待つことはできますが、1 つの番号を複数のアプリが同時に使うことはできません。すでに使われている番号で起動しようとすると、その場でエラーになって立ち上がりません。前回の開発サーバーが終了しきっておらず、次を起動できない、という詰まり方がこれです。
なお、番号の空間は TCP と UDP で完全に別です。TCP の 5432 番と UDP の 5432 番は、無関係な別の部屋です。関所の設定を書くときに、どちらのことなのかを必ず明示しなければならないのはこのためです。片方だけ開けて「番号は開けたのに繋がらない」と悩むのは、誰もが一度は通る道です。設定画面で TCP と UDP のどちらが選ばれているかを、まず見てください。
復習ミニクイズ
HTTPS が標準で使うポート番号はどれですか