Gnutella2

**Gnutella2**（**G2**）は、主にマイケル・ストークスによって開発され、2002年に公開されたP2Pの通信プロトコルである。

Gnutella2はGnutellaプロトコルに着想を得ているが、その設計には共通点がほとんどなく、例外としては接続時のハンドシェイクおよびダウンロードの仕組み程度である。

G2は拡張可能なバイナリ形式のパケットを採用しており、探索アルゴリズムも完全に新しいものとなっている。

さらに、G2は関連性はあるが大きく異なるネットワーク・トポロジーと、メタデータの改良されたシステムを備えており、これによりネットワーク上のウイルスなどの偽ファイルを効果的に減らすことができる。

## 歴史

2002年11月、マイケル・ストークスはGnutella2プロトコルをGnutella Developers Forumにて発表した。Gnutella2の目的は、gnutella 0.6プロトコルとの決別を図り、一からやり直すことで、gnutellaの不完全な部分をより洗練された形で実装し、全体として印象的かつ魅力的なものにすることだと考える者もいた。一方で、主にLimeWireおよびBearShareのソフトウェア開発者たちはこれを「安っぽい売名行為」とみなし、技術的価値を認めなかった。現在でもネットワークを「Gnutella2」とは呼ばず、「マイクのプロトコル（Mike's Protocol、MP）」と呼ぶ者もいる。

Gnutella2プロトコルは、gnutella 0.6の仕様に定められた「GNUTELLA CONNECT/0.6」という旧式のハンドシェイク文字列を接続時に使用している。この後方互換的なハンドシェイク手法は、gnutellaネットワークを新しい無関係なネットワークのブートストラップに利用しようとする試みであるとし、Gnutella Developers Forumからは批判された。一方で支持者は、gnutellaとの後方互換性を保ち、既存のgnutellaクライアントが自由にGnutella2を追加できるようにすることが意図であると主張した。

開発者たちの立場が固定化される中で、やがて両陣営の姿勢はさらに強硬なものとなった。

草案は2003年3月26日に公開され、より詳細な仕様も間もなく発表された。G2は多くの「旧」gnutellaネットワーククライアントには対応していないが、多くのGnutella2クライアントはgnutellaにも接続している。Gnutella2の支持者は、これは政治的な理由によるものだと主張し、gnutellaの支持者は、大幅な変更には深いコードの書き換えが必要となるため、そこまでの価値がないと反論している。

## 設計

Gnutella2は、ノードを葉（Leaves）とハブ（Hubs）の2種類に分けている。ほとんどの葉は2つの接続をハブに維持し、ハブは数百の葉接続と平均して他のハブへの7つの接続を受け入れる。検索が開始されると、必要に応じてノードはハブのリストを取得し、リストにあるハブに順に接触して、検索済みのハブを記録していく。これはリストが尽きるか、あらかじめ定められた検索制限に達するまで続けられる。この仕組みにより、ユーザーはネットワークに負荷をかけずに人気のあるファイルを容易に見つけることができ、理論上はネットワーク上のどこにあっても単一のファイルを見つけられる能力を維持している。

ハブは葉が持つファイルを、Query Routing Tableを用いてインデックス化する。このテーブルは、葉がハブにアップロードするキーワードのハッシュを単一のビットで表したエントリで構成される。ハブは、葉から送られたすべてのハッシュテーブルを統合して隣接するハブに送るバージョンを生成する。これにより、検索に一致するエントリがルーティングテーブルに存在しない場合、ハブは単にそのクエリをリーフや隣接ハブに転送しないことで、大幅なの節約を可能にしている。

Gnutella2は検索にあたってTCPではなく、UDPを広範に利用している。TCP接続の確立にはがかかるため、大量のノードに対して少量のデータを送信する必要があるランダムウォーク型の検索システムでは実用的でない。しかしながら、UDPにも欠点がある。UDPは接続レスのプロトコルであるため、送信側のクライアントにメッセージが届いたことを通知する標準的な方法がなく、パケットが失われた場合はそれを検知できない。このため、Gnutella2のUDPパケットには信頼性設定を可能にするフラグが存在する。信頼性フラグが有効なUDPパケットを受信すると、クライアントは受信確認のために肯定応答パケットを送信し、送信元にパケットの到達を知らせる。肯定応答パケットが送信されなかった場合、信頼性のあるパケットは再送され、配信の確実性を高める。重要度の低いパケットはフラグが無効であり、確認応答パケットを必要としないため、信頼性は下がるが、応答を待つ必要がなくなることでオーバーヘッドも削減される。

## プロトコルの特徴

Gnutella2は、XMLの文書ツリーに匹敵する拡張可能なバイナリパケット形式を採用しており、これはgnutellaの不完全な設計部分に対する解決策として構想されたものである。このパケット形式は、将来的なネットワークの改良やベンダー独自の機能を、ネットワーク上の他のクライアントにバグを引き起こすことなく追加できるように設計されている。

ファイルの識別および信頼性のあるデータ完全性チェックのために、Gnutella2はSHA-1のハッシュを使用する。また、ファイルの一部を複数のソースから並列にダウンロード可能にし、さらにダウンロード中のファイルの一部を信頼性をもってアップロードする（スウォーミング）ために、Tiger Treeハッシュが用いられている。

より堅牢で完全な検索システムを構築するため、Gnutella2にはメタデータシステムがあり、単なるファイル名による情報よりも詳細なラベリング、評価、品質情報を検索結果に含めることが可能である。ノードはファイルを削除した後でもこの情報を共有できるため、ユーザーはウイルスやワームをネットワーク上でマークできるが、そのためにファイルを保持しておく必要はない。

Gnutella2は、ネットワーク接続においてを利用しており、ネットワークが使用する帯域幅を削減している。

Shareazaには、画像や動画のプレビューをリクエストする追加機能があるが、FilesScopeだけがこれを限定的に利用している。

は、GnutellaとG2のギャップをさらに縮めるためにプロトコルを拡張している。特に、セミリライアブルなUDP層において、累積肯定応答および拡張肯定応答が追加され、旧来のG2クライアントとの後方互換性が保たれている。さらに、/Q2/Iにおける"A"文字列、およびクエリヒットにおける/QH2/H/ALT、/QH2/H/PART/MT、/QH2/HN、/QH2/BH、/QH2/G1の導入が含まれる。

## Gnutellaとの違い

全体として、両ネットワークは非常に類似しているが、主な違いはパケット形式と検索手法にある。

### プロトコル

Gnutellaのパケット形式は、元々拡張性を考慮して設計されておらず、長年にわたって多くの機能が追加された結果、パケット構造が煩雑で非効率的になっているとして批判されてきた。Gnutella2はこの点を教訓とし、Gnutellaに追加された多くの機能を標準で備えるとともに、将来的な拡張性を最初から設計に組み込んでいる。

### 検索アルゴリズム

Gnutellaが方式で検索を行うのに対し、Gnutella2はランダムウォーク方式を採用しており、検索ノードがハブのリストを収集し、それらに一つずつ直接接触する。この際、ハブは「ハブのクラスター」と呼ばれる構造で自己組織化されており、各ハブは隣接するハブの情報をミラーするため、葉は通常7つのハブから成るクラスター全体の情報を受け取ることになる。これはGnutellaのクエリフラッディング方式に対していくつかの利点を持つ。検索を続けてもネットワークトラフィックが指数的に増加しないため効率的であり、クエリが通過するノード数も少なくて済む。また、検索の粒度が向上し、あらかじめ定められた結果数に達した時点でより効果的に検索を停止することが可能となる。しかし一方で、このウォーク方式はネットワークの複雑性とネットワークの保守・管理の負荷を増大させるとともに、悪意ある攻撃者によるDoS攻撃への悪用を防ぐための安全策も必要となる。

### 用語の違い

用語の違いも存在する。ネットワークを集約するために用いられる高機能ノードは、Gnutellaでは「Ultrapeers」と呼ばれるが、Gnutella2では「ハブ」と呼ばれ、トポロジ上でもやや異なる使われ方をしている。Gnutellaにおいては、Ultrapeersは通常、葉接続とピア接続の数を同程度に保つのに対し、Gnutella2のハブははるかに多くの葉を維持し、ピア（ハブ間）接続は少なめにしている。これは各ネットワークの検索方式によって最適なトポロジが異なるためである。

## クライアント

### 一覧
自由ソフトウェアのGnutella2クライアントには以下がある：

* Adagio（クロスプラットフォーム）、Adaで記述、GPLライセンス。
* Gnucleus（Windows）、C/C++で記述、LGPLライセンス。
* （クロスプラットフォーム）、C言語で記述。バージョン1.1以降、G2への葉モード接続のみ対応。
* MLDonkey（クロスプラットフォーム）、OCamlで記述、GPLライセンス。ただしバージョン2.9.0（2007年）以降、サポートは公式に非維持となり、バイナリには無効化されている。
* Shareaza（Windows）、マルチネットワーク対応、C++で記述、GPLライセンス、現在G2ネットワークの約93％を占有。

プロプライエタリソフトウェアの実装には以下がある：

* （Windows）中国製の派生プログラム。他のG2クライアントとは相互運用性がなく、独自の「Foxy」ネットワークを使用しており、G2本体から分離されており、G2へのネットワークリークがあることで知られている。理論上はG2との互換性がある。
* Morpheus（Windows）

### 比較
以下の表は、G2ネットワークをサポートする利用可能なアプリケーションについて、一般的および技術的な情報を比較したものである。

 

## 関連項目

* GnucDNA
* Shareaza

## 脚注
 

## 外部リンク
* Gnutella2 wiki
* g2paranha - G2 Network Crawler