広告
広告
https://www.7key.jp/nw/technology/protocol/http1.html#http
HTTPはWeb サーバとクライアント(ブラウザ等)が通信を行うためのプロトコルで【HyperText Transfer Protocol】の略です。ほとんどの場合HTTP はWeb サーバとクライアント間で使われ、ほとんどの方はこれを経験したことがあるでしょう。今回は話をわかりやすくするために、ブラウザとWeb サーバ間の話にまとをしぼって進めていきます。
https://www.7key.jp/nw/technology/protocol/http1.html#request
HTTP は大別するとリクエストとレスポンスで構成されます。まずクライアントはサーバに向けてリクエストを送信します。リクエストの中身はいたって簡単で、「何を」「どうするか」という情報が書いてあります。まず「何を」の部分ですが、ここには「URI」が記述されています。HTML ドキュメントであったり何か別のファイルであったり、もしくはCGI プログラムかもしれません。それを示す部分が「何を」の部分となっています。
次に、「何を」で指定したURI のものを「どうするか」ですが、これは一種のコマンドのようなものでメソッドと呼ばれています。HTML をご存知の方は、<form method="POST">
のような記述をみたことあるでしょう。ここで指定しているのがメソッドです。このメソッドによって、Web サーバに何をさせるのかを指定するのです。ここでメソッドの中身ですが、「GET」と「POST」だけだと思っている方おられませんか?まぁ、主に使うコマンドはこの2種類ですし、残りのコマンドを許可しているWeb サーバはほとんどありません。ただ、以下のコマンドもあるということを覚えておいて下さい。
メソッド | HTTP | 命令内容 | |
---|---|---|---|
1.0 | 1.1 | ||
GET | ○ | ○ | URI で指定されたデータがファイルの場合はファイルの中身を返す。 CGI プログラムの場合はそのプログラムの出力データを直接返す。 |
POST | ○ | ○ | クライアントからサーバにデータを送信する。 |
HEAD | ○ | ○ | URI で指定されたファイルのメッセージヘッダのみを返送する。 ファイルの最終更新日や属性を調べる際に使用する。 |
PUT | ○ | ○ | URI で指定したサーバ上のファイルを置き換える。 見つからない場合は新規に作成する。 |
DELETE | ○ | ○ | URI で指定したファイルをサーバ上から削除する。 |
PATCH | - | ○ | PUT とほぼ同じだが、置き換える差分のみをサーバに送信する。 |
TRACE | - | ○ | サーバが受け取ったリクエストラインとヘッダをそのまま返信する。 |
OPTIONS | - | ○ | 通信オプションを通知したり調べたりする際に使用する。 |
LINK | - | ○ | 他の情報との関連付けを行う。 |
UNLINK | - | ○ | 関連付けを削除する。 |
HTTP でサーバ上のファイルを削除したり書き換えたりできることはあまり知られていませんよね。Security の関係上許可していないサーバが大半なのは事実ですが、知ってて損はありません。この機会にぜひ覚えてください。
では、実際にHTTP リクエストの中身をみてみましょう。ブラウザのアドレス欄に「https://www.7key.jp/nw/http1.html」と入力してEnter キーを押すと、ブラウザは以下のようなリクエストメッセージを作成し、Web サーバに送信するのです。
01:GET /nw/http1.html HTTP/1.1 02:Referer: http://www.hogehoge.jp/ 03:Host: www.7key.jp 04:Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* 05:Accept-Language: ja 06:Accept-Encoding: * 07:Accept-Charset: * 08:User-Agent: Fget by key 09:Connection: keep-alive 10:Content-Type: application/x-www-form-urlencoded 11: 12:
まず一行目はリクエストラインと呼ばれます。この行によりリクエストの内容の大半が判ります。記述方法は、
[メソッド][空白][URI][空白][HTTP バージョン]
となっています。次に、上記例で[02]〜[10]行はメッセージヘッダと呼ばれています。この行は状況によって変化し、空白行が来るまでをメッセージヘッダとみなし、リクエストの付加的な情報を記述します。そして上記例では[11]行目のように空白行を記述し、もしサーバに送るデータがある場合は、上記例での[12]行目以降に記述することになります。この[12]行目以降のことをメッセージボディと呼びます。たったこれだけでHTTP リクエストは終わりです。クライアント(ブラウザ)はこの作業が終わると、後はサーバからのレスポンス待ち、ということになります。
https://www.7key.jp/nw/technology/protocol/http1.html#responce
次はサーバがクライアントに返すレスポンスについてです。まず、クライアントから送られてきたリクエスト通りにサーバは動作をします。そしてその動作の結果をレスポンスに格納し、クライアントに送りつけるというわけです。今回はまずレスポンスメッセージの中身をみてみましょう。
01:HTTP/1.1 200 OK 02:Date: Mon, 31 May 2004 13:22:46 GMT 03:Server: Apache/1.3.27 (Unix) PHP/4.3.1 mod_ssl/2.8.12 OpenSSL/0.9.6m 04:Connection: close 05:Transfer-Encoding: chunked 06:Content-Type: text/html; 07: 08:<http> 09:<head> 10:(以下省略) 11: 12:
まず1行目ですが、ステータスラインと呼ばれます動作の結果を示すステータスコードとレスポンスフレーズが記載されています。この二つは意味は全く同じなのですが、使用用途は全く違います。ステータスコードはリクエストの結果をコンピュータに向けて返す数値の値となっています(ステータスコードとレスポンスフレーズはHTTP コード表を参照下さい)。そして、[2]〜[6]行目をヘッダフィールドと呼びます。そして、上記例では[7]行目にあたる空白行が1行入った後に、URI で指定されたファイルの中身を記述していく格好となります。ここで、CGI をご存知の方はピンとくるのではないでしょうか。何がって以下の記述方法ですよ。Perl を例にとりますと以下のようになります。
print "Content-type: text/html;\n"; print "\n";
なぜいつも空白行を記入しなければならなかったのかこれでお分かりでしょう。この空白行がレスポンスメッセージのヘッダ部分とボディ部分を分ける、一種の目印となっているのです。こうして、クライアント(ブラウザ)はレスポンスメッセージを受け取り、中身を表示してめでたく終了…ではないのです。
例えば、文書だけで構成されているHTML ドキュメントの場合は本当にこれで終わりです。めでたしめでたしなんですが、実際は画像があったりIFRAME があったり、外部スクリプトファイルを読み込んだり、HTML ドキュメントを受け取るだけでは話が終わらない場合が多々あります。ここで一つリクエストの際の絶対的な決まりごとを覚えてください。リクエストメッセージに記入できるURI は一つだけです。もし、HTML ドキュメント内に画像が貼り付けてあったならば(<IMG>タグが記述してあったならば)、ブラウザはいったんHTML ドキュメントのレスポンスを受け取ったあと、レスポンスの中身に忠実にユーザの目に見える形に表示していくのですが、画像が貼り付けてあるところはひとまずあけておきます。残りを表示しつつも、そのあけてある画像のURI をリクエストメッセージに書き込み、更にリクエストを送るのです。HTML ドキュメントに画像が4個あった場合、ブラウザは計5回のリクエストを送ることになり、Web サーバも計5回レスポンスを返すことになります。このようにして、ブラウザはWeb ページを表示していくのです。
広告