TCP/IP、HTTP

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/classes/syspro-2003/2003-05-19 /http.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.is.tsukuba.ac.jp/~yas/index-j.html

◆HTTP

WWW (the World-Wide Web)では、TCP/IP の上にさらに HTTP (HyperText Transfer Protocol)と呼ばれるプロトコルを構築し、データの転送を行ってい る。Mosaic や Lynx などのブラウザは、WWW サーバとの間に TCP/IP による 通信路を開設する。そして、クライアントは、必要なデータを得るための命令 を送る。これに対してサーバは、命令に応じた処理を行い結果を返す。この命 令の形式や結果の形式を定めたものが、HTTP である。HTTP 通信プロトコルを 受け付けるサーバを、HTTP サーバと呼ぶ。

表2に、HTTP で定義されている命令(メソッド)の例を示す。これらの命令 に対して、サーバは、表3に定義されたような応答を行う。

表2 HTTPで定義されている命令(methods)の例

--------------------------------------------------------------------
命令		説明
--------------------------------------------------------------------
GET		情報を得る(ヘッダと本体の両方)
HEAD		情報のヘッダのみを得る
POST		新しく情報を作る
--------------------------------------------------------------------

表3 HTTPで定義されている状態コードの例

--------------------------------------------------------------------
状態コード	説明
--------------------------------------------------------------------
200		OK(エラーなし)
301		要求されたデータが移動した
400		要求の形式にエラーがある。
404		要求されたデータが見つからない。
--------------------------------------------------------------------

たとえば、次のような URL を持つデータをアクセスすることを考える。

http://www.aaa.bbb.ac.jp:80/index.html

Mosaic などのクライアントは、まずホスト名 www.aaa.bbb.ac.jp とポート 番号 80 を使ってサーバとの間に TCP/IP の通信路を開設する。そして、クラ イアントは、開設した通信路を使って、サーバに次のような文字列を送る。

--------------------------------------------------------------------
GET /index.html HTTP/1.0←↓
←↓
--------------------------------------------------------------------

ここで、"GET" が命令の種類、"/index.html" は、GETの引数の、要求してい るデータを表わす URL (ファイル名)、"HTTP/1.0" は、使っているプロトコル のバージョンである。次の空行は、命令のヘッダ部分の終りを意味するもので あり、必要である。「←」は、キャリッジ・リターンのコード(0x0d,C言語で' \r')、「↓」は、ニューラインのコード(0x0a,C言語で'\n')である。HTTP の ヘッダでは、行末に「←↓」を付けるように規定されている。(サーバを構築 する場合には、「←」か「↓」のどちらか1つしかこない場合でもきちんと動 作することが求められている。)

すると、サーバは、クライアントに対して次のようなデータを送り返す。(注 意:データは、常に更新されるので、必ずしもこの通りのデータが返されると は限らない。)

----------------------------------------------------------------------

HTTP/1.1 200 OK←↓
Date: Sun, 26 May 2002 16:20:16 GMT←↓
Server: Apache/1.3.22 (Unix)  (Red-Hat/Linux) DAV/1.0.2 mod_perl/1.24_01←↓
Last-Modified: Mon, 20 May 2002 03:13:08 GMT←↓
ETag: "1cc006-9be-3ce869c4"←↓
Accept-Ranges: bytes←↓
Content-Length: 2494←↓
Connection: close←↓
Content-Type: text/html←↓
←↓
<html>↓
↓
<head>↓
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">↓
<title>College of Information Sciences</title>↓
</head>↓
<body>↓
↓
<img src="fig/title.gif">↓
<P ALIGN=LEFT>[URL が http://www.coins.tsukuba.ac.jp に変更になりました。]</P>↓
 ↓
↓
↓
<h1>目次</h1>↓
<dl><dl><dl><dl><dl>↓
  <dt><img src="icon/ball_r.gif"><a href="index_1.html">↓
       情報学類とは</a>↓
↓
...
</html>↓

----------------------------------------------------------------------

最初の行が、状態行(status line)と呼ばれる、要求が成功したか失敗した かわ表わしている行である。"200" とは、成功したという意味である(表3参 照)。2行目から最初の空行(「←↓」だけの行)までは、これから送るデー タのメタ情報である。具体的には、データの型や、サーバのバージョン、デー タが更新された日付と時刻、バイト数などが記録されている。

最初の空行(「←↓」だけの行)の次が、データの本体である。この例では、 HTMLで記述されたデータが返されている。サーバは、データ転送が完了すると、 TCP/IP の通信路を切断する。

クライアントは、受け取ったデータを整形して利用者に対して表示する。たと えば、インライン・イメージとして指定されたデータを続けてサーバに要求し て展開したり、フォントを変えたりして表示する。

★ telnet コマンドによる HTTP サーバへのアクセス

telnet コマンドを使って、HTTP サーバにあるファイルの内容を画面に表示さ せなさい。

★ HTTPクライアントの作成

HTTPサーバ(httpd, WWWサーバ)からデータを得るプログラムを作りなさい。そ のプログラムの名前を、wcat とする。

wcat コマンドは、次のように3つの引数を与えて利用するものとする。

--------------------------------------------------------------------
% ./wcat host port file [←]
--------------------------------------------------------------------
ここで、host は、ホスト名、port は、TCP/IP のポート番号、file は、得る べきファイル名である。これは、URL の文法で記述すると、次のようになる。

http://host:port/file

なお、wcat では、ポート番号の引数を省略しないものとする(省略可能なよ うに工夫してもよい)。HTTP プロトコルで用いられる標準のポート番号は、 80である。

プログラムをつくる時には、 行末の扱い(CR-LF)に注意しないさい。 余裕があれば、受け取ったデータを画面に表示する前に、Unix に合わせて行 末のキャリッジ・リターンのコードを削除するようにしなさい。


Last updated: 2003/05/19 00:00:03
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>