■ HTTPメッセージ(承前)
さてさて。HTTPで使われる要求と応答メッセージの話を続けているわけだが。
今回で3回目ですね。
そうだな。HTTPメッセージはこういう形だったな。
[Figure71-03:リクエストメッセージ]
[Figure71-04:レスポンスメッセージ]
でしたでした。
で、前回と前々回で開始行を説明したんでしたよね。
うむ。開始行は名前のとおり1行で形成される要求と応答の内容と状態をしめすものだ。
実際、開始行だけあればHTTPは可能なつくりになっている。
そうでしたっけ?
確か、前回そんなことをおっしゃっていたような。
前回、telnetを使ってやってみせたろう?
忘れたのか?
いえいえいえ。覚えてますよ、もちろん。えぇ。
あははは。
ふむ。そこまで白々しい嘘をつかれると逆にすがすがしいな。
そうですか? すがすがしいですか、僕。えへへ。
褒めてねぇ。
はぅっ。
ともかく、HTTP/1.0ならば開始行だけでもHTTP要求は可能だ。
メッセージヘッダはHTTP/1.1で必要なのだよ。
ははぁ。HTTP/1.1で。
上の図を見てわかるとおり、メッセージヘッダは4種類あるな。
一般ヘッダ、要求ヘッダ、応答ヘッダ、エンティティヘッダの4種ですね。
そうだな。
今回は、これらのメッセージヘッダについて説明しよう。
はい。
■ メッセージヘッダ
基本的なHTTPのやりとりは、開始行、つまりリクエスト開始行とレスポンス開始行があればそれで済む。
メッセージヘッダはそれ以外、つまり要求のパラメータを決めたり、コンテンツの内容を交渉したり、より詳細な情報を提供したりするのに使われる。
は〜。つまり、より細かいところをサポートするためにあるってことですか?
ま、そういうことだな。
このメッセージヘッダは、いくつかのヘッダからなりたっている。
一般ヘッダ、要求ヘッダ、応答ヘッダ、エンティティヘッダ、ですよね。
あ〜、確かにそうなんだが。
これは説明のしかたが悪かったな。つまり1つの情報を記入するヘッダがいくつもあってメッセージヘッダを形成するのだよ。
1つの情報を記入するヘッダ? それがいくつもある?
そう。そして、ヘッダの情報の種類によって、4つのグループにわかれるということだな。
?
まぁ、図にしたほうがわかりやすいか。
[Figure73-01:メッセージヘッダ]
このようにいくつもメッセージヘッダがある、ということだ。
? じゃあ、一般ヘッダとか、要求ヘッダとかはなんなんです?
これらのメッセージヘッダの分類だな。
書かれるメッセージヘッダの内容によって、分類されている、ということだな。
はは〜。
実をいうと、メッセージヘッダは一般ヘッダ、要求ヘッダなどの分類と合わせて、もう1つ分類がある。
まだあるんですか?
うむ。エンドツーエンドとホップバイホップという分類だ。
なんです? 終わりと終わり、ホップとホップって?
うむ、これは主にプロキシを使った場合、メッセージヘッダをどうするかという違いだ。
ははぁ。プロキシ。
[Figure73-02:プロキシとメッセージヘッダ]
は〜。途中で変わるのと、変わらないの、ですか。
まぁ、詳しくはプロキシのところで説明するが、そう覚えてもらっていい。
さて、メッセージヘッダの記述方法だが、以下のとおり。
- ヘッダー名:ヘッダー内容 CRLF
コロンでヘッダー名と内容を区切って、最後にCRLFだな。
例としては、前回telnetでHTTPをやった時の画像をみてみよう。
[Figure72-08:レスポンスメッセージ]
青の枠内がメッセージヘッダの部分だ。
これを見てわかるように、名前、コロン、内容、改行となっているだろう?
Age:1
とかですね。
■ メッセージヘッダの種類
このメッセージヘッダは、前も話したように要求の詳細な内容や、コンテンツの内容の交渉や、より詳細な情報を記述するためのものだ。
記述される情報により、いくつものヘッダが存在する。
で、要求、応答、一般、エンティティの4種類に分類されるわけですね。
そういうことだな。
では、どのようなメッセージヘッダが存在するかというと。
要求 | 応答 | 一般 | エンティティ |
---|---|---|---|
Accept | Accept-Ranges | Cache-Control | Allow |
Accept-Charaset | Age | Connection | Content-Encoding |
Accept-Encoding | ETag | Date | Content-Language |
Accept-Language | Location | Pragma | Content-Length |
Authorization | Proxy-Authenticate | Trailer | Content-Location |
Expect | Retry-After | Transfer-Encoding | Content-MD5 |
From | Server | Upgarde | Content-Range |
Host | Vary | Via | Content-type |
If-Match | WWW-Authenticate | Warning | Expires |
If-Modified-Since |   | Last-Modified | |
If-None-Match | |||
If-Range | |||
If-Unmodified-Since | |||
Max-Forwards | |||
Proxy-Authorization | |||
Range | |||
Referer | |||
TE | |||
User-Agent |
[Table73-01:メッセージヘッダ]
ふおわぁ!
と、まぁ。これぐらいのメッセージヘッダがある。
あと、エンティティヘッダには、独自に拡張ヘッダを作ってもよい。その場合は、サーバ、UAの両方がその拡張を理解してないと駄目だがな。
博士、平然と説明しないでくださいよ。
ん?どうしてだ?
こんなに一杯のヘッダが使われるんですか?
とてもじゃないけど、覚えられませんよ。
まぁ、確かにネット君じゃなくてもちょっと覚えるのは大変だな。
だが、実際に使われるのはこの中のいくつかだ。
あぁ、そうなんですか?
それはちょっと安心です。
■ 代表的なメッセージヘッダ
さすがに全部説明するのは手間がかかる上に、意味がない。
この中でよく使われるもののみ説明していこう。
お願いします。
- Host (Request/End-to-End)
まずは、リクエストヘッダの中で、Hostヘッダ。
これは、唯一必須のヘッダだ。
へ? これ以外は必須じゃないんですか?
うむ。実はそうだ。
これには宛先サーバのドメイン名が入る。
はぁ。宛先サーバのドメイン名。
……なんでそんなのが必須なんですか? だって、HTTP要求メッセージが届いているんだから、わざわざサーバのドメイン名なんかいらないでしょ?
うむ、確かにそう思えるのも間違いではない。
だが、HTTP/1.1から実装されたバーチャルホスト機能のため、この項目は必須、なのだよ。
ばーちゃるほすと?
バーチャルなホスト?
まぁ、それは先で説明しよう。
- User-Agent (Request/End-to-End)
これは送信元ユーザエージェントの情報だな。
簡単にいえば、使っているブラウザの種類を送るってことだ。
へ〜。ブラウザの情報って何に使うんですか?
そうだな…一番使うのは、JavaScriptかな?
JavaScriptはブラウザによって、微妙に使えるものが違ったりするからな。
は〜。
なので、JavaScriptを記述する際に、User-Agentヘッダの情報から使っているブラウザを判断し、違うスクリプトを実行する、という命令を入れておくことがある。
ちなみに3分間ネットワーキングでの用語説明にも、使われているぞ。
var brw_v = navigator.appVersion.charAt(0);
var brw_n = navigator.appName.charAt(0);
var IE = false;
var N4 = false;
var N6 = false;
if((brw_v >= 4)&&(brw_n == "M"))IE = true;
if((brw_v >= 5)&&(brw_n == "N")){N6 = true;}else if ((brw_v >= 4)&&(brw_n == "N")){N4 = true;}
こういうのだな。
User-Agentヘッダに書かれている文字列を抜き出して、どのブラウザが使われているか判断しているのだ。
へ〜。
- Referer (Request/End-to-End)
refererは参照元、つまりそのページを要求する前のページのことだ。
前のページといっても、単に前に見ていたページではなく、ハイパーリンクしていく前のページ、ということだ。
え〜っと、つまり、リンクしていった場合のリンク元ってことですか?
そういうことだな。
なので、直接アドレスを入力した場合などには使われない。
- Accept (Request/End-to-End)
これはブラウザが使用可能なファイルの種類を指定する場合に使う。
古いブラウザなどでは使えないファイル形式があったりするからな。
そういうときは、Acceptヘッダで指定するってことですか。
そういうことだ。
- Accept-Encoding (Request/End-to-End)
- Accept-Language (Request/End-to-End)
- Content-Encoding (Entity/End-to-End)
- Content-Language (Entity/End-to-End)
Acceptの2つは、要求側が受信可能なエンコーディングと言語を通達するのに使う。
Contentの方は、応答側が送ったデータのエンコーディングと言語を通達するのに使う。
エンコーディングってなんです?
まぁ、簡単にいえば圧縮方式だな。Content-Encodingで省略されていた場合、無圧縮ということになる。
- Content-Type (Entity/End-to-End)
- Content-Length (Entity/End-to-End)
応答のデータのファイル形式と、その長さ(サイズ)を通知するのに使うメッセージヘッダだな。
- Last-Modified (Entity/End-to-End)
応答のデータの最終更新日を示すヘッダだ。
- ETag (Response/End-to-End)
こっちは、応答データの識別子だな。
キャッシュしたデータとの比較に使ったりする。
キャッシュしたデータとの比較? それって新しくページが更新されたとかされていないとか調べるってことですよね。
さっきのLast-Modifiedじゃ駄目なんですか?
うむ、確かにLast-Modifiedもキャッシュデータの比較に使うが。
秒単位とかの場合、last-Modifiedは信用できないこともある。そういう時にはETagを使うのだよ。
- Connection (General/Hop-by-Hop)
Connectionは要求、応答の両方で使う一般ヘッダだ。
これはHTTP/1.1でのキープアライブ機能で使われる。
きーぷあらいぶ?
キープアライブ機能については、また先で話そう。
ともかく、代表的なメッセージヘッダはこのぐらいだな。
は〜、代表的なものでも結構あるんですねぇ。
■ 実際のメッセージヘッダ
では、実際にどのようなメッセージヘッダが送受信されているのか、一例をあげてみよう。
お? ってことはまたtelnetですか?
いや、telnetでは応答のメッセージヘッダを見ることはできるが、要求のメッセージヘッダを確認することができん。
要求を手動で入力しなければいけないからな。
では、どうするんです?
パケットキャプチャソフトを使う。
今回使ったのは、etherealというソフトだ。 ▼ link
ははぁ。なんか悪いことにも使えそうなソフトですね。
悪用すればな。うまく使えばネットワーク管理にも使えるし、ネットワークの流れを知るのにもの凄く役に立つソフトだ。
そうですねぇ。流れているパケットの中を見ることができるんですからね。
ともかく、「Roads to Node」のホームへ、HTTP要求を出してみよう。
使用したブラウザはInternet Explorer6.0 SP1だ。
[Figure73-03:リクエスト]
赤い枠内が、メッセージヘッダだ。
は〜。
博士、「バックスラッシュr」、「バックスラッシュn」ってなんですか?
あぁ、CRLFのことだ。改行コードだな。
Accept、Accept-Language、Accept-Encoding、If-Modified-since、User-Agent、Host、Connection、ですか。
各ヘッダの終わりにはCRLF、そしてメッセージヘッダ全体の終了にCRLF。
ははぁ。説明された通りですねぇ。
当たり前だ。
今度はサーバからのレスポンスだ。
[Figure73-04:レスポンス]
いくつか説明していないメッセージヘッダもあるが、大体こんな感じだな。
メッセージヘッダの下には、要求されたデータ、つまり「Roads to Node」のホームページのデータが入っていることもわかる。
なるほど。
このように、メッセージヘッダを使って、開始行にはない情報をやりとりしていることがわかったかな?
はい、それはもう。
うむ。
では、今回はこれぐらいにしておこう。
了解です。 3分間ネットワーキングでした〜♪
- エンドツーエンド
- [End to End]
- ホップバイホップ
- [Hop by Hop]
- プロキシ
-
[Proxy]
HTTPを代理すること。詳しくは後述。
- バーチャルホスト
-
[Virtual Host]
1つのWebサーバアプリケーションに、複数の異なるドメイン名を持つWebサイトを持つ機能。
- ファイルの種類
-
htmlやjpgなどの種類のこと。
正確にはメディアタイプ[Media-Type]という。
- 圧縮方式
- デフォルトで使用可能な圧縮方式は、gzip、LZW、zlibの3種類。
- パケットキャプチャ
-
ネットワーク上を流れるパケットを、宛先関係なく取得するためのソフト。
自分宛以外のパケットを見ることもできる。
スニファ[sniffer]とも言う。UNIXのtcpdumpなどが有名。
- ネット君の今日のポイント
-
- HTTPメッセージには、開始行で入りきらないその他の情報を付加するためメッセージヘッダを使う。
- メッセージヘッダはいくつも種類があって、任意にその中から選んで付加する。
- ただし、要求メッセージのHostヘッダは必須。
- 名前:内容 CRLFの形で記述される
- 参考リンク
-
- Ethereal http://www.ethereal.com/▲