--- shingetsu-protocol.tex.orig 2005-08-10 22:55:10.703564800 +0900 +++ shingetsu-protocol.tex 2005-08-10 23:35:40.497436800 +0900 @@ -6,7 +6,7 @@ \begin{document} -\title{新月プロトコル/1.0 ドラフト\#1} +\title{新月プロトコル/0.5 ドラフト\#1} \author{新月プロジェクト} \date{\today} \maketitle @@ -16,13 +16,13 @@ 新月の匿名掲示板ネットワークは多数のノードの相互接続によって構成される。 ノード間で相互に通信が行えるようプロトコルが規定されている必要がある。新 月ネットワークのノード間で交換されるメッセージは新月プロトコルに従わなけ -ればならない。この文書で定義する新月プトロコルのバージョンは1.0である。 +ればならない。この文書で定義する新月プトロコルのバージョンは0.5である。 \section{目的} この文書の目的はノードが相互にメッセージを交換できるように、プロトコルを規定することである。そして、新月プロトコルの実装アプリケーションの開発ができる新月プロトコルの文書を提供することである。 \section{新月プロトコルの歴史} -新月プロトコル/1.0が作成される以前も、新月プロトコルの文書は公開されてい +新月プロトコル/0.5が作成される以前も、新月プロトコルの文書は公開されてい た。しかし、当時の文書は、すでに存在していた実装のshinGETsuの補足的な資料でしかなかった。新月がインターネット上でに広がるにつれて、新月プロトコルを元に実装された、様々な新月の実装が登場し始めた。各実装は一見、相互にネゴシエーションが行えていたと思えた。しかし、実装者ごとに新月プロトコルの解釈が異なっていたため、新月プロトコルを満たしきれていない実装が現れた。また、署名のシステムは文書化されていたものの不透明な点が数多くあった。そこで、これまで作成されてきた資料を元に、包括的な新月プロトコルの文書を作成する必要があった。 \section{新月ネットワーク} @@ -36,20 +36,44 @@ \label{新月のネットワーク構成} \end{center} \end{figure} -ネットワーク上の各々のノードは、他のノードと通信を行うために他のノード名を保持する。ノード名を用いることにより、ネットワーク上のノードを一意に識別することができる。しかし、ノード間のノード名の相互の保持は保証しなくてよい。一方のノードAがもう一方のノードBの名前を保持していても、ノードBは、必ずしもノードAのノード名を保持する必要はない。\par -ノード間の通信はHTTP/1.1\cite{HTTP/1.1}の仕様に従って行う。ノード間のリ -クエスト・レスポンスのメッセージはGETメソッドの規約に従わなければならな -い。そして、ノード間のリクエスト・レスポンスのメッセージの文字エンコーディ -ングはUTF-8でなければならない。\par -新月のノード間の通信コマンドは、最後はURL\cite{URL}として構築される。し -たがって、他のノードに送信するコマンドはURLの仕様に従わなければならない。 +ネットワーク上の各々のノードは、 +他のノードと通信を行うために他のノード名を保持する。 +あるノードが保持している他のノード名のことを隣接ノードと呼ぶ。 +隣接ノード同士は互いに相手のノード名を保持していることが望ましいが、 +保証される必要はない。 + +ノード間の通信はHTTP/1.0またはHTTP/1.1\cite{HTTP/1.1}の仕様に従って行う。 +ノード間のリクエスト・レスポンスのメッセージは +GETメソッドの規約に従わなければならない。 +ノード間のレスポンスのメッセージの文字エンコーディングは +UTF-8でなければならない。 + +% UTF-8についてここで触れるべきなのかは微妙。 +% マルチバイト文字が使えるのはファイル内部だけなので。 +% ASCII文字はUTF-8に含まれるから間違った記述ではないのだが。 + +新月のノード間の通信コマンドは最終的にURL\cite{URL}として構築される。 +したがって、他のノードに送信するコマンドはURLの仕様に従わなければならない。 \subsection{ノード} 新月プロトコルを実装しているプログラムをノードという。新月ネットワークに -接続するノードは新月プロトコルを満たすよう正確に実装しなければならない。プログラムの新月プロトコルの実装にあたっては、HTTP、URLの仕様も満たさなければならない。ノードはネットワーク上で一意の名前を持つ。これをノード名(\ref{新月ネットワークの構成})といった。ノード名の構成はURLの仕様に従わなければならない。\par -新月プロトコルは、ノード名の構成要素であるポート番号を指定しない。各々の -ノードはノード名に使用するポート番号を自由に設定することができる。ノード -名に使用するポート番号が1024より小さい場合は、ウェルノウンポート番号に従う\cite{WELL KNOWN PORT NUMBERS}べきである。 +接続するノードは新月プロトコルを満たすよう正確に実装しなければならない。プログラムの新月プロトコルの実装にあたっては、HTTP、URLの仕様も満たさなければならない。ノードはネットワーク上で一意の名前を持つ。これをノード名(\ref{新月ネットワークの構成})といった。 + +ノード名の形式は次のように定義する。 + +\begin{screen} +\begin{center} +ホスト名:ポート番号/パス名 +\end{center} +\end{screen} + +ここでホスト名はDNS名またはIPv4のIPアドレスとする。 +ポート番号は10進表現の整数である。 + +新月プロトコルは、ノード名の構成要素であるポート番号を指定しない。 +各々のノードはノード名に使用するポート番号を自由に設定することができる。 +ノード名に使用するポート番号が1024未満の場合は、 +ウェルノウンポート番号\cite{WELL KNOWN PORT NUMBERS}に従うべきである。 \subsection{メッセージ} ノード間でリクエスト・レスポンス時に交換する情報をメッセージという。メッ @@ -68,8 +92,18 @@ セージを圧縮することができ、圧縮通信の利点を享受できる。 \section{ノード間のプロトコルコマンド} -ノード間の通信はプロトコルコマンドの送信することによって行う。プロトコル -コマンドはURLのパス部の解釈可能な位置に付加する。次に、ノード間で通信を確立するためのプロトコルコマンドを示す。 +ノード間の通信はプロトコルコマンドの送信することによって行う。 +プロトコルコマンドはノード名から生成したURLのパス部の末尾に付加する。 +プロトコルコマンドを付加したURLの例を示す。 + +\begin{screen} +\begin{center} +http://example.com:8000/server.cgi/ping +\end{center} +\end{screen} + +次に、ノード間で通信を確立するためのプロトコルコマンドを示す。 +ここで!\n!は改行コード(0x0a)を表わす。 \begin{description} \item[{\mc/ping}] \hspace{1zw}\\ノードは「PONG\verb!\n!相手ノードのIPアドレス」を返す。\\ @@ -106,10 +140,10 @@ \section{ファイル} \subsection{ファイルの定義} -新月プロトコルにおけるファイルとは、GETメソッドでリクエストした時のレス -ポンスのメッセージボディのことを指す。ファイルはレコードの集合である。ファ -イル内のレコードの順番に制約はない。新月プロトコルでは/ping、/haveコマン -ドのレスポンスの内容もファイルを交換していると考える。 +新月プロトコルにおけるファイルとは、 +/get命令または/head命令に対するレスポンスのメッセージボディのことを指す。 +ファイルはレコードの集合である。 +ファイル内のレコードの順番に制約はない。 \subsection{ファイル名} ファイル名は、半角英数字とアンダースコア(\_)のみで構成する。ファイル名は @@ -124,7 +158,7 @@ に定義する。 \begin{screen} \begin{center} -タイムスタンプ\textless\textgreater 識別子\textless\textgreater 本文」 +タイムスタンプ\textless\textgreater 識別子\textless\textgreater 本文 \end{center} \end{screen} 識別子は本文のMD5値である。レコードの要素は、\textless\textgreater で区 @@ -144,21 +178,29 @@ 「\textgreater」が含まれてはならない)。 どのようなタグが使えるのかはアプ リケーションが定める。 +% ここにlist,thread,noteの各アプリケーションの定める本文の形式がほしい。 +% UTF-8の話題を出すならここか? + \section{時刻} \label{時刻} -新月プロトコルで用いる基点時刻は「1970年1月1日午前0時」である。この時刻 -はグリニッジ標準時である。ある時刻は、基点時刻を基準として表される整数値 -の秒で表す。時間の単位は秒である。 +新月プロトコルで用いる基点時刻は +「1970年1月1日午前0時(グリニッジ標準時)」である。 +ある時刻は、基点時刻を基準として表される整数値の秒で表す。 \section{ブラケットリンク} -アプリケーションは、ファイルの内容をなんらかのデータ形式に変換し、結果を -出力する場合において、本文にブラケットリンクがあるときは、文字列が指定す -るリンクを作成しなければならない。\par -アプリケーションtypeが存在するとする。標準的なブラケットリンクの形式は -[[/type/文字列]]である。文字列の形式はアプリケーションが定義する。つまり、 -文字列の解釈はアプリケーションに委ねられる。/typeは省略することができる。 -/typeを省略したブラケットリンクの形式である[[文字列]]は、本文が記録され -ているファイル形式のtypeが省略されていると考える。\par +アプリケーションは、ファイルの内容をなんらかのデータ形式に変換し、 +結果を出力する場合において、 +本文に次に述べるようなブラケットリンクがあるときは、 +文字列が指定するリンクを作成しなければならない。 + +アプリケーションtypeが存在するとする。 +標準的なブラケットリンクの形式は[[/type/文字列]]である。 +文字列の形式はアプリケーション(type)が定義する。 +つまり、文字列の解釈はアプリケーションに委ねられる。 +/typeは省略することができる。 +/typeを省略したブラケットリンクの形式である[[文字列]]は、 +本文が記録されているファイル形式のtypeが省略されていると考える。 + 現在、アプリケーションとして定義されているthread、noteのブラケットリンクの作成例を次に示す。 \begin{description}