HTTP メッセージ
クライアント | リクエストメッセージ ⇨ |
サーバー |
レスポンスメッセージ ⇦ |
メッセージの構造
開始行(リクエスト行またはステータス行) ヘッダフィールド 区切り(空行) メッセージボディ
リクエストメッセージの例です。index.htmlの送信を依頼しています。開始行だけですが、ヘッダフィールドが終わったことを示すために空行が必要です。
GET /index.html http/1.0
レスポンスメッセージの例です。
HTTP/1.1 200 OK (ステータス行) Date: Thu, 16 Feb 2012 00:23:31 GMT (ヘッダフィールド) Server: Apache/2.0.54 (Debian GNU... (ヘッダフィールド) Content-Type: text/html (ヘッダフィールド) (空行) <!DOCTYPE html> (ここからメッセージボディ) <html lang="ja"> <head> ...(以下略)
レスポンスメッセージの開始行はステータスコードです。"200"のOK、"404"の見つからないなどがあります。 100番台は通信エラー、200番台は正常終了、300番台はリダイレクト、400番台はクライアントエラー、500番台はサーバエラーです。日時やサーバー情報がヘッダに入り、空行の後ステータスが200ならばhtmlページの内容がメッセージボディとして送られます。
まずサーバーと接続します。telnet www.st.seiai.ed.jp 80と入力して[Enter]キーを押します。ここの図では[Enter]キーを表します。telnet は通信のためのソフトウェア、www.st.seiai.ed.jpはサーバーの名前、80はウェブサーバーの使っているポート番号です。
z1c2s@star00:~$ telnet www.st.seiai.ed.jp 80Trying 10.30.30.2... Connected to www.st.seiai.ed.jp. Escape character is '^]'.
ここまではtelnetの出力です。telnetがウェブサーバーと通信回路を用意してくれました。これからの入力はウェブサーバーへ送られます。
$で終わるプロンプトがないですね。サーバーとつながっている状態です。
リクエストコマンドを送信します。
GET / http/1.0![]()
![]()
最後は空行(Enterキーのみ)を押します。
応答です。
HTTP/1.1 200 OK Date: Thu, 16 Feb 2012 00:23:31 GMT Server: Apache/2.0.54 (Debian GNU/Linux) mod_python/3.1.3 Python/2.3.5 PHP/4.3.10-16 mod_perl/1.999.21 Perl/v5.8.4 Last-Modified: Tue, 12 Apr 2011 13:49:03 GMT ETag: "4782fa-a95-f47b71c0" Accept-Ranges: bytes Content-Length: 2709 Cache-Control: max-age=2700 Expires: Sun, 19 Feb 2012 20:22:42 GMT Connection: close Content-Type: text/html
ここまでがヘッダフィールドで区切りの空行の後メッセージボディがさらに続きます
<!DOCTYPE html> <html lang="ja"> <head> ....ここは省略 (授業用テキストのメニューです) </body> </html> Connection closed by foreign host. z1c2s@star00:~$
これで1回のセッションは終わりです。最後の「Connection closed by foreign host.」はtelnetが出したもので、telnetも終了しプロンプト($)に戻ったことがわかります。
www.st.seiai.ed.jp と接続して、/ を要求したので、ブラウザで http://www.st.seiai.ed.jp/ と要求した時のページのデータが送られてきます。
別のページを要求してみます。すでに接続が切れているので telnet からもう一度やります。
ふたたびサーバーと接続します。
z1c2s@star00:~$ telnet www.st.seiai.ed.jp 80Trying 10.30.30.2... Connected to www.st.seiai.ed.jp. Escape character is '^]'.
リクエストコマンドを送信します。
GET /a.html http/1.0![]()
![]()
/a.htmlはhttpの確認のために作った短いページデータです。ブラウザではhttp://www.st.seiai.ed.jp/a.html と要求したときに見ることができます。
応答です。
HTTP/1.1 200 OK Date: Sun, 19 Feb 2012 19:43:35 GMT Server: Apache/2.0.54 (Debian GNU/Linux) mod_python/3.1.3 Python/2.3.5 PHP/4.3.10-16 mod_perl/1.999.21 Perl/v5.8.4 Last-Modified: Thu, 16 Feb 2012 12:03:47 GMT ETag: "478366-13f-9ed32ec0" Accept-Ranges: bytes Content-Length: 319 Cache-Control: max-age=2700 Expires: Sun, 19 Feb 2012 20:28:35 GMT Connection: close Content-Type: text/html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>www</title> </head> <body> <h1>httpプロトコル確認用ファイル</h1> <p>これは a.html の内容です</p> <p>も く じ</p> <p><a href="b.html">2つめ</a></p> <p><a href="c.html">3つめ</a></p> </body> </html> Connection closed by foreign host.
エラーの例です。
get / http/1.0![]()
![]()
get は大文字でなければなりません。501 Method Not Implemented (こんなメソッドはない)といっています。
HTTP/1.1 501 Method Not Implemented Date: Thu, 16 Feb 2012 00:23:00 GMT Server: Apache/2.0.54 (Debian GNU/Linux) mod_python/3.1.3 Python/2.3.5 PHP/4.3.10-16 mod_perl/1.999.21 Perl/v5.8.4 Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Length: 383 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>501 Method Not Implemented</title> </head><body> <h1>Method Not Implemented</h1> <p>get to /index.html not supported.<br /> </p> <hr> <address>Apache/2.0.54 (Debian GNU/Linux) mod_python/3.1.3 Python/2.3.5 PHP/4.3.10-16 mod_perl/1.999.21 Perl/v5.8.4 Server at www.st.seiai.ed.jp Port 80</address> </body></html> Connection closed by foreign host.
メッセージボディもあります。同じ内容をブラウザの画面へ出すためのデータです。
レスポンスメッセージの最初に HTTP/1.1 とあります。これは HTTP のバージョンで1.0の改良版です。現在ではほとんど1.1なのですが、タイプ量が多くなるので上では1.0を使いました。こんな感じです。もちろん、この前にtelnet...が必要です。
GET / HTTP/1.1 host: www.st.seiai.ed.jp Connection: Close![]()
![]()
http1.1を使うときはサーバーのhost名を付けなければなりません。telnetで接続したときにサーバーを指定していますが同じものをまた指定することになります。
一見無駄ですが、異なる名前を指定することができるようにしています。telnetでいつものようにwww.st.seiai.ed.jpに接続してから、次のようにmail.st.seiai.ed.jpを指定してみてください。
GET / HTTP/1.1 host: mail.st.seiai.ed.jp Connection: Close![]()
![]()
www.st.seiai.ed.jp の時と違うページが出てきます。
HTTP/1.1 200 OK Date: Sun, 19 Feb 2012 19:46:46 GMT Server: Apache/2.0.54 (Debian GNU/Linux) mod_python/3.1.3 Python/2.3.5 PHP/4.3.10-16 mod_perl/1.999.21 Perl/v5.8.4 Last-Modified: Thu, 16 Feb 2012 11:27:31 GMT ETag: "4d5a1a-170-1d200ec0" Accept-Ranges: bytes Content-Length: 368 Connection: close Content-Type: text/html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>mail</title> </head> <body> <h1>httpプロトコル確認用ファイル</h1> <p>ここは mail.st.seiai.ed.jp です</p> <p>これは index.html の内容です</p> <p>も く じ</p> <p><a href="x.html">2つめ</a></p> <p><a href="y.html">3つめ</a></p> </body> </html> Connection closed by foreign host.
これはサーバーが複数の名前を持っているとき、名前ごとに別のサーバーであるかのように見せかける機能です。
もうひとつのヘッダフィールドの Connection: Close はメッセージの送受が終わった時に接続を切るという指定です。1.0ではこう書かなくても1回ごとに接続を切っていましたが、続けて関連の画像を取り寄せたりする場合の効率を考えてしばらくの間接続を切らないでおくようになりました。そこでこれが必要になります。
実は15秒ほど時間が経つと自動で接続は切られます。授業では一度に接続が殺到しますから切ったほうが良いでしょう。