分散ハッシュテーブルのP2Pアプリへの応用〜その1


さて、今まで分散ハッシュテーブルの仕組みの概要について説明してきました。これからは分散ハッシュテーブルを使ってどのようなP2Pアプリを実現するかいくつかアイデアを考えてみたのでそれらを説明します。(もちろん、他人のアイデアも取り入れています。)この章を通して分散ハッシュテーブルがいかに強力な手段であるか理解して頂ければ幸いです
はじめに(凡例)
本説明では次のような記号を使います。
hash():ハッシュ関数
Node_ID:ノードID
P_Key:公開鍵、S_Key:秘密鍵
IP_X:ノードXのIPアドレス
name:コンテンツなどの名前

また分散ハッシュテーブルは特に断りがない限りChordの使用を前提にしています。
ファイル共有
コンテンツ名nameを保持しているノードXについてはNode_ID=hash(name)のノードYに{name,IP_X}を格納しておきます。コンテンツnameを取得したいノードZはノードYを検索し、IP_Xを知ります。これによってノードZはノードXと直接通信を行い、ファイルが転送されます。
P2Pメッセンジャー
ノードXのニックネームをnameとします。Node_ID=hash(name)のノードYに{name,IP_X,Xのプロフィール等のデータ}を格納してきます。ニックネームnameと通信したいノードZはノードYを検索し、IP_Xを知ります。これによってZはノードXと直接通信を行い、メッセージを伝える事ができます。

上記の方法では匿名性がありません。そこで、ノードZが検索時に複数のノードを介してノードYを知る事を利用して、それら複数ノードをプロキシとして通信させる方法が考えられます。


P2Pメール
ノードXは公開鍵p_key_Xと秘密鍵s_key_Xを作成します。ノードXのニックネームをnameとします。Node_ID=hash(name)のノードYに{name,IP_X,p_key_X,プロフィール等のデータ}を格納します。ニックネームnameへメールしたいノードZはノードYを検索し、IP_Yとp_key_Xを知ります。(※IP_Xでないことに注意!)Zはメール内容をp_key_Xで暗号化し、ノードYに飛ばします。

ノードYはChordの場合、ノードYよりも順にNode_IDが大きくなる複数のノードにメールを複製します。ノードXは定期的にノードYと通信し、自分宛てのメールを取得し、s_key_Xでメールを復号化します。

ノードZがノードYにメールを送信する理由として、ノードXが必ずしもネットワークに存在しない可能性があることが挙げられます。すなわちノードYがメールの世界でのPOPサーバになるのです。(もちろん、ノードXが存在した場合、ノードYがノードXにメールをpushする事も考えられます。)

また、メールを複数複製することで、ノードYがネットワークから離脱しても、メールの内容は失われません。POPサーバの場合、メールを読むと基本的にはメールは削除されますが、このようなP2P 的なPOPサーバの場合、ノードのネットワークからの離脱が激しいので、各ノードの同期を取り、きちんとメールを削除させるよりはメールの保存期間を設け期間内まではメールを保存し、期間が過ぎればメールが削除されるシステムのほうが実装は簡単だと考えられます。またメールの一意性を保障するためにメールにはGUIDを付ける事も望ましいと思われます。


P2P掲示板
スレッドのタイトルををnameとします。Node_ID=hash(name)のノードYに{name,スレッドのメタデータ,レスの全体}を格納します。スレッドnameにアクセスしたいノードについてはノードYを検索し、ノードYに対して既に作成したレスの追加を申請します。またスレッドがなくならないように、Chordの場合、ノードYよりも順にNode_IDが大きくなる複数のノードにスレッド全体を複製します。

この方法ではレスの削除ができませんし、本当にそのノードが書き込んだが検証ができません。そこで、各ノードはレスに対して電子署名をすることが考えられます。例えばノードXはp_key_X,s_key_Xを作成し、レスに対してp_key_Xで電子署名をします。また、ノードXのニックネームnameとするとNode_ID=hash(name)となるノードPに対して{name,p_key_X}を格納します。

書き込む時にはノードXはノードYに対して電子署名されたレスと自分のニックネームnameを渡します。ノードYはhash(name)からノードPと通信し、ノードXのp_key_Xを知ります。このことで、ノードYは電子署名の検証ができます。また削除する時にはノードXがノードYに対して電子署名つきの削除依頼を出します。削除依頼のメッセージの検証については先ほどと同じ原理です。スレッドは他のノードに複製されているので、これらを削除する場合にはスレッドを複数したノードに対してノードYはノードXの削除メッセージを転送することが必要です。


P2P版Blog,wiki
基本的に掲示板と同じ原理なので割愛します。
次章は分散ハッシュテーブルによるP2PマルチキャストやP2PによるWEB匿名プロキシへの適用などを説明します。

NEXT

TOPページに戻る