http://to./が開けるしくみ
※2010/04/14 11:55追記
ブコメでのご指摘の通り、「なぜ開けるか」に対する答えは、「"to"のトップレベルドメイン(TLD)にAレコードが設定されているから」というシンプルなものです。
"to"はトンガのTLDで、古くからTLDを売って外貨を稼いでいます。恐らく、今回の"to."URL短縮サービスもその一環ではないかと考えられています。(beroさん コメントでの情報提供ありがとうございました)
※さらに補足:もう少し正しい説明 を追加しました。
Twitterでちょっと話題に上っていたので。
http://to./というURL短縮サービスがあります。一見開けなさそうなこの不思議なURL、実は正しく開けます。
その仕組みについて簡単に説明したいと思います。
ブラウザで"http://to./"にアクセスすると、ブラウザはOSに"to."のIPアドレスを尋ねます。
そのリクエストを受けたOSは、その"to."という文字列から、IPアドレスへ変換しようとします。今回は、Linuxでの動作で説明しますが、Windowsでもおよそ同じ処理が行われます。
まず、OSは"to."に対応するIPアドレスを、OSに設定されているDNSサーバに対して問い合わせます。同じ処理を、コマンドラインから次のようにして実行することができます。今回は、DNSサーバとしてgoogle DNS(8.8.8.8)を使用してみましょう。
$ dig A to. @8.8.8.8 ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> A to. @8.8.8.8 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23942 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;to. IN A ;; ANSWER SECTION: to. 63755 IN A 216.74.32.107 ;; Query time: 43 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Tue Apr 13 16:41:37 2010 ;; MSG SIZE rcvd: 36
digコマンドは、「知りたい情報の種類(A)」、「対象のホスト名文字列(to.)」、「"@"+問い合わせるDNSサーバ(@8.8.8.8)」という引数を取ります。
ホスト名文字列からIPアドレスを取得する場合は、「Aレコード」を問い合わせることになります。その回答が、
;; ANSWER SECTION: to. 63755 IN A 216.74.32.107
これです。「"to.a"に対応するIPアドレスは"216.74.32.107"だ」という回答が返ってきました。
これにより、ブラウザは216.74.32.107のポート80番に接続し、HTTP通信を行います。たったこれだけです。
補足:jpやcomの場合は?
.jpや.comなど、いわゆる普通のドメインの場合はどうかを見てみましょう。
$ dig A jp. @8.8.8.8 ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> A jp. @8.8.8.8 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17303 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;jp. IN A ;; AUTHORITY SECTION: jp. 66 IN SOA z.dns.jp. root.dns.jp. 1271142901 3600 900 604800 900 ;; Query time: 44 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Tue Apr 13 16:45:10 2010 ;; MSG SIZE rcvd: 67
このような回答となります。"A"に対する回答が含まれていないため、"jp."に対応するIPアドレスはありません。返ってきた情報は、"ナントカ.jp"の情報はこのサーバに聞いてね(SOA)という情報だけです。com.としても同様です。
"to"というトップレベルドメインの場合に関してのみ、Aレコードを持っているため、正しくIPアドレスを取得できるのです。
補足:なぜ「http://to./」なの?「http://to/」じゃないの?
環境によります。簡潔に言うならば、「to.」はFQDN(Fully Qualified Domain Name: 完全修飾ドメイン名)で「to」はFQDNではない、という違いです。
最後にドットが付いている場合、その表記は絶対的な表記として扱われます。しかし、そうでない場合には、環境によっては相対的な表記として扱われることがあります。
例として、foo.bar.baz.example.com というドメインを考えてみます。example社のbaz部のbar課のfooというPCだとしましょう。このPCを指すとき、foo.bar.baz.example.comと毎回入力するのは面倒なので、bar課では「foo」と入力するだけで「foo.bar.baz.example.com」を意味するようになっていると便利です。そのための機能が、ドメインサフィックスと呼ばれる機能です。
Linuxでは、/etc/resolv.confのsearchオプションで指定できます。
search bar.baz.example.com
と書いてある場合、"foo"と指定した場合、自動的に"foo.bar.baz.example.com"を意味することになります。これを回避したい場合、"foo."とします。後者はFQDNですので、このような自動的な補完は行われません。
このような事情から、ドメインサフィックスが設定されている環境では、http://to/は開かないかもしれませんが、http://to./なら開けるのです。
さらに補足:もう少し正しい説明
to.からIPアドレスが正しく引ける理由について、もう少し正しく詳しく説明してみます。間違っていたらご指摘いただければ幸いです。
※OSが最初に問い合わせるDNSサーバは"to."について何も知らないという前提
(1) OSがDNSサーバに問い合わせる。("to."に対応するAレコードを要求)
(2) DNSサーバは、自分は"to."について何も知らないため、"to."についての情報を上位のサーバに問い合わせることにする。今回の場合、"."、つまりDNSルートサーバに問い合わせを行う。なお、DNSサーバはルートサーバのIPアドレスを事前に知っていることになっている。
$ dig SOA to. @a.root-servers.net. ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> SOA to. @a.root-servers.net. ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43993 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 5 ;; QUESTION SECTION: ;to. IN SOA ;; AUTHORITY SECTION: to. 172800 IN NS tonic.to. to. 172800 IN NS auth02.ns.uu.net. to. 172800 IN NS colo.to. to. 172800 IN NS ns-to.ripe.net. to. 172800 IN NS ns1.iafrica.com. ;; ADDITIONAL SECTION: ns1.iafrica.com. 172800 IN A 196.7.0.139 colo.to. 172800 IN A 216.74.32.104 ns-to.ripe.net. 172800 IN A 193.0.12.224 tonic.to. 172800 IN A 216.74.32.100 auth02.ns.uu.net. 172800 IN A 198.6.1.82 ;; Query time: 104 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Tue Apr 13 17:35:49 2010 ;; MSG SIZE rcvd: 223
"to."について知っているのは、tonic.to.をはじめとする5台のDNSサーバであることがわかる("… IN NS …" 応答)。ついでに、その各DNSサーバのIPアドレスも付加情報(グルーレコード、ADDITIONAL SECTION)として一緒に返ってきている。
(3) DNSサーバは、"to."のAレコードを"tonic.to."に問い合わせる。グルーレコードから、"tonic.to."は"216.74.32.100"であることがわかっているので、このIPアドレスのサーバに問い合わせる。
$ dig A to. @216.74.32.100 ; <<>> DiG 9.3.6-P1-RedHat-9.3.6-4.P1.el5 <<>> A to. @216.74.32.100 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46073 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 3 ;; QUESTION SECTION: ;to. IN A ;; ANSWER SECTION: to. 86400 IN A 216.74.32.107 ;; AUTHORITY SECTION: to. 86400 IN NS ns1.iafrica.com. to. 86400 IN NS colo.to. to. 86400 IN NS ns-to.ripe.net. to. 86400 IN NS tonic.to. to. 86400 IN NS auth02.ns.uu.net. ;; ADDITIONAL SECTION: colo.to. 86400 IN A 216.74.32.104 ns-to.ripe.net. 9641 IN A 193.0.12.224 tonic.to. 7200 IN A 216.74.32.100 ;; Query time: 125 msec ;; SERVER: 216.74.32.100#53(216.74.32.100) ;; WHEN: Tue Apr 13 17:39:50 2010 ;; MSG SIZE rcvd: 207
このようにして、OSから問い合わせを受けたDNSサーバは、"to."に対応するAレコードを取得することができた(ANSWER SECTION)。
(4) DNSサーバは、OSに対して「"to."に対応するIPアドレスは"216.74.32.107"だ」と応答する。サーバによっては、今後の問い合わせに対して高速に応答できるよう、この結果を覚えておく(DNSキャッシュ)
(5) OSはブラウザにこの応答を伝え、ブラウザはこのIPアドレスに対して接続を行う。