システムプログラム(第6週): TCP/IP、HTTP


電子・情報工学系/システム情報工学研究科CS専攻
新城 靖
<yas@is.tsukuba.ac.jp>

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

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		要求されたデータが移動した
302		見つからない
303		別のページを見よ
304		ページは変更されていない
400		要求の形式にエラーがある
401		ページの閲覧が承認されななかった
403		アクセスが許されていない
404		要求されたデータが見つからない
501		メソッドが実装されていない

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

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

Firefox などのクライアントは、まずホスト名 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: Sat, 20 May 2006 11:29:56 GMT←↓
Server: Apache/2.0.55 (Unix) PHP/4.4.2←↓
Last-Modified: Mon, 17 Apr 2006 09:38:56 GMT←↓
ETag: "12295c-4ba9-30f8ec00"←↓
Accept-Ranges: bytes←↓
Content-Length: 19369←↓
Connection: close←↓
Content-Type: text/html←↓
←↓
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">↓
<html lang="ja">↓
<head>↓
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">↓
<title>筑波大学第三学群情報学類</title>↓
<link href="main.css" rel="stylesheet" type="text/css">↓
<META http-equiv="Content-Script-Type" content="text/javascript">↓
<META http-equiv="Content-Style-Type" content="text/css">↓
<script type="text/javascript" src="navi.js"></script>↓
</head>↓
↓
<body ...>↓
...↓
</body>↓
</html>↓

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

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

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

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

telnet コマンドを使って、HTTP サーバにあるファイルの内容を画面に表示さ せなさい。以下の例は、http://www.coins.tsukuba.ac.jp/index.html のペー ジをアクセスした様子を示している。
% telnet www.coins.tsukuba.ac.jp 80  [←]
Trying 130.158.86.207...
Connected to orchid-nwd.coins.tsukuba.ac.jp.
Escape character is '^]'.
GET /index.html HTTP/1.0[←]
[←]
HTTP/1.1 200 OK
Date: Sat, 20 May 2006 11:29:56 GMT
Server: Apache/2.0.55 (Unix) PHP/4.4.2
Last-Modified: Mon, 17 Apr 2006 09:38:56 GMT
ETag: "12295c-4ba9-30f8ec00"
Accept-Ranges: bytes
Content-Length: 19369
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>筑波大学第三学群情報学類</title>
<link href="main.css" rel="stylesheet" type="text/css">
<META http-equiv="Content-Script-Type" content="text/javascript">
<META http-equiv="Content-Style-Type" content="text/css">
<script type="text/javascript" src="navi.js"></script>
</head>

<body ...>
...
</body>
</html>
Connection closed by foreign host.
% []

★ 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: 2007/05/22 13:10:47
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>