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網路是怎樣工作的，先設想一個大的由使用者（稱為「節點」）組成的環，每個節點都有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網路搜索的帶寬消耗也是隨著連接使用者的增加而指數遞增的，經常飽和的連接會導致較慢的節點失去作用。因此，搜索請求在網路中會被經常丟棄，與整個網路相比，大多數的查詢只會到達其中的很少一部分節點。

## 協議功能及擴展

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.

## 外部連結

- 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.