ブラウザはどうやってホームページにアクセスしているのか? その4

インフラ, ネットワーク

この記事は最終更新日から1年以上が経過しています。

はじめに

「ブラウザはどうやってホームページにアクセスしているのか?」を全4回でまとめました。
前回はDNSを用いてIPアドレスを取得する方法について説明しました。
最終回であるその4では、サーバからデータを受け取る方法について説明します。

  1. ネットワークの基礎知識(IPアドレスとドメイン名)
  2. サーバにデータをリクエストする
  3. サーバのIPアドレスを取得する
  4. サーバからデータを受け取る ← 今回はココ

プロトコルスタック

HTTPリクエストを作成し、DNSから送信先のIPアドレスを取得しました。
最後に、作成したHTTPリクエストを目的のサーバに送信します。
ブラウザにはメッセージを送信する機能がないため、OSに送信を依頼します。

OSがメッセージを送信するための通信プロトコル郡をプロトコルスタックと呼びます。
以下に記したものが、プロトコルスタックの一例です。
データの送信をしたいときは上のレイヤから下のレイヤへ送信を依頼することで、データ送信をしています。

Layer Protocol
Application HTTP
Transport TCP
Internet or network IP
Link or data link Ethernet
Physical IEEE 802.3ab

Socket通信

HTTPリクエストを送信したい場合は、Socketライブラリを使用してデータを送信します。
データ通信時には受信側/送信側の両方でソケットというデータの出入り口を作成して、それらを接続することで通信を行います。
クライアントがデータを受信するまでの流れを4ステップに分けて説明します。

Socket通信についての図

ソケットの作成

アプリケーションは直接ソケットを触ることができないため、Socketライブラリを通してソケットの作成を行います。
ソケットはSocket関数にサーバのIPアドレスを渡すことで作成でき、ソケットの作成が完了するとソケットの識別子であるディスクリプタが返ってきます。
1つのソケットにつき1つのサーバとしか通信が行えないため、ブラウザで2つのタブを開いている場合はソケットが2つ必要になります。

サーバのソケットに接続する

クライアントはソケットを作成した後、サーバ側のソケットへ接続するようプロトコルスタックに依頼します。
サーバに接続する際はSocketライブラリのconnect関数にディスクリプタ、IPアドレス、ポート番号の3つを渡すことで接続を確立してくれます。

データの送受信

接続確立後はソケットにデータを入れるだけで、相手にデータを届けることができます。
データの送受信を行うためにはSocketライブラリのread/write関数を使用します。
上述したようにブラウザにはデータを送信する機能がないため、OSにデータの送信をお願いする必要があります。
このときにブラウザとOSがデータのやりとりをするために、受信バッファ/送信バッファというものを使用します。

ブラウザは送信したいデータを送信バッファに書き込むことで、OSにデータを渡すことができます。
同様に、OSは受信したデータを受信バッファに書き込むことで、ブラウザにデータを渡すことができます。

接続を切断する

データの送受信が終了した場合、通信の切断フェーズに入ります。
Socketライブラリのclose関数を使うことで、接続を切り、ソケットを抹消することができます。

最後に

Socket通信を使用してリクエストメッセージを送信し、レスポンスメッセージを受け取ります。
受け取ったレスポンスメッセージをもとに、受信した内容をブラウザに表示します。
これによりホームページを表示することができます。

まとめ

  • 通信時に使用するプロトコル郡をプロトコルスタックという。
  • クライアントとサーバで通信を行うには、Socketライブラリを使用する。