About JXTA

Last update 2003/10/08

JXTAとは

JXTA(ジャクスタ)とはP2P(ピアツーピア)アプリケーションを開発する上での共通のプロトコルを作成している団体、そのプロトコルです。
語源はjuxtaposeで並列とかそのような意味を表します。
現在はJAVAで実装されていますがJAVA用APIではないので開発言語はJAVAに限りません。
C言語などでも開発できるようになるでしょう。
しかしJAVAで開発を行う場合プラットフォームに依存しないという利点があります。
プラットフォームに依存しないJAVAで開発をすればそれぞれの機器の差分をJavaVMが吸収してくれるはずです。
さまざまな機器がネットワークに接続されるユビキタス時代に
JAVA+JXTAでサーバーを使わずに機器同士が直接通信するソフトが開発しやすくなるかもしれません。


ピアツーピア

ピアツーピアとは個々のマシン同士、アプリケーション同士が互いに直接やりとりするネットワークの形です。
ちなみに現在の多くのシステムはクライアント・サーバー型とよばれる上下の関係です。
クライアントはサーバー(サービスするマシン)に問い合わせ、サーバーが応答することによって通信を行います。
デメリットとしてサーバーに負荷が集中しすぎること、サーバーがダウンするとサービスが受けられないことがあげられます。
サーバーには負荷に比例してハイエンドなマシンが求められます。
これらクライアントサーバー型のデメリットを補う形としてP2Pが入り込む余地があると思います。
P2Pネットワークをピュア型で形成した場合にはサーバーは必要ありません。
しかしその場合P2Pはネットワークがダイナミックに変化するというデメリットが生まれます。
サーバーは24時間365日稼動することが求められますし、実際稼動しています。
しかし一般的なP2Pネットワークは個人が形成している場合が多いため(というかそのためのネットワーク)、
当然個人がマシンをシャットダウンすれば、ネットワークの形が変わります。
そこで通信したいけど、すでにそこにピアが存在せず通信できないなど、ネットワークが不安定な状態になります。
ピアツーピアはクライアントサーバー型に取って代わるものではなく、お互いがお互いを補う関係として
とらえられると思います。


ピアツーピアの種類

P2Pの形態としてはピュア型P2Pとハイブリッド型P2Pがあります。

  • ハイブリッド型


  • ハイブリッド型の代表例としてナップスターなどがあげられます。
    それに対しハイブリッド型P2Pはピア情報などを管理する中央サーバーが存在し、
    その中央サーバーの情報をもとにピア同士が直接通信するという形です。

    例としてはピアの名前、位置、ファイルの名前などをサーバーで管理し
    実際にピアAがファイルAを探すときには、サーバーの情報を元にファイルAの場所を探します。
    そしてピアBがファイルAをもっているという情報をサーバーから取得します。
    その後はピアAとピアBがP2Pでサーバーを介さず直接やりとりをします。

  • ピュア型


  • ピュア型の代表例としてグヌーテラなどがあげられます。
    ピュア型P2Pは管理するサーバーなどが一切なく、個々のピアがネットワークを形成します。

    JXTAはピュア型に属します。 (どちらもできるかも?)

    JXTAの特徴

    JXTAでは様々な情報をアドバタイズメントと呼ばれるXML文書で定義します。
    ピアの情報はピアアドバタイズメント、グループの情報はグループアドバタイズメント
    通信を行うために必要なパイプの情報はパイプアドバタイズメントと呼ばれます。
    個々のピアがこのアドバタイズメントと呼ばれるXML文書をやりとりすることによって
    JXTAネットワークを形成します。

    これらのさまざまなアドバタイズメントはランデブーピアという特別なピアによって管理されます。
    ランデブーピアは各ピアから要求があればそれに見合ったアドバタイズメントを自分のキャッシュの中から探します。
    そこで発見できた場合要求を受けたピアに返信します。
    ここだけを見るとサーバーのように見えます。しかしもし発見できなかった場合には別のランデブーピアにアドバタイズメントを持っているか問い合わせをします。
    この場合はクライアントになります。ということでピアなのです。
    各ピアはこのランデブーピアに接続することによってJXTAのP2Pネットワークに現在どのようなピア、グループ、パイプ
    が存在するかを知ることができるわけです。
    JXTAを利用したアプリは初めて起動するときにこのランデブーピアのリストをもらうようにできているので
    一意にネットワークを形成し、おのおのが通信をする準備をすることができるのです。

    ローカルエリアとの通信(ファイヤーウォール、ルーター)
    ローカルエリアにいるPCが外部と通信を行う場合どうしても問題になるのがファイヤーウォールやルーターの存在です。
    LAN内のローカルアドレスのマシンは外部から特定することができないため直接通信することはできません。
    またポートが閉じられいる場合も考えられます。(むしろこの方が多いか。)
    すべてのピアがグローバルアドレスで繋がっていれば問題ありませんが、そのようなことはありえません。
    (学校や会社のネットワークから繋ぐときはたいていローカル)
    かといってローカルにいるマシンと通信ができなければP2Pは使い物にならない(ピアがいない。)ですし、
    何か方法が必要となります。
    JXTAではメッセージをリレーしてくれるリレーピアを起動させることでこの問題を回避できます。

    一連の流れ(ローカルと外部との通信)

    まずローカルにいるピアをピアLとします。同様に外部にいるグローバルアドレスを持ったピアをピアG、
    リレーピアをピアRとし、ランデブーピアをピアVとします。
    各ピア(ピアL、ピアG)は立ち上がるときランデブーピアのリスト(IPアドレスとポート番号)をダウンロードし、
    登録します。
    ローカルにいるピア(この場合ピアL)はそのとき同時にリレーピアも登録します。
    立ち上がったあと各ピア(ピアL、ピアG)は自分のピアアドバタイズメントをランデブーピア(ピアV)にpublish(送信)します。
    ここがいまいち不明なんですがピアアドバタイズメントがいつpublishされているのか・・・
    もしくはランデブーから要求がきているのか?
    ランデブーピアは各ピア(ピアL、ピアG)のピアアドバタイズメントをキャッシュします。(2時間)
    今ピアGがピアLにメッセージを送信するとします。
    このときまずピアGはランデブーピアにピアLの情報(ピアアドバタイズメントやパイプアドバタイズメント)がないか
    問い合わせます。
    ランデブーピアは目的の情報があったのでピアGに返信します。
    ピアGは受け取った情報(アドバタイズメント)をもとにピアLへのパイプを作りメッセージを送信します。
    しかしピアLのアドレスはローカルアドレスでその間のルーターがあるため、ピアLにダイレクトでメッセージは送れません
    そこでメッセージはリレーピアに一度キャッシングされます。
    ピアLは定期的にリレーピアに自分宛てのメッセージがないか問い合わせます。
    そこで自分宛てのメッセージがあればHTTPプロトコルを使ってメッセージをダウンロードします。
    以上で通信が完了します。
    まだローカル内の実験のみでHTTPを使った通信で実験してないのでどのくらいの速度があるのかわかりません。
    すごい遅いかも?

    実際にすこし開発してみて感じたこと

    ピアの発見に時間がかかる。相手がすぐに見つからない場合がある。
    LAN内であるならばブロードキャストで瞬時にみつかる。

    アドバタイズメントを利用した場合、ピアの状態を瞬時に伝えることが難しい。
    そこでピアの状態(ログイン、ログアウト、強制終了)を瞬時にしらせるために、
    ログイン、ログアウト時にはメッセージを送り、各ピアにイベントを知らせる。
    各ピアは定期的にピングメッセージを送信し、強制終了などで消えたピアを探知する。
    という方法で実装しました。現在実験はLAN内だけですが、各ピアの状態をリアルタイムで知ることができます。
    PIP(ピアインフォメーションプロトコル)を使えばいいのかな?

    ランデブーピア&リレーピアに接続することができず、外部と通信ができない。
    現在ランデブーピア&リレーピアは本家JXTAのみしか登録していないため、
    太平洋上、ハワイあたりでTTL(Time To Live)が切れて届いていない?
    ランデブーピア&リレーピアを自前で作るか検討中

    開発言語にJAVAを使う場合、動作が重たくなる。(swtを使うことでGUIは軽くなるかも)
    メッセージが相手に届くという保証がない。(これはインターネットでもあたりまえか。)
    ファイルを共有する場合のセキュリティ。(共有フォルダにウィルスなど。)
    JAVA+JXTAで開発する場合JAVA実行環境とJXTA APIを個々のマシンにインストールしなければならない。
    JXTA APIはプログラムにあらかじめ入れれば問題なしか。勝手に入れちゃダメだろうけど。


    JXTAについてのリンク集

    JXTAについての詳しい説明があるサイト
    http://www.wakhok.ac.jp/~maruyama/jxta/html/jxta.html

    atmarkitのJXTA紹介ページ Viva! JXTA
    http://www.atmarkit.co.jp/fjava/special/jxta01/jxta01_1.html

    どこかいいページを見つけたら教えてください。

    Copyright(c) 2003 Tomomi Kawashima All Rights Reserved.