TCP/IP、HTTP

システム・プログラムI

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

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro1-1998/1998-06-02 /http.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.hlla.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.0 200 OK←↓
Date: Friday, 05-Jul-96 04:45:58 GMT←↓
Server: NCSA/1.3←↓
MIME-version: 1.0←↓
Content-type: text/html←↓
Last-modified: Wednesday, 14-Feb-96 04:08:21 GMT←↓
Content-length: 699←↓
←↓

<title>Welcome to IISE WWW server</title>

<IMG ALIGN=top SRC="/images/ISE.gif">
<P>

<h1>
筑波大学電子・情報工学系へようこそ!
</H1>

<P>
<A HREF="English/index.html">English Version here.</A>

<hr>

ここは筑波大学  電子・情報工学系のホームページです。

<H1>
<UL>
<LI><A HREF="http:IISE-general.html">電子・情報工学系の紹介</A>
<P>
<LI><A HREF="http:IISE-profs.html">学系教官</A>
<P>
<LI><A HREF="http:IISE-labs.html">学系内研究室</A>
<P>
<LI>大学院案内
<UL>
<LI><A HREF="http:KOUGAKU/index-j.html">工学研究科</A>
<LI><A HREF="http:RIKOUGAKU/index-j.html">理工学研究科</A>
</UL>
</UL>
</H1>

<hr>
本ページに関するお問い合わせは以下のアドレスにお願いします。
<address>www@is.tsukuba.ac.jp</address>
--------------------------------------------------------------------

最初の行が、状態行(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である。

HTTP では、ヘッダ部分の行末に、キャリッジ・リターン(carrige return,CR) とライン・フィード(Line feed, LF)の両方が必要であると定められている。 UNIX では、通常ライン・フィード(ニュー・ライン、New Line, NL と呼ばれ ることもある)だけが行末の記号として使われる。よって、画面に文字列を表 示し、改行したい場合は、次のようなプログラムが使われる。

printf("Hello,world\n");
これは、HTTP では、次のようにしなければならない。
printf("Hello,world\r\n");
ここで、'\r' がキャリッジ・リターン、'\n' がライン・フィードである。い ずれも、C言語のソース・プログラム上では2文字に見えるが、Cコンパイラ により、1文字に変換される。それぞれ、アスキーでは、13(0x0d), 10(0x0a) である。 余裕があれば、画面に表示する前に、UNIX に合わせて行末のキャリッジ・リ ターンのコードを削除するようにしなさい。


↑[もどる] [課題提出方法] ←[5月26日] ・[6月2日] →[6月9日]
[finger] [http] [nntp] [smtp]
Last updated: 1998/06/02 00:50:02
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>