HTTP(Hypertext Transfer Protocol)は、Webページを転送するためのサーバー/クライアントシステムのプロトコルです。
Yahooなどのポータルサイト、ブログやソーシャルメディアなど、情報の取得や発信を行う際にHTTPが使われ、まさにインターネットの主役となるプロトコルです。
WebブラウザからのHTTPリクエストがWebサーバーに送られ、Webサーバーはテキストや静止画、動画など様々なWebコンテンツを返します。
では早速、Webページを表示するときにどのようなパケットが流れているのか、追いかけてみます。以下はWebブラウザからWebページを表示した際のパケットです。
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が主流となっています。