ブラウザでURLを入力してからページが表示されるまで【前編: ネットワーク編】
ブラウザでURLを入力してからHTML(例:index.html)が返ってくるまでの流れを、TCP/IPモデルのしくみに沿って整理してみました。
まずは、自分の環境を簡単に図にしてみます。
この環境でブラウザでURLを入力したとき、どんな処理が順番に発生しているのかを整理します。
TCP/IP参照モデルとは
インターネットの通信は、「TCP/IPモデル」と呼ばれる考え方に基づいて行われています。
通信を4つの層に分けて、それぞれが役割を分担することで、データを安全・確実にやりとりできるようになっています。
TCP/IPモデルの各層と役割
| レイヤー名 | 役割 |
|---|---|
| アプリケーション層 | HTTPやSMTPなど、ユーザーのアプリが使う通信 |
| トランスポート層 | データを順番に届けたり、失敗時に再送したりする(TCP/UDP) |
| インターネット層 | データの行き先をIPアドレスで決める(ルーティング) |
| ネットワークインターフェース層 | 近くの機器との通信(MACアドレス)、物理的なデータ転送 |
この「TCP/IPモデル」を自分の環境に当てはめてみます。
- 通信の流れ
ブラウザから始まり、OSで通信の準備をして、ルーターやプロバイダを通って、サーバーにたどり着きます。
では通信の流れがわかったところで、今度はURLを入力したときの動きをもう少し詳しくみていきます。
DNSに問い合わせてIPアドレスを取得する
Webページにアクセスするとき、まず「そのページがどこにあるか」を探し、取得する必要があります。
たとえば example.com のような名前から、通信に必要な IPアドレス を探し、取得します。
このドメイン名とIPアドレスの紐付けを行う仕組みが、DNS(Domain Name System)です。
ここでは、ブラウザが IPアドレス を探し、取得するところまでを整理します。
ブラウザでURLを入力して、DNSのIPアドレスが取得されるまで
ブラウザでURLを入力してからDNSのIPアドレスを取得するまで(TCP/IPモデルに基づく流れ)
おまけ: PCとルーターが起動してネットに接続されるまで
ブラウザがDNSリクエストを送るには、あらかじめPCがネットワークに接続されていて、DNSサーバーの場所を知っている必要があります。
たとえば:
- Macがネットに繋がるための IP アドレスを取得する(DHCP)
- DNS サーバーの場所(IP)を知っておく
- ルーターの MAC アドレスを調べて、正しくデータを送れるようにする(ARP)
これらを経て、PCとルーターが正しく接続され、DNSリクエストを送れる状態が整います。
この流れを整理すると、次のようになります。
スリーウェイハンドシェイクで通信を確立する
ここまでで、IPアドレスを取得できたため、ブラウザからWebサーバーにアクセスできる状態になりました。
ここからは、Webサーバーと実際にデータをやり取りするために必要な「通信の確立」について整理します。
TCP通信では、接続を開始する前に「スリーウェイハンドシェイク」と呼ばれる手順を実行し、
お互いの通信準備ができたことを確認します。
次は、このスリーウェイハンドシェイクの流れを確認していきます。
スリーウェイハンドシェイクで接続を確立する流れ
スリーウェイハンドシェイクで接続を確立する流れ(TCP/IPモデルに基づく流れ)
スリーウェイハンドシェイクで通信を確立する におけるポイント
- この時点では、まだHTTPリクエスト(GETなど)は送信していない。
- スリーウェイハンドシェイクは、ネットワーク層とトランスポート層で、安全なデータ転送経路を作るためのステップ
- このコネクション確立処理自体に、サーバーリソースを消費させる特性があり、大量に未完了接続を作られると負荷がかかる。
- これを悪用したものがSYN Flood攻撃(DDoS攻撃の一種)。
TLSハンドシェイクで安全な通信路を確立する
TCP接続が確立したあと、HTTPS通信の場合は、さらにTLSハンドシェイクを行って暗号化通信の準備をします。
次は、安全な通信路を確立するためのTLSハンドシェイクの流れを整理します。
TLSハンドシェイクで安全な通信路を確立する流れ(TCP/IPモデルに基づく流れ)
おまけ: WebサーバーがTLS証明書を取得するまで
HTTPS通信を行うには、サーバー側があらかじめTLS証明書を取得・設定しておく必要があります。
以下は、Let's Encryptを使ってTLS証明書を取得するまでの流れを示します。
安全な通信路の上でリクエストを送り、HTML(例: index.html)を受け取る
TLSハンドシェイクによって暗号化された安全な通信路(セッション)が確立されると、
クライアントとサーバーはこの通信路上で本格的なアプリケーション層(HTTPS)のやり取りを開始します。
ブラウザは「GET / HTTP/1.1」というリクエストを送信し、Webサーバーはルートパスに対応する index.html を探します。
サーバーにファイルが存在すれば、HTTPレスポンス(200 OK + index.html)を返し、ブラウザは受け取ったHTMLの解析(パース)を開始します。
HTML(例: index.html) を受け取る流れ(TCP/IPモデルに基づく流れ)
まとめ
ここまで、ブラウザでURLを入力してから、Webページ(例: index.html)が表示されるまでの一連の流れを、TCP/IPモデルに沿って段階的に整理してみました。
最後に、DNS問い合わせからTCP通信の確立、TLSハンドシェイク、そしてHTTPリクエストとレスポンスまでの流れを、まとめてみます。
次は、受け取ったHTML(index.html)がブラウザによってどのように解析(パース)・描画(レンダリング)されていくのかについて、整理していきたいと思います。
参考資料
Discussion