P2Pニコ動キャッシュ共有プロキシを作ってみた(http://d.hatena.ne.jp/kanbayashi/20071229/p1)の続報です。
合計8人の方々にご協力頂き実験を行いました。皆様ありがとうございました。
結果ですが、やはりNATを挟んだ環境でのP2PSocketを用いた通信には厳しいものがありそうです。
というのも、P2Pネットワークへの参加人数が8人に増えてもネットワークの安定性はそれほど変わらなかったのです。
実際に試してみると、10回コネクションを張ろうとして1回成功すると良い方という感じでした。
#コネクションさえ張れてしまえば数十メガぐらいのデータの送受信はできましたが
完全にピュアなP2Pネットワーク(JXTA*1のネットワークにはトポロジを管理する中央サーバなどがいない)*2で、継続的なコネクションを貼ってデータ(結構大きな)を送受信しようというのは、そもそも無茶があるのかもしれません。
#ちなみに、Winnyなどは小さなピース単位でデータを送受信するので、継続的なコネクションは必要ないはずです。
そんなわけで、私の作ったプロキシは(現状の実装では)使い物になりそうにありません。期待させてすいませんでした。
ただ、解決案もない事はないです。
-
- 通信路の確保をもっと賢く
現状でのコネクションの管理としては、何かファイルが欲しかったら、1つのノードを決めてそのノードにコネクションを貼り、データの送受信が終わったら切ってしまうという実装になっています。
これを、同時に複数ノードに接続をかけるようにしてうまくコネクションが貼れたところとデータを送受信して、それが終わったらコネクションをキャッシュしておくというように変えます。こうすればコネクション貼れない問題はある程度は軽減できるかもしれません。
#あるビデオのキャッシュを保持しているノードがたくさんいるような状況にならないといけない、つまり利用者がかなり増えないとこの解決策は有効にならないですが。。
-
- JXTAをもっとちゃんと使う1
ご存知の通り、P2PSocketはJXTAを簡便に使えるようにするためのラッパーライブラリです。
現状では、そのようなP2PSocketをそのまま普通に使っていますが、そうではなく、P2PSocketに手を加えて、JXTAの使用方法を変えてやることで、通信路の信頼度を上げられる可能性があります。
具体的には、JXTAではネットワーク内で自分がココにいるよ〜っという情報を他のノード達に知らせるために、アドバタイズメントという小さなデータをばらまくのですが、それの量を変えたりすることでコネクション確立の信頼性を上げられるかもしれません。
#推測ですが
-
- JXTAをもっとちゃんと使う2
P2PSocketではいくつか用意されているランデブーピアというノードのうちの一つ(リストを取得するためのCGIがある)に最初に接続するようなのですが、そこの部分を自分で用意した唯一のランデブーピアに接続させるようにすると、コネクションをちゃんと貼れる確率が上げられるような気がします。
#特定のプロパティを設定しておくとP2PSocketはそのランデブーピアに接続しに行ってくれる?
#要調査
しかし、以上の解決案が仮にある程度有効だったとしても、P2PSocketの動作を見ている限り、あまりよいパフォーマンスは実現できない気がしています。
第三者のノードが入ってのリレーを行うような環境で数十メガも送れるような継続的なコネクションを提供してもらうというのは、やはり厳しい注文だと思うからです。
#P2Pネットワークでは、中間ノードが居なくなるなんて事が当然起きるわけです
真面目に設計するなら、継続的なコネクションを必要としない、ファイルをピース単位で送受信するような仕組みにする必要があるでしょう。
↓のエントリでそれについて説明します。
P2Pニコ動キャッシュ共有プロキシ実装案(http://d.hatena.ne.jp/kanbayashi/20080101/p2)
*1:参考-> http://www.shudo.net/article/JXTA-DHT-20040408/
*2:ランデブーピアというやつがそれに近いことをしているみたいではありますが