疑問: URL と IP アドレス
インターネットの仕組みについての疑問。
それは、URL と IP アドレスの関係についてだ。
まず、話を整理しよう。
URL の構成
http://google.com
という URL がある。
この URL は、2 つの要素で構成されている。
ドメインと 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.io
は github.map.fastly.net
に置き換わっている。それはいいとして…。
問題は、twitter.github.io
と 0mg.github.io
が全く同じ IP アドレスとなっていることだ。
twitter.github.io = 103.245.222.133 0mg.github.io = 103.245.222.133
どっちも同じ IP アドレスだったら、どっちの URL も同じリソースへの参照になってしまうのではないか?
いや、現になっていないのだから、何か特別なしくみがあるはずだ。
一体、何なのだろう?
名前ベースバーチャルホスト
調べてみたところ、こんなページが見つかった。
- Apache バーチャルホストによりIPアドレス1個でサブドメイン毎に別のサイトを作る | WEB作業メモ
- バーチャルホスト - Wikipedia
- 名前ベースのバーチャルホスト - Apache HTTP サーバ バージョン 2.2
バーチャルホストという、サーバーの機能によるものとのこと。
バーチャルホストには、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///
みたいなふうにはできないのか?