HTTP(Hypertext Transfer Protocol)

HTTP(Hypertext Transfer Protocol)は、Webページを転送するためのサーバー/クライアントシステムのプロトコルです。
Yahooなどのポータルサイト、ブログやソーシャルメディアなど、情報の取得や発信を行う際にHTTPが使われ、まさにインターネットの主役となるプロトコルです。

WebブラウザからのHTTPリクエストがWebサーバーに送られ、Webサーバーはテキストや静止画、動画など様々なWebコンテンツを返します。

HTTPプロトコル概要

では早速、Webページを表示するときにどのようなパケットが流れているのか、追いかけてみます。以下はWebブラウザからWebページを表示した際のパケットです。

HTTPパケットキャプチャ

HTTPはTCPを使用します。そのため、まず、クライアントとサーバー間で3ウェイハンドシェイクによるセッションの確立が行われます。「セッションの確立」とはクライアントとサーバー間で論理的な通信路(TCPコネクション)が確立し、双方向にTCPの通信が可能となったということです。この通信路はTCPコネクションが終了するまで使用されます。上図の上から3つのパケット(No5、6、7)が該当します。

次に、HTTPデータのリクエスト(要求)と、そのリクエストに対するレスポンス(応答)が行われます。
上図では、上から4つの目のパケット(No8)がHTTPリクエストメッセージであり、そのふたつ下(No10)がHTTPレスポンスメッセージになります。

HTTPリクエストメッセージ

Webブラウザからリクエストを送信する際、ホームページの取得などといった命令をメソッドとしてヘッダに付加し、WebサーバーへHTTPデータのリクエストメッセージを送信します。

下表にHTTPで使用される主なメソッドの種類を記載します。

メソッド名 説明
OPTIONS 情報を要求する
GET 情報を取得する
HEAD 情報のヘッダを取得する
POST 多くのデータを送信する
PUT サーバーへファイルをアップロードする
DELETE サーバーの情報を削除する
TRACE 要求メッセージをそのまま送信する
CONNECT サーバーとSSLトンネルなどを作成する

HTTPのリクエストメッセージは、命令を指定したメソッドに続き、さらに詳細な指定を行うためのHTTP一般ヘッダや要求ヘッダを持っています。これにより、どのようなドキュメントを取得するかを指定することができます。

HTTPリクエストメッセージに含まれる主なヘッダとして下表のようなものがあります。

要求ヘッダ 説明
Accept クライアントが受け入れるドキュメント形式のリスト(複数あり)を指定する
Accept-Language クライアントが受け入れ可能な文字コードのリスト(複数あり)を指定する
User-Agent リクエストを行ったWebブラウザの情報を指定する
UA-CPU WebブラウザのCPU種類(32ビットや64ビットなど)を指定する
Referer 直前に参照(アクセス)したURIを指定する
Accept-Encoding クライアントが受け入れる文字コードのエンコード方式(複数あり)を指定する
Host ホスト名およびポート番号を指定する
Connection コネクション処理を指定する
Cookie クッキー情報を設定する
DNT Do Not Trackingの略。追跡を禁止する

HTTPレスポンスメッセージ

Webサーバーはクライアント(Webブラウザ)からのHTTPリクエストメッセージを受け取ると、メソッドに応じて処理を行い、その結果を示したレスポンスコードを付加したHTTPレスポンスメッセージを返します。

HTTPレスポンスメッセージに付加される主なレスポンスコードとして下表のようなものがあります。

状態 コード メッセージ 説明
正常 200 OK クライアントの要求は正常に処理されている。
206 Partial Contend 情報の一部を応答した。
リダイレクト 301 Moved Parmamently 要求されたリソースは他のURIへ移動した。
304 Not Modified 要求されたドキュメントは変更されていない。
クライアントエラー 400 Bad Request 不正な要求。
401 Unauthorized 認証されていない。
404 Not Found 要求されたURIがサーバー上に存在しない。
408 Request Timeout 要求はタイムアウトした。
サーバーエラー 500 Internal Server Error サーバー内部に問題が発生している。
501 Not Implemented クライアントが要求した機能をサポートしていない。
503 Service Unavailable サービスを利用できない。

HTTPレスポンスメッセージもHTTPリクエストメッセージと同じように、詳細な情報を付加するために複数のHTTP一般ヘッダや応答ヘッダを持ちます。主な応答ヘッダとして下表のようなものがあります。

応答ヘッダ 説明
Cache-Control キャッシュの制御を指定する。
Set-Cookie クライアントのWebブラウザにクッキーを設定する。
Location 要求されたURIの正確な場所を指定する。
Server 応答を行うWebサーバーの情報を指定する。
Date 日付や時刻を指定する。
Last-Modified Webページの最終更新日を指定する。
ETag Webページを識別するための一意の情報を指定する。
Accept-Ranges 受け入れたWebページの範囲を指定する。
Content-Length Webページの大きさを指定する。
Connection 現在の接続の状態を指定する。
Content-Type Webページの形式を指定する

TCPセッションの終了

データの送信が終了したら、3ウェイハンドシェイクと同じような手順でセッションを終了します。セッションの確立は3回のやりとりでしたが、セッションの終了は4回のやりとりが必要となります。

まず、セッションの確立では、SYNパケットやACKパケットを使用しましたが、セッションの終了は代わりに、FINパケットとACKパケットを使用します。サーバーはデータの送信を終えると、FIN/ACKパケットをクライアントに送ります。
クライアントはFIN/ACKパケットを受け取ると、ACKパケットをサーバーに返します。これで、サーバーからのデータの送信は終了です。

次に、クライアントがサーバーにFIN/ACKパケットを送り、サーバーがACKパケットを返します。このACKパケットを受け取ることで、セッションは終了します。

HTTPのバージョン

最後に、HTTPのバージョンについて少しふれておきます。

HTTPのバージョンとして1.0と1.1がありますが、1.0では、ハイパーテキストを取得するための単純なメソッドと応答コードが記載されており、ホームページや画像を連続して取得するには、何回もコネクションを作成して要求(リクエスト)と応答(レスポンス)を繰り返す必要がありました。
これがバージョン1.1では、メソッドや応答コードが拡張されただけでなく、connectionヘッダを用いて複数のHTMLやXMLドキュメント、画像などのファイルを1回のコネクションで一度にまとめて取得できるようになりました。
さらに、一度取得したホームページを一時保存しておくキャッシュ確認などの機能も追加されています。
キャッシュ機能により、ホームページの更新をプロトコルで確認することができるうえ、一度取得したホームページと内容が変わらない場合には、ネットワークから再度ダウンロードする必要がないため、通信量が少なく済み、結果として高速表示が可能となりました。

現在ではバージョン1.1が主流となっています。