3 Minutes NetWorking
No.72

3Minutes NetWorking

第72回HTTP(3) レスポンスヘッダ

■ レスポンス・開始行

インター博士

さて、ネット君。前回リクエストの開始行は説明したな。

ネット助手

え〜っと。メソッド + リクエストURI + HTTPバージョン でしたよね。

インター博士

うむ。つまり、以下のような行になる。

  • GET / HTTP/1.1 (CRLF)
  • GET /index.html HTTP/1.1 (CRLF)
  • HEAD /ex/extra.html HTTP/1.1 (CRLF)
  • POST /bbs/bbs.cgi HTTP/1.1 (CRLF)
ネット助手

間にスペースが必要で…。

インター博士

最後にCRLF、だな。
今回は、レスポンスの場合の開始行を説明しよう。

  • HTTPバージョン … サーバが使用できる最も高いHTTPのバージョン
  • ステータスコード … 3桁の数字で、リクエストに対する結果を表示
  • 応答フレーズ … ステータスコードの説明
インター博士

この順番で、3つの要素からなる。

ネット助手

最初のHTTPバージョンは、リクエストのHTTPバージョンと同じですか?

インター博士

うむ。サーバが使うことのできるHTTPのバージョンだな。
次がステータスコード応答フレーズ。これはまとめて説明したほうがいいだろう。

ネット助手

3桁の数字と、その説明?

インター博士

そうだ。どっかで聞き覚えがあるかもしれんな。

ネット助手

…。

インター博士

予想された反応をありがとう
相変わらず君は期待を裏切らないな。

ネット助手

えへへ。

インター博士

褒めてねぇ

ネット助手

はぅっ。

インター博士

ともかく、これだ。見覚えは?

コマンドとレスポンス

[Figure58-05:telnetでのFTP]

ネット助手

まいくろそふとえふてーぴーさーびす。
USER で 331 Password required for …。FTP?

インター博士

そうだ。FTPもレスポンスとして3桁の数字とその説明を送っていたな。
FTPの場合は「レスポンスコード」と言ったが。

ネット助手

あ〜、そういえばそんなのもありました。

インター博士

それと同様に、HTTPでもサーバはレスポンスとして状態を示す3桁の数字を返す
これがステータスコード。

ネット助手

じゃあ、もちろんFTPと同じように数字に意味があるんですね?

インター博士

それはそうだ。無意味な数字を送ってもしょうがないだろう。
FTP同様、1桁目でまず意味がある。こうだ。

コードクラス名説明
1xxInformationalリクエストは受け入れられたが、処理中である。
2xxSuccess リクエストは正常に受け入れられた。よって要求された動作を行った。
3xxRedirectionリクエストは受け入れられたが、さらに処理を続行する必要がある
4xxClient Errorリクエストはエラーがあるか、実行できないリクエストである
5xxServer Error サーバの状態により、そのリクエストは実行できない

[Table72-01:ステータスコード]

ネット助手

は〜。100番台、200番台…って意味が違うんですね。

インター博士

うむ。この違いをクラスという。上の表のクラス名がそれだ。
例えば、100番台のステータスコードは「Informational(情報)」クラスってことだな。

ネット助手

クラス。なるほど。

■ ステータスコード

インター博士

さて、HTTP/1.1では以下のステータスコードがある。

  • 100 101
  • 200 201 202 203 204 205
  • 300 301 302 303 304 305 306 307
  • 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
  • 500 501 502 503 504
ネット助手

ひーのーふーの…、39種類ですか。ずいぶん多いですね。

インター博士

うむ。これを全部説明してもいいが、覚え切れないだろう。

ネット助手

確実に。それだけは断言できます。

インター博士

いばるな

ネット助手

はぅっ。

インター博士

なので、よく使われるものを説明しよう。

  • 200 OK
インター博士

これは「OK」だから、リクエストが正常であったということだ。
リクエストがメソッド「GET」だったなら、リクエストURIのファイルを送ることになる。

ネット助手

他のメソッドだったなら?

インター博士

「HEAD」ならリクエストURIのファイルを送った場合のレスポンスヘッダだけを返す。
それ以外の場合はまた説明しよう。

  • 301 Moved Permanently
インター博士

リクエストURIのファイルは、別のURIに割り当てられているので、そっちをリクエストしてください、というレスポンスだ。

ネット助手

んん? どういう意味です?

インター博士

これは、「http://www5e.biglobe.ne.jp/~aji/3min」のように最後がファイル名でなく、さらに「/」がない場合の返答だ。

ネット助手

そういう場合は、3minってファイルを探して、ない場合は「3min/」とみなすんでしたっけ。

インター博士

そうだ。なのでクライアントに対し、「それは『~aji/3min/』ではないんですか? そっちを要求してください」と返すのだよ。

[Figure72-01:301 Moved Permanently]

ネット助手

は〜。2度もリクエストを送ることになるんですか。
結構面倒くさいですね。

インター博士

うむ。なので、URIを書くときは最後の「/」をちゃんとつけなければ駄目なのだよ。
あぁ、「http://www5e.biglobe.ne.jp」のように、ドメイン名のすぐ後ろの「/」は省略してもよい。これは自動的に「/」があるものと認識する。

ネット助手

何故ですか?

インター博士

「http://www5e.biglobe.ne.jp/~aji/3min」は、3minというファイルがある可能性があるからだな。「http://www5e.biglobe.ne.jp」はドメイン名しかないから、ファイルではないということがわかるからだ。

  • 400 Bad Request
インター博士

これは、HTTPメッセージの書式が間違っているというエラー。

  • 401 Unauthorized
インター博士

こっちは、認証失敗というエラー。

ネット助手

認証?

インター博士

特定のユーザしか見れないようにしてあるページなど、ユーザ名とパスワードの入力が必要な場合だな。

ネットワークパスワードの入力 エラーメッセージ401

[Figure72-02:認証画面](左)
[Figure72-03:401 Unauthorized](右)

インター博士

InternetExplorerでは、左のような画面がでてきてパスワードを入力する必要がある。
右は、認証に失敗した時の、MicrosoftIISでの401エラーメッセージ画面だ。

  • 403 Forbidden
インター博士

403は、リクエストを正しく受け取ったが、それをサーバが実行したくないというエラーだ。

ネット助手

実行したくないって、なんか我侭だ。

インター博士

そういうわけではないのだが。
例えば、CGIなどを違うサーバから呼び出すことを禁止していたりする場合はこのエラーになる。

  • 404 Not Found
インター博士

リクエストURIのファイルが存在しないエラーだな。
一番見かけるエラーかもしれん。

エラーメッセージ404

[Figure72-04:404 Not Found]

ネット助手

あ〜、なんかよく見るかも。

  • 500 Internal Server Error
インター博士

サーバはリクエストを実行しようとしたが、できなかった、というエラーだ。サーバ側の問題で発生する。
一番多いのは、CGIのプログラムが間違っている時だ。

ネット助手

へ〜。プログラムが間違っている。

インター博士

500のエラーは必ずプログラムミス、というわけではない。
一番多いのが、それだと言う話だ。

ネット助手

なるほど。

インター博士

自作CGIやら、サーブレットやらで、このエラーが多発して、もう泣きながらプログラムコードを見直したり画面を殴りつけたり、まぁ人生を垣間見せるエラーだな。

ネット助手

罪作りなエラーですねぇ。

■ 実際の開始行

インター博士

さて、リクエスト、レスポンスの開始行を説明したわけだが。
HTTP/1.0ならば、この開始行だけでもクライアント・サーバ間のやりとりが行える。

ネット助手

HTTP/1.1では駄目なんですか?

インター博士

HTTP/1.1では開始行のあとに続くヘッダが必要なのだ。

ネット助手

ふむ、では次はそのヘッダの話ですね。

インター博士

それもいいが、それは次回にして、せっかく説明したこの開始行をつかってやりとりしてみよう。

ネット助手

お、それはなんかすごそうですね。
ということは、まずブラウザを使うんですね。

インター博士

ブラウザを使ったら、こちらは何もできないではないか。
telnetを使うのだ。前も話したが、telnetこそは基礎だ。

ネット助手

もしかして、telnetで開始行を打ち込んでいくんですか?

インター博士

さっしがいいな、その通り。 ではいくぞ。

  • c:\> telnet
インター博士

まずtelnetを起動して。

telnetで接続

[Figure72-05:telnetで接続]

インター博士

openでWebサーバのURIを入力するのだが、必ずURIの後ろにスペースを入れて80と入力すること。
そうしないと、telnet接続を行ってしまうからな。

ネット助手

ということは、スペースのあとに80っていれると、Webサーバへ接続しにいくってことですか?

インター博士

そうだ。スペースの後ろにポート番号を入れるわけだな。
80はHTTPの標準ポート番号だ。

接続後の画面

[Figure72-06:接続後の画面]

ネット助手

あらら? まっくらですよ?
それにキーを押してもなにもでてこない。

インター博士

まっくらなのは、Webサーバに接続しただけだからだ。telnetサーバと違ってWebサーバは接続したからといってなにか反応してくれるわけではない。反応してほしければ、リクエストを送らなければ。

ネット助手

でも、キーを押しても駄目ですよ。

インター博士

それはローカルエコーがオフになっているからだ。
ローカルエコーとはなんだった?

ネット助手

え〜っと。自分自身で表示するエコーと、第55回で。

インター博士

そうだ。Webサーバはtelnetでの接続を前提としていないのでリモートエコーを返さない。
さて、コマンドプロンプトでは面倒って人は、前に出てきた「TeraTermPro」というtelnetクライアントを使ってもいいぞ。 ▼ link

ネット助手

コピーアンドペーストが簡単ですからね。

インター博士

うむ。
では、リクエストの開始行を入力しよう。

  • GET /~aji/ HTTP/1.0
インター博士

ポイントはGETとHTTPは大文字だからな。小文字だとエラーになるから注意が必要だ。
メソッド、リクエストURI、HTTPバージョンの間にはスペースも忘れるな。

ネット助手

大文字…、スペース…っと。

リクエスト開始行

[Figure72-07:リクエスト開始行]

インター博士

さて、これを入力したらエンターだな。

ネット助手

エンター…。
あれ? エンターを押したけど何も起きませんよ?

インター博士

それはそうだ。開始行のあとにエンター、つまりCRLFは必ず必要だったろう?

  • GET / HTTP/1.1 (CRLF)
  • GET /index.html HTTP/1.1 (CRLF)
  • HEAD /ex/extra.html HTTP/1.1 (CRLF)
  • POST /bbs/bbs.cgi HTTP/1.1 (CRLF)
インター博士

上であげた例だが、開始行のあとにはCRLF。
つまり、開始行入力後にエンターを一回押しただけではこのCRLFを入力したことになるのだよ。

ネット助手

ということはつまり、リクエスト終わりをしめすエンター(CRLF)がもう一度いるってことですね。

インター博士

そういうことだな。

ネット助手

へへぇ。では、エンター。

レスポンスメッセージ

[Figure72-08:レスポンスメッセージ]

ネット助手

おおっ。

インター博士

赤い枠内が、レスポンス開始行。ちゃんと「200 OK」になっているだろう?
さらに、青い枠内がメッセージヘッダ。緑の枠内はメッセージ本体。この場合はHTMLファイルだな。

ネット助手

お〜、すごいすごい。
ちゃんと送られてきてる。

インター博士

当たり前だ。
では、「200 OK」ばかりではつまらないので、今度はこういうリクエストを送ろう。

リクエスト開始行・2

[Figure72-09:リクエスト開始行・2]

ネット助手

リクエストURIの最後がファイル名じゃないのに「/」がない。
「301 Moved Permanently」でしたっけ。

エラー301

[Figure72-10:エラー301のレスポンス]

インター博士

うむ。ちゃんとレスポンス開始行に「301 Moved Permanently」が。
メッセージヘッダには正しいURI「/~aji/3min/」があるだろう?

ネット助手

お〜。すごい。なんか感動。

インター博士

このように、HTTPはリクエスト・レスポンスの開始行を使ってやりとりをすることがわかったと思う。

ネット助手

えぇ、存分に。

インター博士

うむ。
では、今回はこれぐらいにしておこう。

ネット助手

はい。

インター博士

次回は開始行の後ろに続くメッセージヘッダの話をしよう。

ネット助手

いぇっさ〜。
3分間ネットワーキングでした〜♪

CGI
[Common Gateway Interface]
共通ゲートウェイインタフェース。
Webサーバがリクエストを受けて、(サーバ内にある)プログラムを起動するための仕組み。
プログラムを使うことにより、要求によってページを作成することができる。掲示板やショッピングサイトなどで使用されている。
サーブレット
[Servlet]
Java言語を使った、Webページを要求にしたがって作成するプログラム。
簡単に言うと、Javaを使ったCGI。
ローカルエコーがオフ
オンにしたい場合は、telnet後、open前に「set Local_Echo」と入れておいてください。
ネット助手ネット君の今日のポイント
  • レスポンスメッセージの開始行は、HTTPバージョン、ステータスコード、応答フレーズからなる。
  • ステータスコードは受け取ったサーバの結果を表示する3桁の数字。
    • 200番は「OK」で正常。
    • 400番台はエラー。
    • 500番はサーバのエラー。

3 Minutes NetWorking No.72

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