3 Minutes NetWorking
No.73

3Minutes NetWorking

第73回HTTP(4) メッセージヘッダ

■ 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種類に分類されるわけですね。

インター博士

そういうことだな。
では、どのようなメッセージヘッダが存在するかというと。

要求応答一般エンティティ
AcceptAccept-RangesCache-ControlAllow
Accept-CharasetAgeConnectionContent-Encoding
Accept-EncodingETagDateContent-Language
Accept-LanguageLocationPragmaContent-Length
AuthorizationProxy-AuthenticateTrailerContent-Location
ExpectRetry-AfterTransfer-EncodingContent-MD5
FromServerUpgardeContent-Range
HostVaryViaContent-type
If-MatchWWW-AuthenticateWarningExpires
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の形で記述される

3 Minutes NetWorking No.73

管理人:aji-ssz(at)selene.is.dream.jp