[題名] Jnutella Peer-to-Peer Protocol (JPPP) 提案その1 [作成] 2000年11月23日 daishi@axlight.com [主旨] JPPPはGISPの下位プロトコルとして利用することが 検討されている、P2P汎用プロトコルである。 本提案は、JPPPをより洗練させ、同時に、 GISPとの親和性を高くするためのものである。 JPPPの応用は複数あり、GISPはその一つにすぎない。 従って、この文書はjnushareの提案とは異なるが、 関連はあるので間借りをして公開することにする。 [言葉の定義] ノード :サービスを提供する一つのソフトウエア ノードID :ノードの識別子で、"ホスト名:ポート番号" ホスト名は、FQDNまたはIPアドレス コア :JPPPそのものが提供する機能 プロファイル:JPPPのコアを利用してサービスを提供する応用 [目次] 1. 下位プロトコル 2. ルーティング 3. ノード発見プロトコル 4. コアとプロファイルのインタフェース [下位プロトコル] 下位プロトコルとしては、 Simple Object Access Protocol (SOAP) を用いる。 SOAPは外部手続き呼出しを、XMLでカプセル化するプロトコルである。 SOAPの下位プロトコルには、HTTPが用いられることが多いが、 それに限定するものではない。 JPPPも下位プロトコルに依存しない形で設計したほうがよいだろう。 XMLベースのプロトコルであることは仮定してもよいと思う。 [ルーティング] まず、前提条件を説明する。 ノードはノードに関する情報として 予め以下のものを自己申告するものとする。 {強さ} 0から10までの整数で表され、 そのノードがどれだけサービスに貢献できるかを表す。 大きいほど能力が高いと見なされる。 {マルチキャストグループ名} マルチキャストに使用するグループ名をテキストで指定する。 複数指定できる。 (例) "japan","kanagawa","jnutella" これ以外にもノードの情報として、 {ノードID} "ホスト名:ポート番号" がある。 次に、ある外部手続き呼出しをルーティングする方式を説明する。 ルーティングは次の3タイプを想定する。 ・ブロードキャスト ・マルチキャスト ・1対1通信 ブロードキャストを実現するには、 次のように外部手続き呼出しを転送する。 自ノードが認識しているノードの集合の 全部または一部に対して、 (ノードの強さを考慮して選択する) 外部手続き呼出しを転送する。 このとき、各転送先ノードに対して、 そのノードが転送に関して責任を持つべき、 MD5ハッシュ値の範囲を伝える。 (この範囲には転送先ノードIDのMD5ハッシュ値が 含まれるようにする) 転送先のノードは伝えられた範囲の ノードIDのMD5ハッシュ値を持つノード集合 について同様の動作を繰り返す。 マルチキャストを実現するには、 これに、マルチキャストグループ名でノードの集合を 絞り込むだけでよい。 (複数のグループ名を指定した場合は、ANDで処理) 1対1通信は、ノードIDが"ホスト名:ポート番号"なので、 直接通信できる。 [ノード発見プロトコル] ネットワークに初めて参加する場合は、 ・Active Discovery ・Passive Discovery ・Direct Discovery の3通りがあるが、 現在実現可能なものはDirect Discoveryのみである。 JPPPとは独立した仕様(例えば、JNDP)に 分けた方がよいのではよいのではないか? ネットワークに参加している状態では、 隣接ノードからノード一覧を提供してもらう機能を設ける。 また、新にネットワークに参加した際には、 自ノード情報をブロードキャストする。 [コアとプロファイルのインタフェース] プロファイルに依存しないインタフェースを用意したい。 当然実装に依存するが、下位プロトコルがXMLベースである ことを考えると、XMLを利用するのがよいのではないか? Javaの場合は、例えば、 public interface JPPPInterface{ public Result call(Profile p, XMLMessage cmd, Target t); } のように。(これ以外にもメソッドは必要である) ---- 以上