📡

ブラウザで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)がブラウザによってどのように解析(パース)・描画(レンダリング)されていくのかについて、整理していきたいと思います。

参考資料

https://gihyo.jp/book/2010/978-4-7741-4373-6
https://bookplus.nikkei.com/atcl/catalog/07/P83110/
https://zenn.dev/ak/articles/61d25099295372
https://github.com/tetz-akaneya/what-happens-when-JA

Discussion