サマリー
WEB+DB EXPRESS vol122より。HTTPは前述のようにWebでクライアントとサーバーが通信するときに使用されるアプリケーション層のプロトコルとなる。HTTPのHであるハイパーテキスト(Hypertext)は、複数の文書をむすびつける機能を指す。HTMLではリンクという機能を使ってハイパーテキストを実現する。
HTTPプロトコルの概要
HTTPのバージョンは現在ではHTTP/1.1が主流となっている。次世代のHTTPとしては高速化を目指して作られているHTTP2(ヘッダの圧縮やパイプライン処理)やHTTP3(QUIC利用)がある。
HTTP1.1ではテキストでデータをやり取りする仕様となっている。そのためブラウザの開発ツールを使うことで実際にやりとりするデータの中身を見ることができる。
HTTPではクライアントとサーバーで役割が大きく異なり、それぞれ送信するデータが異なる。HTTPで通信ができるのはクライアントからのみで、クライアントから送信されるのがHTTPリクエストとなる。これに対応してサーバーから通信されるのがHTTPレスポンスとなる。
HTTPでは取得したいリソースごとにリスエストを発行してレスポンスを受け取るというしくみになり、リクエスト単位でコネクションが切れる。毎回新しいコネクションでリクエストが始まるため通信の状態を保つことができない 。これをステートレスなプロトコルと称する。実際のWebアプリケーションでは状態を保ちたい事が多々あるため、Cookieのようなしくみを使ってHTTPに状態を持たせる。
クライアントからサーバーに対して送信されるものがHTTPリクエストで、構成としては「リクエスト行」「ヘッダーフィールド」「リクエストボディ」の3つから構成される。ヘッダーフィールドとリクエストボディの間は空行で区切られ、ヘッダーフィールドとリクエストボディは省略可能となる。以下に簡単なHTTPリクエストの例を示す
POST /index.html HTTP/1.1. ← リクエスト行
Host: ww.example.com ← ヘッダーフィールド
Content-Type:application/x-ww-form-irlencoded. ← ヘッダフィールド
foo=hoge&bar=fuga. ← リクエストボディ
リクエスト行ではサーバーに対してどのようなリクエストを送りたいのかを表す。データフォーマットとしては「メソッド」「リクエストターゲット」「HTTPバージョン」の順に記述れる。HTTP/1.1で規定されているメソッドは以下に示すようなものとなる。
これらの中で多く使用されるものはGETとPOSTとなる。GETは指定されたリクエストターゲットからデータを取得するメソッドで、POSTはサーバーに対してデータを送信したい時に使う。
リクエストターゲットは、取得したいリソースのパスを指定する。例で示されているものは指定されたURLのホスト名以下のパスとなる。(ホスト名はIPアドレスに変換されて、インターネットそうでのパケット送信に使われるので、アプリケーション層には現れない)
ヘッダーフィールドは、「フィールド名」「値」の2つの要素で構成される。これらには多くの種類がある(例:Accept-Langusge,Authorization,Content-type,Host等)
リクエストボディは、Webサーバーにデータを送信したいときに利用する。送信するデータの形式はヘッダーフィールドのContent-Typeで指定する。Content-Typeには様々な形式が指定できるが、よく使われる例として、application/x-www-form-urlencodedがある。例としては以下のようなデータで表される。
key=value1 & key2=value2
key=valueの形式でパラメータ名と値を指定して&で複数のパラメータをつなぐ。
これまで述べたリクエストに対して、サーバーから返されるHTTPレスポンスは「ステータス行」「ヘッダーフィールド」「レスポンスボディ」の3つの要素から構成される。リクエストと同じようにヘッダーフィールドとレスポンスボディは空行で区切られており、ヘッダーフィールドとレスポンスボディは省略しても良い。以下に簡単なHTTPレスポンスを示す。
HTTP/1.1 200OK ← ステータス行
Content-Type: text/html. ← ヘッダフィールド
Connection: close. ← ヘッダフィールド
<html> ← レスポンスボディ
<body>Hello World!!</body>. ← レスポンスボディ
<html>. ← レスポンスボディ
HTTPレスポンスの1行目は必ずステータス行となる。ステータス行はレスポンスの種類がなんであるかを表す。構成としては「HTTPバージョン」「ステータスコード」「メッセージ」の3との要素からなる。
HTTPバージョンは上記の例でHTTP/1.1で、ステータスコードはリクエストの結果を決められたコードで表す。それらは以下のようになる。
メッセージには任意の文字列(例:OK)が入る。主に開発者に情報を伝えるために利用されるので、サーバーによって入る文字列は変わってくる。
ヘッダフィールドはHTTPリクエストと同じで「フィールド名」「あたい」のペアが入る。よく使われるフィールド名としては「Cache-Control」「Content-Type」「Location」等がある。
レスポンスボディで送信するデータの形式は、ヘッダーフィールドのContent-Typeで、例えばHTMLならtext/html、PNG画像ならimage/pngのように指定する。
前述のようにステートレスなプロトコルであるHTTPに、状態管理の機能を追加したものがCookieとなる。主なデータの流れを下図に示す。
Cookieでは以下のような流れで状態管理の仕組みを提供する。
① WebサーバーがクライアントにCookieの値を設定するレスポンスを返す。 ② クライアントはCookieの値を保持し、WebサーバーへのリクエストにCookieの値を含める。 ③ WebサーバはCookieの値を読み込み、コンテンツを返す。必要に応じて新たなCookieの値を設定する
上記のしくみを実現するために使われるヘッダーフィールドがCookieとSet-Cookieとなる。またこの時Cookieに多くの値を保持すると通信効率が悪くなるため、通常は識別子のようなデータを保持するのに留め、状態管理はWebサーバーにて行うことがほとんどになる。
クライアントがWebサーバーに接続してレスポンスコンテンツを受け取る際に、コンテンツには変更頻度の高いものと低いものがあり、変更頻度の低いコンテンツを毎回送信するのは効率が悪くなる。前回取得したコンテンツをクライアント側でキャッシュしておいて、コンテンツの変更がない場合には、ローカルのキャッシュを使うことにすれば無駄を省くことができる。
このように前回のリクエストで取得したコンテンツと中身が同じかどうかを判断して、中身が同じであればコンテンツの送信を省略する機能がHPPTにはある。コンテンツの中身が同じかどうかを判断する方法として、最終更新時間を使う方法とユニークな識別子を使う手段がある。
Webサーバーでは、通常1つのWebアプリケーションしかホスティングできないが、1つのWebサーバーでも複数のWebアプリケーションを提供できる機能が「バーチャルホスト」となる。
HTTPリクエストの中には、ホスト名はIPアドレスに変換されてインターネットそうでのパケット通信で使われるため、アプリケーション層のプロトコルに必要がないため、Webアプリケーションのホスト名の情報は含まれない。よってアプリケーション層では、どのホスト名でアクセスされたのかわからない。
そこでHPPTにホスト名の情報を追加するために追加されたのがHostヘッダーフィールドになる。Hostヘッダーフィールドを含むHTTPリクエスト例は以下のようになる。
GET /index.html HTTP/1.1
Host: www.example.com
WebサーバーはHostヘッダーフィールドの値を読み込み、どのホスト名でアクセス避けているかを判定し、返すコンテンツを決める。HostヘッダフィールドはHTTP/1.1以降では必須のヘッダフィールドとなる。
次回はWebサーバーについて述べる。
コメント
[…] 次回はHTTPSについてもう少し詳細に述べる。 […]
[…] WEB+DB EXPRESS vol122より。前回はクライアントとサーバーを結ぶHTTPのプロトコルにいて述べた。今回はサーバー技術について述べる。 […]
[…] そもそも、インターネットでの通信はTCP(Transmission Control Protocol)やIP(Internet Protocol)で規定された手順で通信パケットの送受信を行い。そのプロトコルの上でウェブブラウザ(クライアント)とサーバーがHTTP(Hypertext Transfer Protocol)あるいはHTTPS(Hypertext Transfer Protocol Secure)を使って通信する形となる。TCP/IPがデータの塊を誤りなく送信する手段であるのに対して、HTTPはクライアントがサーバにリクエストメッセージとして「何を」「どうして」欲しいのかを伝え、サーバはこれにレスポンスメッセージを返すものとなる。この時、URLが「何を」、メソッドが「どうして」に当たる。 […]
[…] HTTPプロトコル概要 […]
[…] HTTPプロトコル概要 […]