跳轉到內容

點對點 (P2P) 網路與協議 / Gnutella

來自 Wikibooks,開放世界中的開放書籍

Gnutella 是一種開放的檔案共享網路,最初由 Nullsoft 的 Justin Frankel 建立。這意味著,與大多數其他網路不同,任何人都可以編寫一個客戶端來訪問 GNet,只要它符合公開可用的規範。

規範由GDF(Gnutella 開發論壇)進行討論和建立,這是一個開放的開發者郵件列表,目前擁有超過 1000 名成員。然後,這些規範將在rfc-gnutella中進行文件化。透過這種方式,所有程式都共享一個共同的基礎,同時該協議也允許客戶端特定的選項。開發人員小心地確保最大程度的向後相容性。


Clipboard

待辦事項
[http://rfc-gnutella.sourceforge.net/developer/testing/index.html RFC-Gnutella 0.6]


儘管有這個名字,Gnutella 並不是 GNU 軟體,儘管一些 Gnutella 客戶端是 GPL 許可的。它是一個開放的網路,其名稱的起源更容易透過吃太多 Nutella 找到,而不是在 GNU 中找到。(這意味著:Gnutella 不是 FSF 的專案,也不與 GNU 軟體工具相關)。雖然 Gnutella 最初被宣告為一種完全分散式資訊共享技術,但該協議的後續版本是集中式和分散式網路的混合,包括“伺服器”(超級節點或超級對等方)和“客戶端”(葉子節點或節點)。

Gnutella 客戶端軟體本質上是一個微型搜尋引擎(提供對網路搜尋引擎的替代)和檔案服務系統一體。Gnutella 在新的實現中還支援 Tiger 樹雜湊 (TTH) 用於檔案傳輸。

Gnutella 的一個兄弟值得特別關注,儘管當前客戶端的一些開發人員會否認這一點。它被稱為 MP(Mike 的協議)或大多數 Gnutella 開發人員所說的 Shareaza 協議,而它的開發人員稱之為 Gnutella2,這個名字讓他的程式(Shareaza)獲得了大量媒體報道,並在_gdf中引發了許多爭議和反感。

Gnutella2 (Mike 的協議,G2)

由於開發者社群未能就協議演進達成共識,導致了 Gnutella 協議的分支

Gnutella2 也被稱為 Mike 的協議,因為第一個更改和實現來自單個開發人員Michael Stokes。2002 年 11 月,Michael Stokes正式且單方面宣佈建立 Gnutella2 協議,提交給Gnutella 開發者論壇,這在開發者之間引起了分歧,並導致修改不被幾個 Gnutella 應用程式支援,因為最初的提議與其他供應商的概念衝突(特別是 LimeWire 和 Bearshare)。

現在生成的實現放棄了所有舊的 Gnutella 協議,除了連線握手,並採用了一種全新的搜尋演算法。Gnutella2 通常縮寫為G2


Clipboard

待辦事項
完整資訊


網路模型

[編輯 | 編輯原始碼]

最初的:FoF

[編輯 | 編輯原始碼]

你可以將 Gnutella 網路的最初模型想象成朋友打電話相互獲取資訊。一個人問另外 5 個人,每個人又問另外 5 個人,以此類推。在第一步之後,到達的人數是 5,第二步是 25,第五步是 3125,第七步是 78,125,第 14 步大約是 61 億。這足以覆蓋地球上的每個人。最初的 Gnutella 使用了 7 步(稱為 HTL:跳躍到生存)。

這個模型最大的問題(除其他外)是,你必須成為該圈子的一部分才能使用它。

FoF 模型的問題
[編輯 | 編輯原始碼]

朋友的朋友模型有一些缺點,這些缺點源於搜尋執行的方式。如果搜尋結果過多,連線你的節點(你最近的 5 個朋友)可能會過載,因為每個答案都必須經過他們,因為他們不會給出你的“電話號碼”,而是給出他們自己的號碼,然後將答案傳遞給你。如果你問大學校長的名字,實際上你會得到數百個答案,而在網上你會得到數千甚至數百萬個答案。此外,如果每個問題都被傳遞給一個擁有 75,000 到 600,000 臺計算機的網路中的每個人,並且每臺計算機每小時只詢問一次,那麼他們中的每一個人都必須每秒回答大約 130 到 1600 個問題。而且他們必須將這些問題傳遞下去。雖然計算機速度很快,並且如今的網際網路連線與幾年前相比可以處理大量資訊,但這對於它們來說還是太多了。想象一下,你的電話整天不停地響,全是各種各樣的問題。

為了解決連線問題,人們提出了一些解決方法。

第一種方式:Pong 快取
[編輯 | 編輯原始碼]

Pong 快取意味著節點(即你)詢問它的朋友他們是誰的朋友。這意味著你的朋友將你介紹給他們的朋友,尤其是他們高度重視的朋友,你將所有新地址都寫入你的電話簿,這樣你就可以知道在你的原始朋友休假時該給誰打電話(有點像在不斷的雞尾酒會上)。這很簡單,並且具有為你提供非常可靠的聯絡人的優勢,但如果沒有至少認識一個已經在網路中的聯絡人,你就無法加入網路。這意味著你總能重新加入,但如果你從未加入過,你就無法連線。

第二種方式:記住誰回答
[編輯 | 編輯原始碼]

第二種方式非常簡單。當你其中一個朋友回電說 Smith(你以前不認識他)知道一些事情時,你會記下她的號碼。當你下次將他作為你的五個直接聯絡人之一打電話時,更有可能你能夠更快地獲得資訊,因為他可能有與你興趣相似的朋友(他應該從哪裡獲得資訊?),並且那些朋友比隨機挑選的人更有可能擁有你的資訊(至少當你詢問與你上次問題類似的事情時)。缺點是這些聯絡人可能不會經常在家,所以你可能會發現一個知識淵博的聯絡人,但你可能再也無法聯絡到他了。仍然沒有辦法在第一次嘗試時加入網路。現在我們來看看 Gnutella 中的最新發展之一:GWebCaches。我將在下一部分中討論它們。

第三種方式:GWebCaches
[編輯 | 編輯原始碼]

為了保持影像一致性,GWebCache 就像一個在報紙上釋出電話號碼並記錄來電者的聯絡人。當你離開一段時間後,不再確定你的聯絡人是否還使用同一個手機號碼,你就可以致電這個公開的聯絡人。在提供號碼之前,他們會問你:“你認識其他公開的聯絡人嗎?如果認識,請告訴我他們的號碼。” 這樣做是因為他們無法閱讀所有報紙,而你卻可以隨時閱讀,而且不需要為此付出太多努力。這樣,他們就能互相聯絡。然後,該聯絡人會提供一些電話號碼給你,並記下你的號碼(以便提供給其他人)以及他們認識的其他公開聯絡人(GWebCaches)的地址。

這就是 GWebCaches 工作原理的大致過程。GwebCaches 只對第一次連線至關重要。當你本地地址簿為空時,你會用到它們。你不應該優先使用它們,而應該優先使用本地地址簿。正如我所說,它們是 Gnutella 中的新發展之一,因此我將繼續介紹 Gnutella 中的一些最新變化和未來計劃。

超級節點和葉子節點

[edit | edit source]
改變誰呼叫誰

你肯定有朋友認識很多其他人,你可以向他們詢問,並且可以肯定他們會知道確切的可以給你答案的人。在 Gnutella 中,這些被稱為超級節點。超級節點不需要自己知道太多,他們只需要知道誰知道就行了。在 Gnutella 中,這意味著一個好的超級節點不需要擁有很多檔案就能對網路有所幫助。如果你害怕分享太多內容,你應該在 Gnutella 中成為一個超級節點。

更詳細的解釋

在計算機世界中,就像在現實世界中一樣,有些聯絡人可以處理更多電話,有些聯絡人無法經常打電話(或者負擔不起電話費)。在現實世界中,這是因為他們有更多空閒時間。而在計算機世界中,這是因為他們擁有更快的連線(如 DSL、Cable、T1、T3 或類似的寬頻)。在意識到這一點後,開發人員決定改變網路拓撲結構,也就是說當你繪製網路時它從外部看起來的樣子。現在你不再只是呼叫任何朋友,而只呼叫那些你知道有時間接聽你的電話並將電話轉接到其他人的人。為了避免你接到太多電話,他們會詢問你擁有哪些型別的資訊,或者用更人性化的話來說,你的專業領域是什麼。在計算機世界中,這意味著你的計算機會將所有檔案的列表傳送給超級節點,這就是我們對這類聯絡人的稱呼。該列表包含你共享的所有檔案的摘要(雜湊字串)(你決定讓其他人下載的那些檔案),下載者可以透過這些摘要驗證它們是否是他們想要的那些檔案。每當電話到達超級節點時,它會檢查你是否可能知道答案,只有在這種情況下才會呼叫你。

這些超級節點與其他節點有許多連線,這意味著他們擁有一個非常大的地址簿。通常情況下,他們會與地址簿中的 16 個其他超級節點保持聯絡,並將問題傳送給他們,這些超級節點又會將其傳送給另外 16 個超級節點,以此類推。他們還擁有大約 16 個葉子節點,這些葉子節點無法或不願意經常打電話,他們會從這些葉子節點接收電話,並且知道他們的檔案或,對人類世界來說,他們的專業領域。

這看起來似乎對超級節點來說很不公平,因為他們為了保持網路完整性而投入的資源遠遠超過葉子節點,但事實並非如此。雖然超級節點(UP)花費了大量時間來維護網路執行,但葉子節點專門收集和傳遞資訊。因此,當任何節點,無論是超級節點還是葉子節點,想要了解某個資訊時,他們只需發起一個電話,就可以由一個葉子節點專家向他們解釋。這樣一來,人們就可以專注於自己的專業領域,讓所有人都能從中受益。

超級節點內查詢路由協議
[edit | edit source]

雖然有了超級節點,並非每個人都需要參與向他人傳送問題,人們可以專注於分享他們的資訊,但超級節點仍然會將每個問題傳送給所有人,而不會考慮該超級節點是否有擁有這些檔案的葉子節點。這聽起來很正常,因為超級節點如何才能知道其他超級節點擁有哪些檔案呢?答案再次來自現實生活。普通人知道自己的朋友,也知道他們中哪些人可能知道某個特定問題的答案,哪些人肯定不知道。在現實生活中,這主要透過友好的聊天來完成。

現在,計算機通常不會閒聊,因此它們不會透過這種方式交換資訊。因此,查詢路由協議(QRP)應運而生。在 QRP 中,每個葉子節點都會告訴其超級節點它擁有哪些檔案,但它們不會使用檔名,因為這會佔用太多空間,而是將構成檔名中每個詞語的字母儲存為數字(畢竟這是計算機)。你可以將這個過程想象成一個戰艦遊戲(數字形成一個帶有兩個座標的棋盤)。一個超級節點不會將所有問題傳送給葉子節點,而只會傳送那些葉子節點可能能夠回答的問題(命中一艘戰艦),因此葉子節點接收到的不必要電話會少很多。

現在,既然這可以減輕葉子節點的壓力,為什麼不將其擴充套件呢?事實確實如此。現在,所有超級節點都將他們的棋盤傳送給直接鄰居。他們只會將那些還需要一步才能找到答案的搜尋傳送給棋盤上得分命中其他超級節點。這意味著,搜尋的最後兩步只有在有可能得到結果時才會進行。你可以很容易地理解為什麼這會大大減少頻寬使用率:想象一棵樹,一棵普通的樹,而不是那些數學結構中的樹。如果你試圖數葉子,你幾乎沒有機會。但是,如果你去掉葉子,只數樹枝,你的工作量就會少很多。如果你現在去掉所有那些細小的樹枝,你就可以真正開始數它們了。QRP 並沒有去掉所有的葉子和所有細小的樹枝,而是去掉了那些無法給你答案的葉子和細小的樹枝。由於每個問題必須經過的部分都會消耗頻寬,而葉子比樹枝多得多,在很多情況下,去掉最後兩步中的很多步(也就是說很多葉子和細小的樹枝),就可以減少計算機需要傳送的問題數量(葉子比樹枝多得多)。這個例子並不適用於整個 Gnutella,但在這裡它很貼切。

搜尋:動態查詢
[edit | edit source]

現在,雖然超級節點模型和 QRP 部分解決了以下問題:你沒有時間向其他人解釋清楚某件事,或者讓其他人解釋清楚,因為電話不斷響起,詢問你不知道答案的問題(或者用技術術語來說:因為網路流量超過了你的連線速度),但仍然存在另一個問題,如果你仔細觀察,通常可能不會被注意到。在現實世界中,超級節點會尋找一個專家,直到找到一個可以給你提供資訊的人,然後就會停止。在計算機世界中,問題會被不斷髮送,傳送給儘可能多的聯絡人,而不考慮是否已經有了答案。

有了動態查詢,這種情況就發生了改變。現在,超級節點一次詢問一個其他超級節點,然後等待一段時間,看看是否得到了答案。當他們獲得足夠多的答案以滿足他們的要求時,他們就會停止詢問。這聽起來很自然,但對 Gnutella 來說是一個巨大的進步,因為它節省了浪費在非常流行的問題上的資源。我再以大學領導為例:現在,如果你詢問大學領導,你的超級節點會首先檢視他們是否直接認識可以回答你問題的人。然後,他們只會給你一些他們認識住在校園裡的人的號碼。你仍然會得到不止一個答案,因為他們會給你不止一個號碼,因為他們無法確定你是否能聯絡到他們給你的每個號碼。但是你不會收到數千個電話號碼(來自校園裡的每個學生),首先是因為超級節點會浪費時間去做一些對你沒有額外幫助的事情,其次,因為你不可能永遠聯絡所有那些人,第三,因為這樣你可能再也聯絡不上你的超級節點,因為他們會忙著回覆其他告訴他們號碼的人的電話,並將你的問題傳送給其他超級節點。

在沒有搜尋的情況下查詢來源,即下載網格

[edit | edit source]

現在你可能會說,“但我無法從這三個人那裡下載,因為其他人已經在下載了。我想獲取所有可以從那裡下載的地址。”(而且你不是唯一有這種想法的人。我也這麼認為。)透過觀察現實世界,我們可以找到解決這個問題的方法,而不必浪費太多資源。在現實世界中,如果你要求專家向你解釋某件事,而該專家很忙,他們會知道一些其他可能現在有更多時間的專家(因為他們相互認識)。

將這應用於 Gnutella 並不像超級節點-葉子節點模型或動態查詢模型那麼容易。但程式設計師找到了一種方法。正如我在動態查詢模型中所述,你將獲得多個可以詢問的號碼。現在,當你呼叫一個應該知道答案的人時,你還會告訴他或她你所知道的其他號碼。這樣,這些專家就會相互認識(就像我之前提到的 GWebCaches 那樣,他們互相瞭解)。由於每個人在詢問時都會帶上自己的一組號碼,因此專家們會了解越來越多的其他地址,當你要求他們解釋,而他們現在沒有時間時,他們會將這些地址給你(即使他們有時間,他們也會這樣做,以防他們被打斷,因為在 Gnutella 中,你可以從多個來源同時下載,就像你在 overnet 網路中一樣(overnet 網路對此做到了極致,但只對大型檔案真正高效)。此外,專家們也會將你新增到他們的備用聯絡人列表中,只要你瞭解足夠多的知識可以教導他人。

這就是為什麼很多人會從你那裡下載你剛剛自己下載的檔案的原因。

下載

[edit | edit source]
群組下載和部分檔案共享
[編輯 | 編輯原始碼]

蜂群的概念很容易解釋(但在朋友的朋友模式下很難實現,所以我只在這一部分中放棄它)。它的工作原理很簡單,就是同時從不止一個人那裡獲取一個檔案。檔案被簡單地分成幾個部分,就像你想要從一些朋友那裡得到一本書,每個人只影印了幾頁。當要求每個人影印書的不同部分時,你就可以得到完整的書,而每個人只需要做很少的工作(如果一個人沒有時間做,其他人可以做)。

蜂群在下載網格和部分檔案共享 (PFS) 中效果最好,這允許人們共享他們正在下載的檔案,因為他們可以共享他們已經擁有的部分,而他們仍然從其他人那裡下載。你可以影印你擁有的那些頁面,而不需要擁有整本書,因為你的頁面都有編號,朋友可以向你索取特定的頁碼。

透過防火牆下載
[編輯 | 編輯原始碼]

想象一下,有些人無法被呼叫,但只能呼叫其他人(也許是因為他們只使用公共電話,或者他們的號碼沒有顯示在你的手機上,他們不喜歡公佈號碼,因為他們不喜歡被推銷電話騷擾,或者被電話恐嚇的人騷擾)。在 Gnutella 中,這些是在防火牆後面的計算機。他們可以呼叫其他人並從他們那裡獲取資訊,但沒有人可以呼叫他們。

解決方案是讓防火牆後面的人定期呼叫他們的超級節點,當有人想要呼叫他們時,他或她只需要呼叫超級節點,然後超級節點將兩個電話放在一起,一個電話是防火牆後面的人(不能被呼叫的人)接通的,另一個電話是你呼叫的。這樣你就可以和防火牆後面的人通話,但需要同時進行兩次呼叫,這意味著在計算機世界中需要兩倍的頻寬。防火牆後面的人總是保持與超級節點的連線,超級節點只是中繼資訊或資料。

有一些計劃可以節省超級節點的額外頻寬使用,方法是讓其他人來進行電話連線。然後,當有人想從防火牆後面的專家那裡獲取資訊時,超級節點會告訴防火牆後面的人和提問者呼叫第三個人。然後這個人會把兩個電話放在一起。在 Gnutella 中,大多數人有 3 到 5 部電話,所以這不是一個大問題。這些電話聯結器很可能被稱為路由節點。

檔案磁力連結

[編輯 | 編輯原始碼]

檔案磁力連結偏離了朋友的朋友模型。它們是網頁上的連結,你可以直接點選,它會告訴你的檔案共享程式在 Gnutella(事實上也包括其他網路)中搜索特定檔案,並下載該檔案。

你可以把它想象成報紙上的一篇文章,它告訴你一些資訊,這些資訊可以讓你瞭解超級節點所需的資訊,以便從你想要學習的專家那裡獲得資訊。在現實世界中,你很可能找到一個專家,以及從他或她那裡學到東西的人。

使用磁力連結可以避免獲取不良檔案,因為它們使用雜湊字串,這就像專家給你的資訊的摘要。如果他或她開始告訴你廢話,你馬上就能看到它與摘要不符。在 Gnutella 中,程式要求檔案,這些檔案由擁有它們的人分配了相同的摘要,即雜湊字串。下載後,程式會生成自己的摘要,並檢查它們是否真的匹配。如果不匹配,它會告訴你檔案已損壞。來自相同檔案的摘要總是完全相同的,因為它們是透過特定的數學方法完成的,這些方法在給定相同資料(即資訊)時總是得到相同的結果。

與磁力連結不同,KaZaA 連結和 eDonkey 連結並不安全,因為它們使用的方法可以被虛假檔案欺騙(例如,KaZaA 連結要求一種只檢查資訊的介紹和第一部分的摘要,而忽略所有其他部分,以便更快地建立摘要。當然,很容易給你提供虛假資訊,因為他們只需要在開頭說實話,然後他們就可以撒謊或胡說八道)。有關磁力連結的更多資訊,請訪問:Magnet-UriMagnetLink.org

現在有一個新的磁力連結版本:KaZaA 磁力連結。遺憾的是,這些並不安全,因為它們使用 KaZaA 雜湊系統(不完整的摘要)進行了一些更改(它們現在添加了另一個更小的摘要,它可能告訴你關於缺失部分的資訊,但它們沒有公佈是如何建立的)。如果 KaZaA 磁力連結提供有關搜尋詞的資訊,它們可能與 Gnutella 配合使用,但不能保證你得到它們提供給你的東西。如果在連結中找到“kzhash”這個詞,它可能不安全(除了名稱有點錯誤)。

Lime Wire LLC

[編輯 | 編輯原始碼]

LimeWire 是一個跨平臺的 Java 平臺點對點檔案共享 客戶端,開源(GPL),它使用 Gnutella 網路來定位和傳輸檔案。它還鼓勵使用者支付費用,然後使用者就可以使用 LimeWire Pro。它還使用 C++、Boost 許可的 libtorrent 庫支援 BitTorrent 協議。

軟體實現

[編輯 | 編輯原始碼]

要成為 Gnutella 網路的一部分,你可以使用以下列出的客戶端之一 

  • Deepnet Explorerhttp://www.deepnetexplorer.com/)是一個帶有 RSS 新聞閱讀器、P2P 客戶端整合(Gnutella)和釣魚警報的瀏覽器,閉源,僅限 Windows,免費軟體。
  • Phex 是一個跨平臺的 Java 客戶端。
  • XoloX
  • Gnucleus - Gnutella、Gnutella2 (G2) 使用 C++ 和 Microsoft MFC 庫編寫。核心是 LGPL,使用 Windows COM-base 與 GPL 前端通訊。
  • Gtk-Gnutella,GPL,用於 GNU/Linux。
  • Hydranode(多協議,在 eDonkey2000/eMule 部分中引用)
  • ezpeer,一箇中國客戶端。
  • pp365,一箇中國客戶端。
  • POCO,一箇中國客戶端,使用 GnucDNA。
  • Bearshare,適用於 Windows 的免費閉源軟體。
  • CocoGnut,適用於 RISC OS。
  • Swapper,適用於 Windows 的免費閉源軟體,使用 .NET。
  • TrustyFiles,適用於 Windows,支援 FatTrack (KaZaA)、Gnutella 和 G2。
  • Shareazahttp://shareaza.sourceforge.net/),開源(GPL),用 C++、MFC 和 ATL 編寫。支援 Gnutella2 (G2)、Gnutella、eDonkey2000/eMule、BitTorrent、FTP 和 HTTP 協議的多網路點對點檔案共享客戶端。
  • FrostWirehttp://sourceforge.net/projects/frostwire/),是 Gnutella 網路的點對點 (P2P) 資訊共享客戶端。該專案與 LimeWire LLC 無關。它是 Limewire Java 實現的一個分支,承諾永遠不會包含內容過濾器。FrostWires 的原始碼 (Java) 在 GNU GPL 開源許可下獲得許可。較新的版本已遷移到使用 BitTorrent 協議。
    • Acquisition,一個基於 Limewire 核心、用 Cocoa 編寫的 Mac OS X 客戶端,共享軟體。
    • XNap,一個使用 Limewire Core for Gnutella 的多網路 Java 程式。
華夏公益教科書