一般的な説明GnutellaNetは"ウィルスの増殖"のように動作する。私があなたにメッセージを送るとあなたはそのメッセージを接続している全てのクライアントに送る。そんなわけで、残りのネットワーク全てを知るためには私はあなただけ知っていればよい。
このメッセージ配送の仕組みを一見するとあなたはそれが無秩序な程の量のトラフィックを発生するのではないかと思うだろう。Gnutella 0.54のデフォルトを例にとってみよう。GnutellaはデフォルトであるTTL(TTLはTime to Live あるいは、あるメッセージが死ぬまでに通過することのできる回数を意味する。)値をもった25のアクティブな接続を維持しようとする。最悪の場合、これはたった1つのメッセージが257あるいは、6103515625(60億)のメッセージを発生させることを意味する。
さて、実際はそれほど最悪なことは起きない。現実にはいつでも2000より少ないクライアントしかGnutellaNetに存在しない。それは我々の仮想上のメッセージにおけるTTL値が失効するずっと前に、すべてのクライアントが我々のメッセージを既に見たことになるからだ。
明らかにいったんクライアントがあるメッセージを見てしまえば、もうそのメッセージを処理する必要がない。本来のGnutellaの設計者たちはこのことを認識しており、Gnutellaがネットワーク上でそれぞれのメッセージを一意に識別できるようにそれぞれのメッセージにGUID(Globally Unique Identifier)を含めるように設計した。
じゃぁ、GnutellaクライアントがGUIDをもっているとどんないいことがあるんだろう?各Gnutellaクライアントは一度見たGUIDの短期記憶を保持している。たとえば、 私は自分が受け取ったメッセージは覚えているだろう。 もし私がまだ見ていないメッセージであれば、私はそのメッセージを適切であるとしフォワードする。もし私がそのメッセージを見たことがあれば、それは私がすでにそのメッセージをフォワードしているということになり、私がフォワードしたものはすべて見たことがあるメッセージということになる。だから私は増殖を気にせずに済むしみんなを心配事に巻き込まずに済む。
トポロジーGnutellaNetには階層構造がない。全てのサーバは平等である。すべてのサーバはまたクライアントでもある。 だからどんな人も貢献できる。すべての平等主義的なシステムのように他のシステムより平等なサーバがある。高速な接続で走っているサーバはより多くのトラフィックをサポートする。それらは他のシステムへのハブになり、より素早くリクエストに応える。低速な接続のサーバはGnutellaNetの僻地へ降格されより遅く検索結果を受け取る。そしてもしそれが高速な環境の振りをすれば、パケットの洪水を浴びて死ぬことになる。
しかし、それは階層構造がないということだけで、もたらされたのではない
それぞれのGnutellaサーバは直接自分に接続しているサーバについてのみを知っている。PINGに応答するかQUERYに応答することで自身を報告しなければ、その他のサーバは見えない。これは驚くべき匿名性をもたらす。
不幸なことに、階層構造が存在しないこととサーバリストを発見する材料がないことの組み合わせはネットワークを説明づらくしている。それは木構造ではなく(階層構造がなく)円環的な構造なのだ。円環的なネットワークは多くの不必要なネットワークトラフィックが存在することを意味する。今日のクライアントはトラフィックを緩和する十分な機能がない、しかしスケーラブルなGnutellaNetのためには開発者がこの問題を考え始めることが必要になるだろう。 |