Gnutella

**Gnutella**（發音為 /nʊˈtɛlə/，單詞中的 _g_ 不發音，或者發音為 /gnʊˈtɛlə/）是一種檔案分享網路。2005 年 6 月，gnutella 約有 181 萬台使用者（電腦），而 2006 年 1 月增加到超過 300 萬個節點。截至 2007 年底，它是網際網路上最流行的檔案分享網路，估計市場份額超過 40%。

## 歷史

Gnutella 網路的第一個客戶端由 Nullsoft 公司的賈斯汀・法蘭科（Justin Frankel）與湯姆・帕勃（Tom Pepper）於 2000 年早期最先開發。同年 3 月 14 日，該程式被放在 Nullsoft 的伺服器上並允許公眾下載。該程式的原始碼原計劃稍後在 GNU 通用公共許可證下被發布。

與半集中式網路如 FastTrack（KaZaA）以及 Napster 不同，Gnutella 網路是完全分散式的。其最初的流行是源於 2001 年早期 Napster 由於法律糾紛而被關閉的威脅。不斷增長的使用者也使得該協定的最初版本暴露了不少缺陷。2001 年早期，各種不同版本的協定（最初以專有閉源客戶軟體形式實現）使得 Gnutella 的擴充性得到了增強。與先前的協定將每一個使用者節點都當作使用者以及伺服器不同，改進過的協定將某些使用者當作 "超節點"（ultrapeer），其為與之連接的所有使用者路由搜尋請求及回應。

這些發展使得 Gnutella 網路進一步吸引了更多使用者。2001 年晚期，一種 Gnutella 客戶端軟體 LimeWire 成為自由開源軟體。2002 年 2 月，Morpheus，一個商業檔案分享開發群，放棄了原先的基於 FastTrack 的端到端軟體，並行行了新的基於自由開源 Gnutella 客戶端軟體 Gnucleus 的新客戶端軟體。

"Gnutella" 這個詞語現在被來指作被不同的客戶端軟體使用的一種開放網路協定，而不用來指作任何一個單獨的專案或者某一個軟體。由於許多不同的組織都在開發新的客戶端軟體，而且該協定本身也將不斷演變，Gnutella 這個詞語的意義在將來或許也會變化。

Gnutella 這個名字是 _GNU_ 與 _Nutella_ 的混成詞：人們普遍認定法蘭科與帕勃在開發 Gnutella 專案的時候吃了許多的 Nutella，並且希望在 GNU 通用公共許可證下完成專案。Gnutella 並未與任何 GNU 專案相關聯；關於 Gnutella 在 GNU 中的相關專案，可以參見 GNUnet。

## 工作原理

要了解 Gnutella 網路是怎樣工作的，先設想一個大的由使用者（稱為「節點」）組成的環，每個節點都有 Gnutella 客戶端軟體執行。當初始啟動時，客戶端軟體必須進行自舉（Bootstrapping）並找到至少一個其它節點，有多種不同的方法可以達到這一功能，包括軟體內建的一組正在工作的已經存在的網址列表，Web 快取的已知節點更新（稱為 GWebCaches （頁面存檔備份，存於網際網路檔案館））, UDP 伺服器快取以及 IRC。一旦連接上，客戶端就會請求一張活動網址列表。

當使用者想要進行搜尋時，客戶向每一個活動聯接節點傳送請求。在歷史上（協定 0.4 版本），一個客戶的活動聯接節點數十分小（大約是 5），所以每一個收到請求的聯接節點都會再向其自身的所有聯接節點轉發該條請求，如此繼續下去，直到該請求封包在網路中被轉發的「跳數」超過一個預先設定的數值（最大為 7）。

到了 0.6 版之後，Gnutella 網路中的節點被劃分為葉節點（leaf nodes）與超節點（ultra nodes 或 ultrapeers）。每個葉節點僅與少數（一般為 3）超節點連接，而每一個超節點與多於 32 個的其它超節點相連。在這種更高的出度（outdegree）下，先前提到的一條查詢在網路中能達到的最大「跳數」被降低到 4。

葉節點與超節點利用查詢路由協定（Query Routing Protocol）來交換查詢路由表（Query Routing Table (QRT)）。葉節點將它的 QRT 傳送到每一個與之連接的超節點，超節點隨後將每一個與之相連接的葉節點傳來的 QRT 以及其本身的 QRT 合併，並且將其與自身的鄰居節點交換。

在實際中，這種在 Gnutella 網路中的搜尋模式是十分不可靠的。由於每一個節點都是一台普通的電腦使用者，他們經常連接或者斷開網路，所以整個 Gnutella 網路結構永遠都不是完全穩定的。Gnutella 網路搜尋的頻寬消耗也是隨著連接使用者的增加而指數遞增的 [1]（頁面存檔備份，存於網際網路檔案館），經常飽和的連接會導致較慢的節點失去作用。因此，搜尋請求在網路中會被經常丟棄，與整個網路相比，大多數的查詢只會到達其中的很少一部分節點。

## 協定功能及擴充

Gnutella 曾經是一種純粹的基於洪泛式請求（query flooding）協定。早期的 Gnutella 0.4 版使用 5 種不同的封包種類，即是：

* ping：用於發現網路中的節點
* pong：用於回覆 ping 訊息
* query：用於尋找某一個檔案 search for a file
* query hit：用於回覆 query 訊息
* push：用於處於防火牆後的伺服器的下載請求

以上不同訊息包的定義主要是為了處理 Gnutella 網路中的搜尋功能。檔案傳輸功能是由 HTTP 協定實現的。

Gnutella 協定的開發目前由 GDF（Gnutella 開發者論壇）所領導。許多擴充協定已經或正在由不同的軟體商以及 GDF 的自由開發人員開發。這些擴充包括智慧型查詢路由（intelligent query routing）、SHA-1 校驗碼、query hit transmission via UDP、基於 UDP 的查詢（querying via UDP）、基於 TCP 的動態查詢（dynamic queries via TCP）、基於 UDP 的檔案傳輸（file transfers via UDP）、XML 元資料、source exchange（也被稱為 "the download mesh）以及 parallel downloading in slices（swarming）。

在 Gnutella 開發網站上有試圖在 Gnutella 0.6 版中將這些協定擴充規範完成的相關努力。由於所有的協定擴充還只是作為提議而存在於規範中，因此儘管已經過時，Gnutella 0.4 版的標準至今仍是最新的完整技術規範。實際上，GDF 的開發人員指出在目前的 Gnutella 網路中使用 0.4 版的訊息握手機制已經十分困難，或者根本不可能，開發人員應該遵循正在編寫中的技術規範（頁面存檔備份，存於網際網路檔案館）來進行開發工作。

## Gnutella2

Gnutella2 並不是 Gnutella 的繼承者，而是 Gnutella 網路協定的一個分支，其於 Gnutella 相比既有優點也有自己的缺點。 A sore point with many Gnutella supporters is that the "Gnutella2" name conveys an upgrade or superiority.

## 參見

* Bitzi
* Gnutella crawler
* Gnutella Web Cache
* GNUnet
* WASTE
* JXTA

## 參考資料

## 外部連結

* Gnutella Protocol Development Wiki（頁面存檔備份，存於網際網路檔案館）
* Gnutella 論壇 （頁面存檔備份，存於網際網路檔案館）
* GnuFU （頁面存檔備份，存於網際網路檔案館），"Gnutella For Users: A description of the inner workings of the Gnutella network in User-Friendly Style"
* Why Gnutella Scales quite well （頁面存檔備份，存於網際網路檔案館） - A text which corrects some of the myths around Gnutella
* Gnutella Client Feature Comparision （頁面存檔備份，存於網際網路檔案館） - Client comparison of LimeWire，Phex，BearShare，gtk-gnutella，Gnucleus，Shareaza。
* Gnutella announcement（頁面存檔備份，存於網際網路檔案館） on Slashdot
* _Regarding Gnutella_ by GNU（頁面存檔備份，存於網際網路檔案館）
* Gnutella web cache (GWC) responses and engines （頁面存檔備份，存於網際網路檔案館）
* "A Measurement Study of Peer-to-Peer File Sharing Systems", by Stefan Saroiu, P. Krishna Gummadi, Steven D. Gribble. Proceedings of Multimedia Computing and Networking 2002（MMCN'02）, San Jose, CA, January 2002.
* _Mapping the Gnutella Network: Properties of Large-Scale Peer-to-Peer Systems and Implications for System Design （頁面存檔備份，存於網際網路檔案館）_ . M. Ripeanu; I. Foster and A. Iamnitchi, IEEE Internet Computing, 6（1）, February 2002.
* The 5th annual Passive & Active Measurement Workshop
* _Music Downloads: Pirates- or Customers? （頁面存檔備份，存於網際網路檔案館）_ . Silverthorne, Sean. Harvard Business School Working Knowledge，2004.
* _Free riding on Gnutella revisited: the bell tolls?（頁面存檔備份，存於網際網路檔案館）_ . D. Hughes, G. Coulson, and J. Walkerdine. IEEE Distributed Systems Online, 6（6）, June 2005.