第9回 Webブラウザのしくみ
2002/10/26
現在NetBSDのカーネルコンパイル中。
待ち時間を利用して日記で書いたWebブラウザでWebが表示される仕組みを書いてみたいと思います。
日記で予告したぬるいコンテンツです。
1.URL
最近はTVや雑誌などのメディアでも多く見かけるURLですが、これをインターネットエクスプローラやネットスケープブラウザの上のアドレスに入れるとホームページが表示されます。
このURLを分割してみると以下のようになります。
http://www.yggdrasil.jp/browser.html
http => プロトコル
www.yggdrasil.jp => ホスト名
browser.html => ファイル名
2.プロトコル
第一フィールドはプロトコル部になります。
どのプロトコルでデータのやりとりをするのかを定義しています。
httpはHyperText Transfer Protocolの略で、主にHTML(HyperText Markup Language)形式で書かれた文章をサーバから持ってくるプロトコルですが、ご存じの通りHTML以外でも画像や音声などのバイナリファイルも転送可能です。
他にもhttpsやftpなども利用できます。
ftpは本来ftpクライアントという専用のツールを使うのがベストなのですが、Webブラウザの方でftpクライアントをエミュレーションして得られた結果をブラウザに表示してくれる機能です。
httpとhttpsの両方が使えて内容が同じサイトや、ファイルのダウンロードをするときにhttpで取ってくるときとftpで持ってくるときがありますが、これはHTMLやファイルをダウンロードするときにどのプロトコルを使うかの違いがあります。
表1 ブラウザで使えるプロトコル
プロトコル 意味 http HTMLファイルの転送プロトコル https HTMLファイルの暗号化転送プロトコル
途中で通信を盗聴されても通信内容が暗号化されているので安心ftp File Transfer Protocol 主にファイルを持ってきたり送ったりする
httpはファイルを送る機能が弱いので送り込むときはftpが活躍するgopher 今よりPCが高性能じゃなかった頃に使われていたテキストの転送プロトコル
最近では見たことないです
ちなみにプロトコル指定せずにいきなりホスト名から書きはじめるとでhttpでアクセスしようとします。
3.ホスト名
第二フィールドはホスト名です。
サーバと通信するためにはIPアドレスを知る必要があります。
ホスト名からIPアドレスを調べるためにはいくつかの方法があります。
Windowsの場合は、まずWindowsフォルダにある"hosts"ファイルを調べてそこになかったらDNSサーバに問い合わせ、それでもなかったらWindowsファイル共有で使っているNetBIOS名を調べます。UNIX系OSの場合はhost.confを調べましょう。
ホームページをみることを前提に考えるとほとんどの場合がDNSサーバへの問い合わせが一般的です。
ちなみに、これをうまく利用すれば、めちゃめちゃ重いDNSサーバを使っていて名前解決に時間がかかってしょうがない人は、よく行くページはhostsに書いておけばページが表示されるのが早くなるでしょう。
4.ファイル名
第三フィールドはファイル名です。
ディレクトリ構造になっていればディレクトリも入ります。
Webサーバでドキュメントルートというのが設定されていて、そこからディレクトリ階層がはじまります。
たとえば、Webサーバのドキュメントルートが"/home/http/documents"と指定されたとします。
"/home/http/documents/doc/doc.html"にアクセスしたい場合、URLのファイル部分には"/doc/doc.html"となり"/home/http/documents"は意識しなくても良くなります。
ファイル名を指定しなかった場合、デフォルトのファイルが指定されていた場合はそれが表示されます。
一般的には"index.html"や"welcome.html","default.htm"などです。設定により変えることができます。
Apacheの場合はmod_dirを入れればデフォルトが使えるようになりますが、最近ではセキュリティホールになる恐れがあるということで使わない場合が多いようです。
なお、CGIの場合はどうなるのかとか細かい話は今回しません。話が長くなりますので・・
あと、参考文献にRFC2616を載せておきました。私は読んでいません。英語だし・・
参考文献
Apache mod_dirモジュール http://www.apache.jp/docs/mod/mod_dir.html
RFC2616 Hypertext Transfer Protocol -- HTTP/1.1
ちなみに書き終わった今でもカーネルコンパイルは終わっていません。
486 100MのLibretto20だしなぁ・・