離れたところに情報を伝える…本来の意味
コンピュータネットワークを使うデータの伝達
企業から個人への利用の広がり(電子メール、ウェブ)
情報伝達の手順の取り決め
特にコンピュータ同士の通信ではきちんと決めておく必要がある
デジタルデータ
二つの状態を0,1に対応させる方法
通信線のスイッチによる切り替え(線のつなぎ替え)-昔の電話
切り替えられると占有できる
占有中にデータが送られていない時間があれば無駄が生じる
長く占有する利用者がいると短い利用者であっても長く待たされる
ネットワーク通信
データを小さな単位(パケット)に分けて同一の通信線に流す。
大きなデータの送信中でも小さな単位に分けているので別の小さなデータを挟めて送れるので短い利用者が待たされることが少なくなる
パケットには送り先などのデータが追加されるので情報量は割増となる
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 PUBLIC "-//W3C/... (ここからメッセージボディ) <html xmlns="http://www.w3.org/1999/xhtml" xml: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 80 Trying 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 PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml: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 80 Trying 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 <html> <head> <meta http-equiv="content-type" content="text/html; 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 <html> <head> <meta http-equiv="content-type" content="text/html; 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秒ほど時間が経つと自動で接続は切られます。授業では一度に接続が殺到しますから切ったほうが良いでしょう。
聖愛中学高等学校