Web
ウェブ

講義

ウェブ

TCP/IP の階層

OSI参照モデルとの対応

「ネットワーク設定」の実習で説明したように TCP/IP の階層モデルは OSI 参照モデルに基づいているがインターネットの 実装に特化するために,OSI 5 層 以上は TCP/IP では分離せずに アプリケーション層で扱うこと,OSI 1 層に対応する規定が無い, という違いがある.

表 6.1. OSI参照モデル(左)とTCP/IPの階層モデル(右)の比較
7. アプリケーション層アプリケーション層
6. プレゼンテーション層
5. セッション層
4. トランスポート層トランスポート層
3. ネットワーク層インターネット層
2. データリンク層ネットワークインターフェース層
1. 物理層(対応無し)

TCP/IP での階層構造では最上位のアプリケーションプログラムが 直接呼び出してデータを渡すのは OSI 参照モデルでいう 第 4 層のプロトコル(TCP,UDP等)であり, 第 4 層のプロトコルは第 3 層のプロトコル(ARP, ICMP)を呼び出す. 第 3 層のプロトコルは第 2 層にあたるデバイスドライバにデータを渡す.

TCP/IP を理解する上で重要なのは,今扱っている通信プロトコルが 第 2 層なのか 第 3 層なのか 第 4 層なのかを把握することである. それを理解するためにはまずインターネットが多数の ネットワークの相互接続であるということを理解し, この狭い意味でのネットワークという概念を理解する必要がある.

2層と3層の違い

自ホストとインターネットで繋がっているホストといっても, 同じネットワークに属していて直接通信できるホストと, 別のネットワークに属していて情報を適切なネットワークを 通過させることで間接的に通信できるホストがある.

インターネットに接続しているホストは何らかのネットワークに所属している. グローバル IP をもつホストのうち,ネットワークアドレスが同じホストは 同じネットワークに所属し,異なるホストは異なるネットワークに所属している. ホストがネットワーク機器に情報を送信すると,同じネットワークのホストで 共有するネットワーク媒体にデバイスドライバ等を通して電気信号等に変換されて 送信される. 受信するときはその媒体を流れている情報をデバイスドライバが読み取る. 基本的には同じネットワークのホストでは所属ホストすべてからの情報を 全てのホストが読むことができる.

同じネットワークでしかできない通信が第 2 層,異なるネットワークでも 行える通信が第 3 層以上と理解しておけばよい.デバイスドライバによる通信は 同じネットワーク上のホストへしか通信できないので第 2 層の通信機能である. また,経路制御は第3層の代表的な機能である.

3 層と4層の違い

大きなデータを通信する場合,ひとかたまりのデータとして通信する と効率が悪いため,TCP/IP では適度な大きさの情報に分けて通信する. この情報の単位をパケットとよぶ. 第 3 層と第 4 層の違いは,第 3 層はパケット単位の通信を担当する 層であることで,もともとのデータをパケットに分割したり, 分割,送信されたデータの到達性,順序の保証を行うのが第 4 層 である.インターネットブラウザ,メールソフトなどの アプリケーションはライブラリ関数を利用して第 4 層の機能を呼び出す. このような,OS が用意しているインターフェース用のライブラリ関数を API (Application Programming Interface) と呼ぶ.

TCP と UDP

TCP と UDP は, TCP/IP の第 4 層(トランスポート層)のプロトコルとして重要なものである.

TCP はコネクション指向で信頼性があるが,接続準備のオーバーヘッドが 大きく,UDP は高速に動作する代わりに信頼性がないのが特徴であり, それぞれ向き不向きがある.TCP はプログラムデータの通信など 信頼性が必要な場面で使われ,UDP は IP 電話など,多少のエラー が許容されるがリアルタイム性が求められる場面で使われる.

ポート番号

MAC アドレスや IP アドレスでホストを特定することはできるが, 同じホストとの間で複数の通信が同時に行われる場合, これを区別する必要がある.例えば,一台の計算機から ウェブブラウザや,メールソフトなどで同時に通信を行うことが できる.これらの通信の区別に用いられるのがポート番号である. 送信側,受信側の両方にポート番号が適当に割り当てられ, 同じ IP アドレスの計算機間でもポート番号を識別することで 正しく通信を区別する.

TCP や UDP では

のどれかが異なれば別の通信として区別される.

0 から 1023 までのポート番号は使用するソフトが歴史的に決まっているので 勝手に使えない.有名なものでは 20,21(ftp), 22(ssh), 23(telnet), 80(http) などがある.TCP と UDP の両方で使われる場合は同じポート番号が割り当て られている.

今回の実習では TCP を利用するアプリケーションとして ウェブサーバを使った実習を行う.ウェブサーバが利用するプロトコルである http では TCP の 80 番ポートを使う.

ウェブサーバ

この実習ではウェブサーバとして広く普及されている apache を使用する. 実習で行うとおりにインストールすると, 基本的な設定ファイルは /etc/apache2 以下におかれる.

設定ファイルが細かく分割されていることと,設定ファイルの有効無効の 切り替えをシンボリックリンクで実現していることに注意を要する. apache サーバの最も基本的な設定ファイルが /etc/apache2/apache2.conf である.このファイルに記述されている ServerRoot は apache サーバの設定ファイル等が置かれる基本ディレクトリの起点を示す.

/etc/apache2/sites-available 以下に設定機能ごとに設定ファイルが 用意されているが,ここにファイルがあるだけでは実際の設定には反映されない. 反映したい設定ファイルのシンボリックリンク(Window でいう別名,エイリアス) を /etc/apache2/sites-enabled 以下に置くことで初めて反映される. 実習の環境では /etc/apache2/sites-available/default の リンクが張られているはずである.

上記設定ファイル中,重要な項目の意味は以下のとおり.

DocumentRoot
ウェブサーバのコンテンツのトップのディレクトリ. URL にウェブサーバのみを書いた場合,ここのディレクトリの ファイルが検索される.
ErrorLog
エラーログを記録するファイル.
CustomLog
アクセスログその他を記録するファイル

標準状態ではユーザのホームディレクトリの文書は公開されない. 例えばユーザ nauser がホームディレクトリに public_html という ディレクトリを作成し,そこに置いたファイル page.html を http://「ウェブサーバ」/%7Enauser/page.html として アクセスできるようにしたい場合は a2enmod コマンドを userdir という引数で実行すればよい.

作成した html 文書が公開されるためには,ルートディレクトリから その文書があるディレクトリまですべてのディレクトリに 「読込」「移動」のパーミッションがあること,公開する文書ファイルに 「読込」のパーミッションがることが必要である.

html 文書をウェブサーバにリクエストするにはサーバに GET, POST などの コマンドと,要求するファイルなどの情報を送信する. サーバはそれに対する応答としてステータスコードを返し, アクセスが成功であれば要求されたファイルの内容が送信される. よく使われるステータスコードとその意味を下に示す.

表 6.2. 主なステータスコード
200OK (正常)
404 Not Found (ファイルが存在しない場合など)
500 Internal Server Error(CGI スクリプトの文法エラーなど)

これらの処理は,通常ユーザがブラウザに URL を入力したり,リンクたどったときに ブラウザによって自動的に行われる.

http では 1 つのファイルあたり 1 つのアクセス (TCP, つまり第 4 層のレベルのアクセス)が行われる. 図等,本文とは別のファイルが一緒に表示される文書の場合, ブラウザを見れば 1 回のアクセスに見えるが実際には ファイルの数だけのアクセスが行われている.

実習

各 pc の名前を,班番号の 2 桁表記を A とすると 各班の教卓に向かって左側から pcA1, pcA2,...,pcA4 とする.

キーボード左上のシールの番号の下2桁の数字がxx とすると,その計算機の IP アドレスを 172.17.2.xx とする.

他の情報は全てのホストで共通である. サブネットマスクは 255.255.0.0, デフォルトゲートウェイは 172.17.254.254, 優先DNSサーバのアドレスは 172.17.254.254, として設定せよ.

実習1. ウェブサーバのインストール

ウェブサーバを全ての pc にインストールする.

Synapticパッケージマネージャを起動し, 最初に一回だけ「再読み込み」ボタンを押す.

「クイック検索」で apache2 を検索し,表示された apache2 をインストールする.

実習 2. 設定ファイルの確認

設定ファイル群は /etc/apache2 以下に置かれる. cd /etc/apache2 を実行し,このディレクトリに 移動して以下の作業を行え.最初に ls コマンドで どんなファイルがあるか確認せよ.

基本設定ファイル /etc/apache2.conf を確認し, ServerRoot に設定されているディレクトリを調べよ.

/etc/apache2 ディレクトリで以下のコマンドを実行し, /etc/apache2/site-enabled ディレクトリに リンクが張られ,有効になっているファイルを確認せよ.

nauser@na-160:~$ ls -l sites-enabled

/etc/apache2/sites-available ディレクトリにあるファイルのうち, 上記コマンドで有効になっていることを確認したファイル (site-enabled からリンクが張られているファイル)の 内容を確認し,DocumentRoot, ErrorLog, CustomLog の設定を確認する.

DocumentRoot に指定されているディレクトリにある index.html ファイルの内容を確認せよ.

実習 3. アクセス実験

班の全てのホストでifconfig コマンドを実行し,班のすべてのホストに 設定されている IP アドレスを班員の間で確認しておく. 班のメンバー間で座席を入れ替え,全員が自分がウェブサーバーを設定した PC 以外の PC に着席せよ.着席した PC をクライアントとして 以下の作業を行う. 自分が設定したサーバの IP アドレスが A.B.C.D だったとする.クライアント計算機から telnet A.B.C.D 80 というコマンドを実行せよ.最後の 80 は http のポートである.

入力待ちになるが,10 秒程度でタイムアウトになるので タイムアウトになる(プロンプトが表示される)前に 速やかに以下のように入力する.

GET / HTTP/1.0
(改行)

GET の行の入力で改行キーを押した後,もう一度空行で 改行キーだけを押すことに注意せよ.

HTTP/1.1 200 OK
から始まる内容が表示されれば成功である. 成功すると実習 2. で確認した index.html がコンテンツとして 返されるはずである. アクセスログはサーバの 実習 2. で確認した CustomLog で示されるファイルに出力される.自分がサーバを設定した PC に戻り, 今回の操作に対応する行を確認せよ.ログの最初にリクエスト元の IP アドレス,日時が記録され,次に "GET / HTTP/1.0" という今回のコマンド が記録されている.次に記録されている 3 桁の数字がステータスコードである. 今回のステータスコードが何であったかとその意味を確認せよ.

通常はこのやりとりをブラウザが自動的に行い,受信したコンテンツを HTML に従って整形して表示する.また座席の入れ替えを行い, 先程 telnet を実行したクライアント PC に移れ. ブラウザを起動し,アドレス欄に http://A.B.C.D/ (サーバのIPアドレス)を入力し, 表示を確認せよ.自分が設定したサーバに戻り,このアクセスに対応する サーバのアクセスログも確認せよ.

ブラウザのキャッシュの消去

以前開いたページを再度開く場合,ブラウザに保存されているキャッシュが 使われて実際のアクセスが行われない場合がある.この場合は サーバにログが残らない.実験を失敗し,再試行する場合に問題になるので, 実験を再試行する場合はブラウザのキャッシュを消去してから行う 必要がある.キャッシュの消去はは, 「ツール>最近の履歴を消去」で行うことができる.

実習 4. userdir の利用

自分がサーバを設定したPCで作業を行う.

ユーザのホームディレクトリを利用できるようにするための モジュールの設定ファイルが /etc/apache2/mods-available/userdir.conf, /etc/apache2/mods-available/userdir.load, に用意されている./etc/apache2/mods-enabled ディレクトリを調べ, 上記ファイルへのリンクが無い,すなわち有効になっていないことを確認せよ.

モジュールの設定を有効にするためのコマンドが a2enmod である. 以下のコマンドで userdir を有効にせよ.

nauser@os-160:~$ sudo a2enmod userdir

設定ファイルを変更しても apache2 を再起動しないと 変更が反映されない.以下のコマンドを 入力し ウェブサーバを再起動せよ.

apache2 の再起動

nauser@os-160:~$ sudo service apache2 restart

/etc/apache2/mods-enabled ディレクトリを調べ, 有効になったことを確認せよ.userdir.conf を確認し, UserDir として public_html が指定されていることを確認せよ.

上記設定は自分のホームディレクトリ直下の public_html ディレクトリが 自分のトップディレクトリになるという意味である.ホームディレクトリで 以下のコマンドで public_html ディレクトリを作成せよ.

nauser@os-160:~$ mkdir public_html

実験用のhtml文書ファイルを以下の方法でコピーする.

  1. http://sirius.yamamotolab.jt.u-tokai.ac.jp/%7Enet/index.html にアクセスし, 実験用の文書を開け.
  2. 表示されている文書の上で右クリックから「ページのソースを表示」でソースを開き,ソース表示画面で ファイル>名前をつけてページを保存,を選択する.
  3. ファイル名を index.html とし, 「フォルダの中に保存」で一旦ホームディレクトリ(自分のユーザ名) に保存する.これで自分のホームディレクトリにコピーができたので, mv コマンド等を使って先に作成した public_html に移動させる.

cd や ls で public_html,その中の index.html のパーミッションを 確認する.ディレクトリが 755 (drwxr-xr-x), ファイルが 644 (-rw-r--r--) であればよい.

サーバのアクセスログを確認する準備を行い,クライアントから http://A.B.C.D/%7Eユーザ名/index.html にアクセスし, 文書が表示されることを確認せよ. この操作に対応するログを確認せよ. http://A.B.C.D/%7Eユーザ名/ とだけ入力するとそのディレクトリの index.html というファイルを探して表示することになっている. この URL を指定しても同じファイルが表示されることを確認せよ.

自分のindex.htmlを書き換え,他の PC からアクセスして確認せよ.

同様に画像ファイルの表示を含んだコンテンツをコピーする.

  1. http://sirius.yamamotolab.jt.u-tokai.ac.jp/%7Enet/img.html にアクセスし, 画像表示実験用の文書を開け.
  2. 図以外の文書の上で右クリックから 「ページのソースを表示」でソースを開き,ソース表示画面で ファイル>名前をつけてページを保存,を選択する.
  3. ファイル名を img.html とし, 「フォルダの中に保存」で自分のホームディレクトリを選択する.
  4. 画像の上で右クリック,名前を付けて画像を保存を選択,
  5. ファイル名を utp.jpg とし, 「フォルダの中に保存」で自分のホームディレクトリを選択する.

これでホームディレクトリに img.html と utp.jpg の コピーができたので mv か cp で public_html に移す.

サーバのアクセスログを確認する準備を行い,クライアントから http://A.B.C.D/%7Eユーザ名/img.html にアクセスし, 文書が表示されることを確認せよ. この操作に対応するログを確認せよ.

アクセスログについて,index.html を開いたときと img.html を開いたときを比較せよ. img.html を開いた時のほうがログの行数が多いはずである. ログを確認してそれぞれのログがどのファイルを開くリクエストなのかを確認し, 行数が多い理由を考えよ

課題

第 7 回課題「ウェブ」 を提出せよ.


Updated in May 30, 2011, index.html, Yamamoto Hiroshi