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]

參見

參考資料

外部連結