疑問: URL と IP アドレス

インターネットの仕組みについての疑問。

それは、URL と IP アドレスの関係についてだ。

まず、話を整理しよう。

URL の構成

http://google.com という URL がある。

この URL は、2 つの要素で構成されている。

  • http:// … これは、"HTTP" という、プロトコル種名だ。
  • google.com … これは、ドメイン。ひとつのドメインには、ひとつの IP アドレスが割り当てられている。

ドメインと IP アドレス

あるドメインに、どんな IP アドレスが割り当てられているかを知るには?

いくらでも方法がある。

たとえば、ping というソフトを使う。

コマンドプロンプトping google.com と入力して実行すると…。

> ping google.com
google.com [173.194.117.232]に ping を送信しています

…といった具合に表示される。

google.com の IP アドレスは 173.194.117.232 だ!

(ちなみに、これは、ping の本質的な使用方法ではない。)

サブドメインと IP アドレス

さて…。

http://maps.google.com という URL には maps というサブドメインがある。

ping してみよう。

> ping maps.google.com
maps.google.com [173.194.117.229]に ping を送信しています

単なる google.com とは違う IP アドレスだ。

     google.com = 173.194.117.232
maps.google.com = 173.194.117.229

ほうほう、つまり、サブドメインドメインにも、ひとつのユニークな IP アドレスが割り当てられているのですね。

新しい知識

という理解を、今まで自分はしていたわけだ。

が、それは間違っていた。

サブドメインドメインには、必ずしもユニークな IP アドレスが割り当てられているわけではない

すなわち…

> ping twitter.github.io
github.map.fastly.net [103.245.222.133]...
...
> ping 0mg.github.io
github.map.fastly.net [103.245.222.133]...
...

github.iogithub.map.fastly.net に置き換わっている。それはいいとして…。

問題は、twitter.github.io0mg.github.io が全く同じ IP アドレスとなっていることだ。

twitter.github.io = 103.245.222.133
    0mg.github.io = 103.245.222.133

どっちも同じ IP アドレスだったら、どっちの URL も同じリソースへの参照になってしまうのではないか?

いや、現になっていないのだから、何か特別なしくみがあるはずだ。

一体、何なのだろう?

名前ベースバーチャルホスト

調べてみたところ、こんなページが見つかった。

バーチャルホストという、サーバーの機能によるものとのこと。

バーチャルホストには、2種類あって、それぞれ、「IP ベース」と「名前ベース」という名称がある。

IP ベースでは、サブドメインごとにユニークな IP アドレスを割り当てる。先述の、google.com に対する maps.google.com のそれである。

一方、名前ベースでは、新たな IP アドレスは割り当てない。

上記の Apache のサイトの説明には、こうある。

  • IP ベースのバーチャルホストでは、応答する バーチャルホストへのコネクションを決定するために IP アドレスを使用します。ですから、それぞれのホストに個々に IP アドレスが必要になります。これに対して名前ベースのバーチャルホストでは、 クライアントが HTTP ヘッダの一部としてホスト名を告げる、 ということに依存します。この技術で同一 IP アドレスを異なる多数のホストで共有しています。

  • 名前ベースのバーチャルホストが働くためには、クライアントは HTTP ホストヘッダを送ってこなければなりません。 これは HTTP/1.1 の仕様で要求されていて、すべての現代的な HTTP/1.0 ブラウザでも拡張として実装されています。

たぶんこういうことだ、たとえば、ブラウザは twitter.github.io にアクセスするとき、以下のようなデータの入ったリクエストを送信しているのだろう。

IPADDR = 103.245.222.133
VSNAME = twitter

代替 URL なし?

ブラウザのアドレスバーに URL を打ち込むとき、http://google.com の代わりに http://173.194.117.232 でも同じサイトが開ける。

これはトリビアでもありつつ、DNS サーバーが故障したときに役立つ。

では、http://twitter.github.io の代わりには、どう打ったらいいんだろう? "HTTP ヘッダの一部としてホスト名を告げる" 必要があるのだが、それはもう、twitter.github.io という文字の並びでしかできないのか?

たとえば、http://103.245.222.133///twitter/// みたいなふうにはできないのか?