TCP/IP、NNTP

システム・プログラム

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

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

◆NNTP

NNTP(Network News Transfer Protocol) とは、ネットワーク・ニュースの記 事の転送や、記事の読み書きを行うためのプロトコルである。mnews や GNUS などのネットワーク・ニュースを読み書きするソフトウェアは、クライアント として NNTP サーバとの間に TCP/IP による通信路を開設する。そして、クラ イアントは、記事を要求する文字列や、ニュース・グループの一覧を要求する コマンドをサーバに送る。これに対してサーバは、要求された記事やニュース・ グループの一覧をクライアントに返す。表4に、クライアントからサーバへ送 られるNNTPのコマンド、表5に、サーバからクライアントへ返される応答を示 す。

表4 NNTPのコマンド

--------------------------------------------------------------------
GROUP	ニュース・グループ名
	ニュース・グループを選択する。結果として、記事の数、記事の番号
	の上限と下限が返される。

ARTICLE 記事番号
	その記事の内容を得る。ニュース・グループが選択されている状態の
	時に使える。

ARTICLE 
	メッセージIDの記事の内容を得る。
HELP
	ヘルプ・メッセージの表示
QUIT
	終了
POST
	記事を投稿する。
--------------------------------------------------------------------

表5 NNTPの応答

--------------------------------------------------------------------
応答コード	説明
--------------------------------------------------------------------
100		ヘルプのテキストが続く。
200		要求受け付け可能である(投稿可)。
201		要求受け付け可能である(投稿不可)。 
205		通信路を切断する。
211		ニュース・グループが選ばれた。
		記事の数、記事番号の上限、下限、ニュース・グループ名。
400		サービスを中断する。
411		そのようなニュース・グループがない。
421		もうそのニュース・グループには次の記事がない。
500		コマンドが認識できなった。
501		コマンドの文法に誤りがあった。
502		アクセスが制限されている。
--------------------------------------------------------------------

以下に、telnet コマンドを利用して、NNTP サーバに接続した様子を示す。

----------------------------------------------------------------------
% telnet newshost nntp [←]
Trying XXX.YYY.ZZZ.UUU ...
Connected to newshost.
Escape character is '^]'.
200 newshost InterNetNews NNRP server INN 2.3.1 ready (posting ok).
help[←]
100 Legal commands
  authinfo user Name|pass Password|generic  
  article [MessageID|Number]
  body [MessageID|Number]
  date
  group newsgroup
  head [MessageID|Number]
  help
  ihave
  last
  list [active|active.times|newsgroups|distributions|distrib.pats|overview.fmt|subscriptions|motd]
  listgroup newsgroup
  mode reader
  newgroups [YY]yymmdd hhmmss ["GMT"|"UTC"] []
  newnews newsgroups [YY]yymmdd hhmmss ["GMT"|"UTC"] []
  next
  post
  slave
  stat [MessageID|Number]
  xgtitle [group_pattern]
  xhdr header [range|MessageID]
  xover [range]
  xpat header range|MessageID pat [morepat...]
  xpath MessageID
Report problems to 
.
quit[←]
205 newshost closing connection.  Goodbye.
Connection closed by foreign host.
% []
----------------------------------------------------------------------
ここで、強調で示した部分が、キーボードからのタイプである。 この例では、ホスト newshost のポート番号119(nntp)のポートに、 TCP/IPにより接続を試みている。2行目から4行目は、telnet コマンドによる 定型的な表示である。通信路が開設されると、サーバは、 "200" という応答を返している。これは、NNTP で定義されて いる応答であり、サーバが、要求を受け付け可能であり、かつ、要求としては 投稿要求(POST)も受け付けることを意味している。"200" 以 降の文字列は、コメントである。

第6行では、"help" というコマンドをサーバに送っ ている。これに対して、サーバは、"100" という応答に続けて、 受け付け可能なコマンドなど、簡単な使い方を返している。23行目に "." からなる行がある。これが、1つのコマンドに対する応答 の終りを示している。

次に、24行において、"quit" というコマンドをサーバに送っている。これに たいして、サーバは、205 という応答を返し、続いて TCP/IP の通信路を切断 している。26行目は、telnet コマンドが生成したメッセージである。

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

telnet コマンドを使って、NNTP サーバ jks-news にアクセスし、 ネットワーク・ニュースの記事を画面に表示させなさい。その記事のニュース・ グループ、ニュース・グループ内の番号、記事の先頭の20行程度を報告書に添 付しなさい。このとき、表4に示したコマンド、GROUP と ARTICLE を使うと よい。

注意すべきこととして、GROUP コマンドでは、ニュース・グループ名を一度に 与えることがあげられる。たとえば、comp.sys.mac というニュース・グルー プならば、次のように、一度に全部のニュース・グループ名を与える。

GROUP comp.sys.mac
次のように、部分的に与えることはできない。
GROUP comp
GROUP sys
GROUP mac
vin や mnews では、ニュース・グループを階層構造を持つものとして利用者 に提示している。しかしながら、NNTP のレベルにおいては、そのような階層 構造は存在しない。

その他の NNTP のコマンドを使ってみなさい。NNTP の定義は、RFC977 という ドキュメントにある。

★ NNTPクライアントの作成

NNTPサーバから記事を1つ得るプログラムを作りなさい。そのプログラムの名 前を、nncat とする。

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

--------------------------------------------------------------------
% ./nncat host newsgroup number [←]
--------------------------------------------------------------------
ここで、host は、NNTPサーバが動いているホストの名前、newsgroup は、ニュー ス・グループ、number は、記事番号である。NNTP プロトコルで用いられる標 準のポート番号は、119(nntp) である。getservbyname() で調べるとよい。

報告書には、作成した nncat コマンドの動作例を示しなさい。

NNTP では、本来、サーバからの応答を確認てから処理を進める必要がある。 この課題の範囲では、サーバからの応答を確認しないで命令を送ったとしても、 動作する可能性もある。

プログラムをつくる時には、行末の扱い(CR-LF)に注意し ないさい。


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