情報通信のしくみ

情報通信とは

離れたところに情報を伝える…本来の意味

コンピュータネットワークを使うデータの伝達

企業から個人への利用の広がり(電子メール、ウェブ)

プロトコル

情報伝達の手順の取り決め

特にコンピュータ同士の通信ではきちんと決めておく必要がある

情報の表現形式

デジタルデータ

二つの状態を0,1に対応させる方法

通信の方式

回線交換方式

通信線のスイッチによる切り替え(線のつなぎ替え)-昔の電話

切り替えられると占有できる

占有中にデータが送られていない時間があれば無駄が生じる

長く占有する利用者がいると短い利用者であっても長く待たされる

パケット交換方式

ネットワーク通信

データを小さな単位(パケット)に分けて同一の通信線に流す。

大きなデータの送信中でも小さな単位に分けているので別の小さなデータを挟めて送れるので短い利用者が待たされることが少なくなる

パケットには送り先などのデータが追加されるので情報量は割増となる

HTTPプロトコルの紹介

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で通信してみる

まずサーバーと接続します。telnet www.st.seiai.ed.jp 80と入力して[Enter]キーを押します。ここの図で[Enter]は[Enter]キーを表します。telnet は通信のためのソフトウェア、www.st.seiai.ed.jpはサーバーの名前、80はウェブサーバーの使っているポート番号です。

z1c2s@star00:~$ telnet www.st.seiai.ed.jp 80[Enter]
Trying 10.30.30.2...
Connected to www.st.seiai.ed.jp.
Escape character is '^]'.

ここまではtelnetの出力です。telnetがウェブサーバーと通信回路を用意してくれました。これからの入力はウェブサーバーへ送られます。

$で終わるプロンプトがないですね。サーバーとつながっている状態です。

リクエストコマンドを送信します。

GET / http/1.0[Enter]
[Enter]

最後は空行(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[Enter]
Trying 10.30.30.2...
Connected to www.st.seiai.ed.jp.
Escape character is '^]'.

リクエストコマンドを送信します。

GET /a.html http/1.0[Enter]
[Enter]

/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[Enter]
[Enter]

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[Enter]
[Enter]

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[Enter]
[Enter]

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秒ほど時間が経つと自動で接続は切られます。授業では一度に接続が殺到しますから切ったほうが良いでしょう。

聖愛中学高等学校
http://www.seiai.ed.jp/
Oct. 2011