Webページが表示される仕組み②【DNS・IPアドレス・POST...】

今回はWebページが表示される仕組みの第二弾です!

第一弾ではユーザーがページをリクエストしてから、ブラウザが指定されたサーバーへ辿り着くまでをまとめました。

第二弾の今回は、ブラウザとサーバーのやり取りからまとめていきます。

ブラウザとサーバーの会話は3ステップで開始

ようやくサーバーに辿り着きましたが、簡単に目的のファイルを取得できるわけではありません。

まずは、ブラウザとサーバーが、会話をしても問題ないかの確認から始まります。

この確認が「TCP 3way handshake」と呼ばれるものです。
TCP:信頼性の高いやりとり。情報が送信できているかどうかを逐一確認する

①SYN:ブラウザ→サーバー
②SYN+ACK:サーバー→ブラウザ
③ACK:ブラウザ→サーバー
※SYN:Synchronized
※ACK:Ackowledge

①ブラウザ→サーバー:「話しかけてもいいですか?」という問いかけ
②サーバー→ブラウザ:「話しかけてもいいですよ。私もあなたに話しかけていいですか?」
③ブラウザ→サーバー:「分かりました!」

※サーバーとの会話の中身は次のコマンドで確認できます。
 「tcpdump port 見たいポート番号」

この3ステップが完了して、やっと取得したいファイルの要求を行うことができます。

リクエストヘッダでページを要求

ページのリクエストには決まったフォーマットを使います。
それが「リクエストヘッダ」と呼ばれるものです。
サーバーはリクエストヘッダを受け取って初めて、ブラウザが何を欲しているのかを理解します。

【リクエストヘッダ】
f:id:hnm-n-1029:20200829164257p:plain

■リクエストヘッダの構成
●リクエスト行●
メソッド:Webサーバーに対する要求を示す(GET、POST...)
パス:リクエスト対象のデータを示す(取得したいファイル)
バージョン:HTTPのバージョンを示す
●メッセージヘッダ●
Host以降の行で、ブラウザの情報をサーバーに伝える。
(Webブラウザの種類や、対応しているデータのタイプなどの情報)
●空白行●
1行空けることでメッセージヘッダの終わりを伝える。
●メッセージボディ●
Webサーバーにデータを送るために使われる。空の場合もある。

リクエストヘッダの内容に応じてサーバーがコンテンツを返す

リクエストヘッダを受け取ったサーバーは、その内容に応じてコンテンツを返します。

Webサーバー自体がコンテンツを持っている場合もありますが、
最近のモダンなWebアプリケーションでは、Webサーバーの後ろにいくつかの要素が隠れている可能性があります。

その要素として考えられるのが、アプリケーションサーバーやWebサーバーが持っているローカルディスクです。

Webサーバーとは別にアプリケーションサーバーがある場合、Webサーバーがアプリケーションサーバーに問い合わせて、コンテンツを受け取りユーザーに返す、という流れになります。

レスポンスヘッダとボディ

サーバーがコンテンツを取得してブラウザへ返す場合にも決まったフォーマットがあります。
それがレスポンスヘッダです。

【レスポンスヘッダ】
f:id:hnm-n-1029:20200829164317p:plain

■レスポンスヘッダの構成
●ステータス行●
バージョン:HTTPのバージョンを示す
ステータスコード:リクエストに対するWebサーバーの処理の結果を示す3桁の数字
テキストフレーズ:ステータスコードの内容をテキストで示す
●メッセージヘッダ●
Content~以降の行でWebサーバーの情報を伝える。
(ソフトウェア情報や返信するデータのタイプなど)
●空白行●
1行空けることでメッセージヘッダの終わりを伝える。
●ボディ●
HTMLや画像などのデータを格納する場所

これでようやくブラウザがHTMLを取得できました!

ただ実は、この一連のやり取りで取得できたのはHTMLだけになります。
HTMLに付随するCSSや画像は、また同じやり取りを経て取得しなければなりません。
ブラウザ大変....

ファイル毎に毎回TCP 3way handshakeするのは効率が悪くシステムへの負荷が高くなる....
そこで登場するのが「HTTP KeepAlive」という機能です。

効率的に会話する:HTTP KeepAlive


HTTP KeepAliveとは、一つのTCP接続を一回のHTTP通信で切断せず、複数のHTTPリクエスト/レスポンスを送受信するよう維持する機能のことです。
つまりKeepAliveを有効にした場合、HTMLファイルを受け取った後に続けてリクエストすることができます。(3way handshakeを省略することができます)

これで効率的にリクエストしたページが表示されました!

1ページ表示するだけでもこれほどのやり取りが行われているんですね...

Webページの表示については、キャッシュやクッキーなど他にも重要な機能があるので、そちらも今後まとめていきたいと思います。

今回は以上になります!



↓↓私の師匠、もりけんさんの武骨日記。問題集、要チェック

kenjimorita.jp