Gnutella

**Gnutella**（**グヌーテラ**、**ニューテラ**）はP2Pプロトコルおよびファイル共有クライアント。

## 概要
ナップスターなどのP2Pクライアントの場合は、中央サーバが存在し、ファイルのメタデータの管理や検索サービスを提供することにより、P2Pネットワークが機能している。それに対し、グヌーテラはサーバに依存せず、純粋にピア間の通信のみでファイルの送受信などの機能を実現している。

P2Pのしくみの分類中、このようなピア間の通信のみによって機能するものをピュアP2P、ナップスターのようにサーバの仲介を必要とするものを、ハイブリッドP2Pと呼んでいる。

その他には、KaZaA や Skypeに使われているスーパーノード型ハイブリッドP2Pがある。

## 特徴
ナップスターに代表される第一世代P2P(ハイブリッドP2P)は、中央サーバに依存する為、ネットワークへのトラフィックは少ないが、耐障害性が低く、サーバがダウンしたらネットワークが形成できないという弱点があった。それに対してグヌーテラに代表される第二世代P2P（ピュアP2P）は、各クライアントがサーバを兼ねる（サーバント）為、耐障害性が高い。

製作者の「核戦争でも生き残れるように設計されたもの（*Gnutella is designed to survive nuclear war*）」や、「万一、ニューヨークに核爆弾が投下されたとしても、（それ自体はたいへんなことだが）ニューヨーク以外の『グヌーテラ友達』によってグヌーテラネットは維持されるだろう」といった言葉が、グヌーテラネットワークの特徴をよく表している。

## グヌーテラの仕組み
グヌーテラネットワーク上で交わされているメッセージは、PING、PONG、PUSH、QUERY、QUERY_HITの以上である。

### 接続
中央サーバが存在しないグヌーテラにおいて、最初に接続するときに何処に問い合わせるのか？という問題が出てくる。
グヌーテラ第一世代では、ノード情報を掲示板などで入手する方法が採られていたが、グヌーテラ第二世代になって、GWC（GWebCache）というブートストラップサーバーにより各ノードと接続する方法がとられた。

接続においては、グヌーテラサーバントはまずPINGという接続要求を出す。それに対して、接続相手はPONGという信号を返して、ハンドシェイクを行い接続が完了する。

### 検索
検索はグヌーテラネットワークで行っており、ファイルを求めるサーバントは、QUERYをグヌーテラネットワークに送信し、ヒットしたクエリがQUERY_HITとして検索結果に表示される。

### 転送
グヌーテラでの、ファイルの転送はHTTPプロトコルで行われている。
ファイルの転送は、QUERY_HIT識別子に含まれる、IPアドレスやポート番号などによってファイルの所有者にHTTPでの転送命令を出す。
また、ファイル所有者がファイアウォール下にいるサーバントの場合は、PUSH識別子を出し、相手サーバントがHTTPでの転送命令を出す。

## 開発の経緯
2000年、AOL社の一部門であるNullsoftで、当時社員だった Justin FrankelとTom Pepperの二人が、最初のグヌーテラクライアントを開発した。

2000年3月14日、二人はNullsoftのサーバー上にプログラムをダウンロードできる形でアップロードした。この出来事はスラッシュドットで告知されたため、その日の内に数千人がソフトをダウンロードした。ソースコードについては、後ほどGPLライセンスの元で提供する予定だった。

翌日、AOLは法的問題を理由にプログラムの提供を中止し、さらにNullsoft部門にプロジェクトを中止させた。しかしこの措置によっても、グヌーテラを止めることはできなかった。

数日後には、リバースエンジニアリングによってプロトコルは解析され、それを元にグヌーテラ互換のオープンソースクローンが登場した。現在でも、様々なグループが グヌーテラ 互換クライアントの開発を続けている。

### グヌーテラ第一世代
シャットダウンから間もなくして、Brian MaylandがNullsoftのプログラムを入手して、グヌーテラプロトコルの動作原理を理解するためにリバースエンジニアリングした。彼の仕事のおかげでテキストベースのUNIXプログラムを作ったJosh Pieperや、より使いやすいGUIをもったプログラムを作ろうとしたGene KanやSpencer Kimballのような人々によってソフトウェア開発がなされることになった。

### グヌーテラ第二世代
ユーザの裾野が広がるにつれ、システムの重大な問題が取り沙汰されはじめた。ネットワークはPINGリクエストで溢れかえり、同時に非常に多くの検索クエリーで高負荷になった。より高速なハブとしての役割を果たすコンピュータに接続した低速のモデムといった形でネットワークのトポロジーは非効率的だった。第一世代のソフトウェアの深刻なバグによってパケットがネットワーク上を不明確にさまよっていた。ネットワークは“本来は少数のユーザのために設計されたもので”100人単位から10,000 単位のユーザに膨張しトラブルに見まわれた。「ただ乗り」や「何も提供していないのにファイルを取り出すだけの人々」によってもユーザが探し物をするのを難しくした。

もう一度、情熱的なコミュニティーが救済に乗り出した。Bob Schmidtが初めてのホストキャッシングシステムを開発した。プログラマー達はGnutella 0.56のコードを修正し、パケットが適切に運ばれるようにTTLのバグを取り除こうとした。そして、Jorge Gonzalesはネットワークをダメにするスパマーたちからネットワークを守る行動に出た。

この時点で、物事は個人の開発者が全てをまかなうにはあまりにも複雑になっていた。彼らはコードを書き、報道やユーザやお金の工面をしなければならなかった。
こういった事情で、早急に商業的な努力が介入し、「救済に乗り出す」必要が出てきた。Clip2はgnutellahosts.comを開発し、より良いホストキャッシュの実装し、いくらかナップスターのようなトポロジーをグヌーテラネットワークに組み入れて合体させるようなやり方で動く小さなサーバリフレクターを開発した。

## グヌーテラ互換サーバント

## 関連項目
* Cabos
* Freenet
* LimeWire
* Peer to Peer
* Perfect Dark
* Profes
* Share
* WinMX
* Winny
* ヌテラ - 北米や欧州で人気のあるスプレッド（パンなどに塗る食品）。Gnutellaの語源とされるものの一つ（GNU + Nutella）。Gnutella の名前は GNU と Nutella から付けられたとされる。

## 脚注・出典

## 外部リンク
* Gnutella Wiki（日本語）
* @IT : ネットワーク管理者のためのGnutella入門（日本語）
* GTK-Gnutella（日本語）
* Gnutella Protocol Development（英語）
* LIMEWIRE DEVELOPER RESOURCES（英語）

*Gnutella互換サーバント*
* 360Share
* Acqlite
* Acquisition
* AquaLime
* BearFlix
* BearShare
* Cabos
* Epicea
* eTomiPro
* Foxy
* FreeWire
* FrostWire
* giFT-Gnutella
* GnuAce
* GPU
* GTK-Gnutella
* GnucDNA
* Gnucleus
* iMesh
* Kceasy
* LemonWire
* LimeWire
* LimeWire CVS jum
* MLDonkey
* Morpheus
* Mutella
* MXIE
* MyNapster
* NeoNapster
* Phex
* Shareaza
* Swapper.NET
* TrustyFiles
* Vagaa
* XNap
* xolox
* Zultrax