コンピュータネットワーク基礎
2003.6.6
今日の「インターネット」の普及はWWWによるところが大きいでしょう.それま で,電子メールやFTP,また,Gopherなどが使用されていましたが,テキストに 埋め込まれた「ハイパーリンク」の機能により参照先に自由に移動でき,画像も 扱うことができる機能により,WWWは多くの人の注目を集め,またたくまにネッ ト利用の中心を担うようになってきました.今では,音声や動画像も扱うことが でき,CGIによりインタラクティブな利用法も可能です.現在も,次々と新しい 技術が開発されており,今後も発展を続けていくことでしょう.
ここでは,その基本的な仕組みに限定し,WWWにおいて,サーバとクライアント がどのような仕事をしているのか,自分で実際にネットワークプロトコルを試し てみて,実感することとします.そのための最初の操作は,HTTP (Hyper Text Transfer Protocol) によるサーバとの通信です.
教室のパソコンでWWWにアクセスする際にはNetscape NavigatorもしくはMozillaを使用すること が最も多いと思われます.それ以外にも方法はありますが,画像表示や表の再現 などを考えると,他の選択肢は機能が少し貧弱です.このようなNavigatorのよ うなアプリケーションをクライアント(顧客)といい,ページのデータを提供する アプリケーションをHTTPサーバと言います.(サーバとは「仕える者」の意味です から,現実世界ではクライアントの方が「偉い」のですが,ネットワークのクラ イアント/サーバシステムではサーバの方が威張っています.)
また,上記のようなサーバプログラムは表だって動く必要はなく,目につかない ところでひっそりと接続を待ち受けて処理を行います.そのような処理を「バッ クグラウンド処理」と言いますが,サーバプログラムについては,特に,「デー モン」という言葉が用いられます.デーモンとはdaemonのことで,ギリシャ神話 にある神々と人間の間に介在する二次的な神のことです.demonと語源は同じで すが,意味が少し変ってきますので,綴りには注意してください.
一方,クライアントプログラムの作業はサーバからダウンロードしたページデータを解 釈して,画面上に整形して表示すること,リンクとして埋め込まれているURLを クリックするとそのページにアクセスすることが主な仕事です.その際にクライ アント側がサーバに対して要求している項目は種々ありますが,実際に使用され ているものはわずかです.以下に代表的な例を示します.
GET | 情報を得る |
HEAD | ヘッダのみ得る |
POST | データを送る |
PUT | データを格納するように要求する |
クライアントが送信するのは,これらのメソッドとHTTPのバージョンです.また, 要求などの命令の区切りは「改行」になりますが,HTTPではDOSのような \r\n が使われます.要求の終了は,改行のみの行により行います.
サーバ側はクライアントに対して返答しますが,その際のメッセージのコード番 号が重要な意味を持っています.以下に代表的な応答コードの意味を示します.
200番台 | 成功 |
400番台 | クライアントのエラー |
500番台 | サーバのエラー |
たとえば,このページの最後の方には宿題ページへのリンクが用意されています が,実際にアナウンスの時間になるまでページ自体は用意されません.そうする と,リンクをクリックしたときにはエラーが表示されます.LinuxのNetscapeで はページに大きく「Not Found」と表示されますが,ウィンドウの枠にあるタイ トルには「404 Not Found」と表示されています.上の400番台のエラーはそのよ うなときに登場します.ちなみに,WindowsのInternet Explorerでは図1のよう なページが表示され,エラー番号も良く見ると記述されています.
図1 404エラーの画面
Mozillaでは残念ながらそのようなエラーコードは表示されず,アラートウィン ドウが表示されるだけのようです.
ヘッダ情報として,さらに,サーバ側からページのデータとして返してくるデータ本体のサイズも伝え られます.それは,
Content-Length:
のような行で表示されます.クライアントが読み込むべきページのデータ量にな るものです.これらの情報が含まれる部分を「ヘッダ」と呼び,空行 (改行だけ の行) の後で,サーバは本体を送信します.
上記の流れを試すために,以下のスクリプトを作成して実行してみましょう.こ のスクリプトは,まつも とゆきひろ/石塚圭樹著,「オブジェクト指向スクリプト言語Ruby」(ASCII出版 局)のp.89に紹介されているものの誤植を訂正したものです.
require 'socket' host = "localhost" port = 80 path = "/" if %r!http://(.*?)(?::(\d+))?(/.*)! =~ ARGV[0] host = $1 port = Integer($2) if $2 path = $3 end s = TCPsocket::open(host, port) s.print "GET #{path} HTTP/ 1.0\r\n\r\n" print s.read |
使用しているのはGETメソッドだけです.ダウンロードして使ってみましょう.これをたとえば,client.rb という名前で保存したとすると,
や,もっと手近なサーバであれば,
のようにして使用します.自分の好きなページのデータを表示させてみてくださ い.
上のスクリプトは単純にデータを取得するだけですので,画面にはヘッダとHTML データがそのまま出てきます.ヘッダ部分を見ると上で説明した内容が記述され ているのが分かると思いますが,ページのデータが多い場合には画面がスクロー ルアウトして見えないかも知れません.パイプライン処理により結果を less などのページャに流すと見やすくなります.
このようなページデータを受け取ったあと,見やすい形に整形する機能が通常の クライアントに備わっていますが,そこではHTML言語で記述された内容を解釈し ているだけです.とりあえず,上記のままではページ内容を見にくいので,スク リプトを少しだけ改良して,ブラウザみたいな仕事をさせてみます.最後の 行を次のような2行に変更してみましょう.
data = s.read print data.gsub(/<.*>/,' ') |
先ほどと同じようにパイプライン処理で less を通して見てください. 少しはWWWクライアントらしくなったでしょうか.
また,先ほどのエラー検出に関係してファイルの保護モードとの関係を試してみ ましょう.そのために,自分のWWWページを作成します.次のように作業してく ださい.
$ mkdir ~/public_html
によりディレクトリを作成したら,このリンク先をそのディレクトリに保存しま す.右クリックで出てくるメニューから作業してください.
ここまで終わったら,先ほどのスクリプトを利用してページにアクセスしてみま しょう.また,比較のため,NetscapeやMozillaでアクセスしてみても良いでしょ う.
$ ruby client.rb http://localhost/~b01**/
当然,**の部分は自分の番号に直してください.なお,人の番号を入力する とその人のページを見ることができます.現状を確認します.まずは,次のコマ ンドにより public_html ディレクトリの状態を確認します.
$ ls -ld ~/public_html
表示結果は大体以下のようになるはずです.
|
最初の10文字の記号のうち,d以外の9文字が保護モードに関する属性となってい ます.意味は,表1のようになります.
所有者 | グループ | その他のユーザ |
rwx | r-x | r-x |
r: 読み取り権限あり w: 書き込み権限あり x: 実行権限あり |
r: 読み取り権限あり -: 書き込み権限なし x: 実行権限あり |
r: 読み取り権限あり -: 書き込み権限なし x: 実行権限あり |
自分で好きなようにできる | 修正を加えることはできないが, 中を見ることはできる |
修正を加えることはできないが, 中を見ることはできる |
r | 4 |
w | 2 |
x | 1 |
rwx | 7 |
rw- | 6 |
r-x | 5 |
r-- | 4 |
-wx | 3 |
-w- | 2 |
--x | 1 |
--- | 0 |
さて,次のようなコマンド操作を実行します.
$ chmod 700 ~/public_html
このコマンドの意味は,jman chmod で確認してください.再び,先ほ どと同様に自分のページにアクセスしてみましょう.元に戻すには,
$ chmod 755 ~/public_html
です.また,次のようにも変更してみましょう.
$ chmod 600 ~/public_html/index.html
こちらはもともとは644の状態にありました.他のモードに変えてみて試してみ るのも良いでしょう.
教室の環境では,public_html というディレクトリや index.html というファイルを置くだけでWWWサーバによる表示ができるようになって いました.これは,システムが用意しているデフォルトの保護モードと関係が あります.次のコマンドを実行してみましょう.
$ umask
コマンドの意味はいつものように jman umask で確認してください. 結果は,
022 |
という素っ気ないものですが,これは以前に行ったネットマスクと同じ様に,ユー ザ権限 (保護モード) にマスクを掛けるものです.全ての権限が全てのユーザに 許されているとした場合には,8進表記でモードが777になることは分かるでしょ う.それに対して022のマスクを掛ける,すなわち,その部分を覆うことにより, モードが755となります.このマスクの値や表記法はシステムに依存します.メー ルサーバのmatsuではどのようになるかも一度調べてみましょう.
ファイルにおいては,前述のように実行権限は通常は考えないので,マスクの 022がかかるとモードは644となります.Rubyのスクリプトファイルの例を用意し ました.この example.rb をダウンロードして,実行権限を与えてコマンドとして動作するか どうかを試してみてください.カレントディレクトリはコマンドパスに含まれて いないので,$ ./example.rb
のようにパスをつけて実行する必要があります.
保護モードを変更して様々なモードで閲覧要求を出したらどうなるかを実習しま した.自分のディレクトリにある自分のファイルでも,WWWサーバに閲覧要求を 出す場合には一般ユーザに権限が無いと見えませんでした.これは,WWWサーバ プログラムがまずページを閲覧する許可を持っていないと表示できないためです. 教室では,世界的にもっとも高いシェアを持っているApcheというプログラムが 走っていますが,これはnobodyというユーザで動いていますので,そのユーザが 見えるページのみが表示可能なページとなっています.プロセスを確認してみま しょう.
$ ps ax | grep httpd
$ ps aux | grep nobody
$ less /etc/passwd
のようなコマンドで確認できます.ps コマンドの動作についてはいつ ものように jman ps です.
授業の終了20分前くらいにAクラスと Bクラス別の小テストを実施します.アナウ ンスに注意してください.また,提出は電子メールにより行いますので,メール の送信準備は忘れないでいて下さい.
授業の終りに宿題(AクラスとBクラス)の説明をしますので,アナウンスに注意してください.