跳至內容

Gnutella

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

Gnutella(發音為/nʊˈtɛlə/,單詞中的g不發音,或者發音為/gnʊˈtɛlə/)是一種文件共享網絡。2005年6月,gnutella約有181萬台用戶(計算機)[1],而2006年1月增加到超過300萬個節點[2]。截至2007年底,它是互聯網上最流行的文件共享網絡,估計市場份額超過40%。[3][4]

歷史

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

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

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

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

Gnutella這個名字是GNUNutella混成詞:人們普遍認定法蘭科與帕勃在開發Gnutella項目的時候吃了許多的Nutella,並且希望在GNU通用公共許可證下完成項目。Gnutella並未與任何GNU項目相關聯;[5]關於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的繼承者,[6]而是Gnutella網絡協議的一個分支,其於Gnutella相比既有優點也有自己的缺點。[7] A sore point with many Gnutella supporters is that the "Gnutella2" name conveys an upgrade or superiority.[8][9]

參見

參考資料

外部連結