Hatena::ブログ(Diary)

Ryoの開発日記 RSSフィード

            "生きる"を科学する



大学時代の研究 || ddkの日記 || tyouiifanの日記 || Yoshikuniの日記
あなくつと愉快なソフトウェアたち|| CLKs
Ceekz Logs||Ryoのmixi|| 登 大遊@筑波大学情報学類の SoftEtherVPN日記
Kikker  ||はてブまわりのひと|| もひかんチャット
TOFU-G||高校時代の活動|| 分散マシン操作ライブラリ Svengali
Google+||個人サイト( ryogrid.net )
Yougakutube ||ひらめいったー||kookle
Ryoのつぶやき ||Ryoに響いた言葉 ||Ryoの本棚 ||そのうちやりたい
My Profile by iddy Subscribe with livedoor Reader FriendFeed でフィードにアクセス

2008-01-01 元旦

P2Pニコ動キャッシュ共有プロキシ実装案

このエントリでは、P2Pニコ動キャッシュ共有プロキシ実験結果(http://d.hatena.ne.jp/kanbayashi/20080101/p1)を読んだことを前提として話を進めます。


まずNico Cacheのおおまかな処理内容を書きますと



というようになっています。

で、私の作ったキャッシュ共有版では上記の4bの処理を以下のように変更したわけです。



私のとった方法はこのようになりましたが、結局のところ、欲しいflvファイルを対象ディレクトリに特定の規則に従ったファイル名で置いておけるようにさえすれば、実現方法は何だってよいのです。


そこで以下に挙げる実装案を考えてみました。

#考えただけ


DHTライブラリを使って真面目にやる

DHTとはDistributed Hash Tableの略称で、ネットワーク接続された複数ノード連携して、効率的に一つのハッシュテーブルを構成する手法です。

#JXTA,Bittorrent,Limewireなども最近では採用しています


詳細は自分で調べていただくとして、簡単な説明をしますと、例えば、ノードAがキー"hoge"に対して値"bar"をputしたとすると、ノードBがキー"hoge"でgetすると値"bar"が手に入れられるという寸法です。


同様のことを今回の目的に合わせて行うと、あるノード動画"sm11111"の部分ピース1を"sm11111-1"というキー、実際のデータを値として登録すれば、他のどのノードからもそのデータが、キー"sm11111-1"を与えることで入手できるようになるわけです。これができれば、上記の元手順の4bを置き換えるのは簡単ですね。


国内ではOverlay Weaver(http://overlayweaver.sourceforge.net/index-j.html)がよく出来ていて使えそうな感じです。

サンプルはMLでのやり取り(http://groups.yahoo.co.jp/group/overlayweaver/messagesearch?query=DHTTest)を読めばすぐ動かせるはずです。


Bittorrent*1を取り込む

上のDHTを用いる方法は真面目でよいですが、ピース単位でのダウンロードアップロードを行う処理や、またそのスケジューリング処理を自分で書かなくてはいけないので、実装コストがそれなりに高いです。

しかし、それは面倒なので、こちらの方法ではそういった処理を既存のソフトウェア(Bittorrent)で済ませてしまう方法を考えます。


まずBittorrentですが、効率的なデータ配布手法の一つであるというのはご存知の通りですね。

こちらも詳細説明は省きますが、要は各プロキシBittorrentキャッシュflvファイルアップロードダウンロードしようということです。


これについては、コマンドライン

ができるようなクライアント(未発見・・・)と

があれば、それらをプロキシから叩いてやるだけで簡単に実装できるはずです。

また、ライブラリがあればさらにスマートにできるでしょう。

普通クライアント(AzureusとかBitcomet)を同時に使うようにして、プロキシからキック(torrentファイルを関連付けに従ってオープンするとか)してあげるという方法もありかもしれません(torrentファイルの生成とアップロードをどうするかが問題ですが)。


処理手順に従って説明しますと

といった手順になります。


余談ですが、最近クライアントでは、クライアント独自*4DHTネットワークを持っていて、トラッカー無しでも動作させることが可能だそうです。それを使うとアーキテクチャ的に非集中になってさらに良い感じかもしれません。

UPNPを使う

実は、ユーザルータポートを開けさせることがOKなのであれば、今のものを実際に使えるレベルにすることは難しくありません。

一日もあればできるでしょう。

ただ、ブラウザ動画を見るだけなのにわざわざルータのセッティングをさせるなんてことは許容できないと考え、その方法は断念しました。


ですが、今のルータにはUPNPという機構がついていて、ソフトウェア自動的に必要なポートを開けさせることができたりします。そして都合の良い事に、Javaで使えるライブラリ(http://www.sbbi.net/site/upnp/docs/natmappings.html)もあります。

これを使って実装するというのは悪くないかもしれません。

#IPがバレバレなのがちょっと難点ですが


キャッシュディレクトリWinnyダウンロードアップロードフォルダに設定する

2chスレ(http://pc11.2ch.net/test/read.cgi/software/1192196662/)で提案されていました。

Winnyではルールベースでの自動ダウンロード(アップロードはどうせ勝手にやられたはず)ができるので確かに可能ですね。

#Winny自体のセキュリティの問題や、偽ファイルを流される問題などは解決しないとですかね

#使っているところを見られたらアレな感じだとか。。


Power Folderを使う

Power Folder*5というソフトウェアで、指定したディレクトリを複数人で同期させることができます。

そこで、それを使ってキャッシュディレクトリを同期させてしまいましょう。


しかし、そのままだとキャッシュディレクトリが大量の動画で溢れ返ってしまうので、再生数とアップされた日にちから、どれだけ見る確率があるかを求める評価関数を作って、プロキシから定期的に削除をかけてあげるとかしないと駄目ですね。


あと、部分キャッシュファイルキャッシュディレクトリと別のところで管理するようにしないと、それらも同期がとられてしまってまずいことになりそう。


懸念事項としては、Winnyの場合と同じように、変なファイルを対象ディレクトリに置かれると、それが他のユーザディレクトリにもコピーされてしまったり、偽のファイルを掴まされたりする可能性があることでしょうか。

#正しいファイルを何人かが持っている状況で、同じ名前の違うファイルを持つユーザが現れたらどういう風に同期がとられるのでしょうね。


[PowerFolder 日本語 Wiki]

http://powerfolder.qp.land.to/



まとめ

実装案は出したので誰かやって下さい。

以上。

*1http://ja.wikipedia.org/wiki/BitTorrent

*2普通のトラッカーにPOSTするようなプログラムを書けばいい?

*3:そういったWebサーバもどきを自分で作らないといけないかもしれない

*4:各クライアント勝手に実装してしまっているようですが。。

*5bittorrentを内部で利用しているらしく、効率は良いのではないかと予想されます

kshudokshudo 2008/01/03 22:15 実のところ、ウタゴエはすでにそれ (ニコ動 P2P 化) をとてもスマートに達成するソフトをひと通り持ってます。

kanbayashikanbayashi 2008/01/04 00:01 ですね^^

ニワンゴに売り込むとか^^

gotosangotosan 2008/01/04 00:45 Ocean Grid?

aircastleaircastle 2008/02/24 01:21 おっと、Shudoさんも発見。
うーん、コード読むコストは省略したくないけど、
ここを読む限りだと、現行コードではうまくいかない可能性があるのですな。

kanbayashikanbayashi 2008/02/25 10:55 JXTAシェルなどをランデブーピアとして立ち上げておいて、P2PSocketがそのピアに対して接続しに行くようにさせれば、コネクションの確立の問題は解決できると思います。

ただ、リレーノードといって、通信のリレーを行なってくれるピアが現状ではSunの用意しているものだけ(リレーピアのリストを得るCGIの返すデータを見る限り)なので、そこが帯域に関してボトルネックになってしまう気がしています。これだと本末転倒ですよね。

ただ、最初はリレーピアとしてネットワークに参加していなかったピアが、動的にリレーピアになったりすることがあるらしい(確信度低)ので、これも大した問題じゃないのかもしれません。

詳しくは
http://www.shudo.net/article/JXTA-DHT-20040408/
を参照してみて下さい

kanbayashikanbayashi 2008/02/25 10:57 リレーピアについては
http://www.geocities.jp/tomleague/jxta/jxta.html
を参照した方がいいですね。

kanbayashikanbayashi 2008/02/25 10:59 リレーピアのリストを返すCGIはコレです
http://rdv.jxtahosts.net/cgi-bin/relays.cgi

P2PSocketの中でもこのCGIにアクセスしてリストを入手しているようです。

aircastleaircastle 2008/02/26 01:46 うーん,もうちょっと検討してみますです.
BT取り込むほうが結果としてよいような気もします.

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証