これまで漠然とした理解で開発をしてきたため、最低限の事は言語化できるくらいにはなりたいなと思い、完全自分用の学習備忘録として残します。
流れ
- URLを解析する
- キャッシュにIPアドレスがないかを確認する
- DNSで対応するIPアドレスを取得する
- IPアドレスでえWebサーバーにリクエストをする
- ポート番号を割り当てる
- HTTPリクエストを送信する
- ロードバランサーでアクセスを調整する
- HTTPレスポンスを送信する
- レンダリングする
1. URLを解析する
例えば、https://twitter.com/login
というURLを叩く。
-
http
やhttps
など。→ プロトコル(安全に通信するためのルール) -
twitter.com
→ ドメイン(住所のようなもの) -
/login
→ パス
プロトコルはパソコンとサーバーが安全に通信するためのルール。https
のs
はsecure
のs
を指す。他のもので例えるならば、「サッカーする時は手を使ってはいけない。」というルールがあると同じように、webの世界にも外部と通信するときにルールがある。
-
http
: 通信内容が暗号化されていない- 通信が暗号化されていないため、送信内容(例: クレジットカード情報)が第三者に盗み見られたり改ざんされる可能性がある。
-
https
: 通信が暗号化されている- 通信が暗号化されており、送信内容(例: クレジットカード情報)が安全にサーバーへ送られるため、盗み見や改ざんのリスクがない。
2. キャッシュにIPアドレスがないかを確認する
ブラウザはまず、キャッシュ
にドメイン
に対応するIPアドレス
が保存されていないかを確認する。
キャッシュ
にhttps://twitter.com/login
のドメインtwitter.com
に対応するIPアドレス
が保存されているかを確認する。もしキャッシュにIPアドレス
があれば、DNS
への問い合わせをスキップし、それを使ってサーバーに直接リクエストを送る。
3. DNSで対応するIPアドレスを取得する
キャッシュにIPアドレスがない場合、ブラウザはDNSサーバーに問い合わせを行い、ドメイン
と対応するIPアドレス
を取得する。
4. IPアドレスでWebサーバーにリクエストをする
ブラウザは取得したIPアドレスを使用して、ターゲットのWebサーバー(ここではTwitter社のサーバー)に接続する。
5. ポート番号を割り当てる
-
サーバーのポート番号:
- Twitterのサーバーは、HTTPS通信を受け付けるためにポート443を使う。
- 通常、HTTPS通信はポート443を使うため、ブラウザはサーバーに対してポート443で接続する。
-
ローカルポート番号:
- ブラウザは、ローカルマシン上で一時的に使用するポート番号を割り当てる。これを「エフェメラルポート」と呼ぶ。
- 例えば、ブラウザが
https://twitter.com/login
にアクセスするとき、ローカルマシンのポート番号12345を割り当てて、サーバーのポート443に接続する。
-
通信の流れ:
- ブラウザは、サーバー(Twitter)のIPアドレスとポート443に接続する。
- 同時に、ローカルマシンのポート12345を使用してリクエストを送信する。
- サーバーからのレスポンスは、ポート443を通じて送信され、ローカルマシンのポート12345に戻る。
6. HTTPリクエストを送信する
通信が確立されると、ブラウザはHTTPリクエストをサーバーに送信する。リクエストの内容は以下。
- リクエストライン
- ヘッダー
- ボディ
7. ロードバランサーでアクセスを調整する
Twitter社が持つ複数のサーバーのうち、一つだけにアクセスが集中しないよう、それぞれのサーバーにアクセスを振り分け、負荷を分散させる。
8. HTTPレスポンスを送信する
サーバーはリクエストを処理し、HTTPレスポンスをブラウザに返す。レスポンスの内容は以下。
- ステータスライン
- ヘッダー
- ボディ
9. レンダリングする
ブラウザは受け取ったHTMLやCSS、JavaScriptを解析し、ページを表示する。
- ローディング
1. HTMLファイルをダウンロード
2. CSSファイルをダウンロード
- スクリプティング
3. Javascriptを実行(React, Vueフレームワークなど)
- レンダリング
4. レンダリングしたものをペインティングで画面に描画。