読書の秋なので今日は1日読書をして過ごしました。
家にいると中々集中できなかったりするので、近所のカフェBowery kitchen(→こんなとこ)へ。
家族連れやカップルや犬を横目で見ながら、先日購入した基礎からわかるTCP/IPネットワークコンピューティング入門を読了。
この本はコンピュータの仕組みを中心にネットワークやTCP/IPを解説している本で、結構知らないことが多く、目からウロコが落ちっぱなしでした。
かといって、本を読んだだけでその内容の全てを把握できるほど天才ではないので、『ブラウザにURLを入力してからWebページが表示されるまで』を例にwwwの仕組みについて調べながらまとめてみます。
まず、処理を大きく4つに分けてみます。
1.クライアントのリクエスト送信 2.サーバーのリクエスト受信 3.サーバーのデータ送信 4.クライアントのデータ受信
この4つをそれぞれ細かくすると、こんな感じになります。
1.クライアントのリクエスト送信 1-1.ハードウェアからの入力 1-2.ブラウザでの入力イベントを解釈し、リクエストを送信 2.サーバーのリクエスト受信 2-1.リクエスト受信 2-2.リクエストを解釈して要求処理を実行 3.サーバーのデータ送信 3-1.処理結果をクライアントにデータ送信 4.クライアントのデータ受信 4-1.データ受信 4-2.受信データを解釈し、表示レイアウト処理 4-3.ディスプレイへの出力
というように一通りの処理が完了するのですが、このそれぞれの処理についてさらに突っ込んで学んでみたいと思います。
1.クライアントのリクエスト送信
1-1.ハードウェアからの入力
ここではキーボードからURLを入力してエンターキーを押すことですが、ハードウェアから入力された情報はデバイスドライバを通してOSに伝わり、OSからアプリケーションへ送られます。
1-2.ブラウザでの入力イベントを解釈し、リクエストを送信
例として、http://blog.southwave.jp/index.htmlをブラウザのアドレス欄に入力してエンターキーを押したとしましょう。
ブラウザはまず、「http://」を見てHTTP通信を行うものという判断をします。そして、「blog.southwave.jp」をWebサーバのホスト名、「/index.html」を要求するページ名と解釈します。
次に、DNSに問い合わせて「blog.southwave.jp」のIPアドレスを取得し、取得したIPアドレスのポート番号80にTCPコネクションを確立します。
そして、「GET /index.html HTTP/1.1」というようなリクエストとMIME(ヘッダ情報)をTCPパケットとして送信します。
リクエストされたTCPパケットはEthernet経由でルータに届き、ルータは経路表を基に次のルータに転送します。
渡されたルータはまた次のルータに転送し、これの繰り返しでバケツリレー方式でサーバまで転送します。
2.サーバーのリクエスト受信
2-1.リクエスト受信
送られてきたTCPパケットを受信します。
2-2.リクエストを解釈して要求処理を実行
受信した、TCPパケットを解釈します。
ここでは、「/index.html」というファイルをHTTP通信で要求されているので、サーバー内の「/index.html」というファイルを呼び出す処理を行います。
3.サーバーのレスポンス送信
3-1.処理結果をクライアントにデータ送信
呼び出したファイルのデータとHTTPのレスポンスやMIMEを送信します。
レスポンスは、「HTTP/1.1 200 OK」のような形です。(200はリクエストが成功したという意味)
(ちなみにTCPパケットに送信元IPアドレスが記述されているので、送信先が分かります。)
4.クライアントのデータ受信
4-1.データ受信
ここでは、ブラウザが「index.html」のファイルデータと「HTTP/1.1 200 OK」のようなレスポンスを受信します。
4-2.受信データを解釈し、表示レイアウト処理
受け取ったデータをヘッダ情報を元に処理します。
ここでは、受け取ったデータをHTMLとして処理します。
ブラウザのHTMLレンダリングエンジンを元に画面に表示する為の計算処理が行われます。
4-3.ディスプレイへの出力
処理されたデータはOSに伝わりデバイスドライバを通して、ディスプレイに出力されます。
このような形でブラウザはWebページを表示しています。ざっくり流れに関してのまとめだったので、それぞれの言葉の意味やしくみ(OS・CPU・TCP・IP・ソフトウェア・ルータ・インターネット・HTTP・MIME・DNS・DHCP・UDP・CGIなど)をもっと詳細にまとめたいと思います。
また、サーバーに関しては絶対に必要な知識なので、内部の詳細な仕組みや処理を理解したいと思います。