(原文: http://www.oreillynet.com/pub/a/network/2000/05/12/magazine/gnutella.html)
近一段時間有些計算機技術如Napster, Gnutella, and Freenet引起的非議最多,但是從技術的觀點來看的話,也可說是最讓人感興趣。我並不是要有意歪曲才這麼講。通過檢查這些系統的架構和協議,我發現它們的確很吸引人。Freenet源自於一個實實在在學術性研究項目,這3個站點值得任何一個對互聯網的未來關心的人認真的關注。
在本文中,我想撇開目前一些有關Gnutella and Freenet的報導中的廣告說辭和歇斯底里,以便互連聯網社區的人們能夠基於它們的真正優點上做出評價。本文大體上是一篇技術文章;我在另一篇文章「The Value of Gnutella and Freenet」中進行了政策性的論述。由於媒體對Napster作了更多的報導,本文中不對其討論。關於Napster你可以參考Erik Nilsson寫「Napster: Popular Program Raises Devilish Issues」,在技術上另兩個系統比Napster更有趣,更深遠。
從本質上講,Gnutella and Freenet代表着分佈式信息系統發展上新的一步。二者都是搜索信息的系統,都返回你需要的信息但有不告訴你信息的出處。它們代表着分佈式的信息存儲,信息獲取和網絡體系領域中的創新。但二者在目標和實現上有極大的不同,下面對他們分別進行考察。
基礎
任一個Gnutella軟件既是一個server又是一個client,因爲它支持雙向信息傳遞。Gnutella開發人員把這種軟件叫做「servent」,但因這個詞看起來古怪,我堅持叫它"client"。你可以通過安裝現有的幾種client中的任何一種而建成一個全功能的Gnutella網站;很多不同的操作系統都被支持。下一步,你必須找到一些願意跟你通訊的站點:有些可能是你的朋友的,另一些可能是被廣告了的Gnutella站點。擁有大型計算機和高速帶寬的人們可以鼓勵許多人跟他們連接。
是罪惡還是僅僅有爭議
諸如Gnutella and Freeware一樣的開放源軟件正在向病毒一樣的快速傳播。但它們真的是如此有害嗎?Andy Oram在本週的一期Platform Independent on Web Review上指出了有爭議技術的優點和缺點。
你只能直接與你同意接觸的少數幾個站點通信。別的站點關心的資料將以存儲轉發的方式從一個站點傳到另一個站點地傳遞下去。這對頭髮已斑白的UUCP和Fidonet老用戶來說聽起來是否似曾相識?這種架構本質上,與在因特網變得流行以前的數十年裏在全世界傳遞網上新聞和電子郵件的系統是一樣的,這些系統無拘無束地連接在一起。
但是有一些重要的不同。因爲Gnutella是運行在整個因特網上的,你可以直接與某個地理位置上離得很遠的人相連,就象連到你的鄰居上一樣。這使得系統牢固並幾乎不出故障,這一點我們馬上就要談到。
再一點,通過Gnutella獲取信息的規程是一種調用-響應(call-and-response)方式,它比單純地推送新聞或電子郵件要複雜。Figure 1表示了這種規程的操作。假定站點A向站點B要求匹配"MP3"的數據。在傳送回一些可能相關的東東以後,站點B把這個請求又傳給它的同事站點C,但與郵件和新聞不同的是,站點B保留了站點A的這個請求記錄。如果站點C有同這個請求匹配的數據,它就把這些數據送給站點B,而站點B知道這是爲A找的數據所以把數據傳給A。
我很想快速地描述出這個簡單系統的重要特性,但爲了滿足好奇者我先回答一些問題。
1,如何識別請求
每個請求都有一個唯一的號碼,這個號碼是由源站點上獨一無二的一個東西比如以太網MAC地址所產生的隨機數或準隨幾數。如果一個請求經由站點C傳到站點D然後又傳到站點B,站點B從標識上認出這是已經見過的請求,從而不聲不響地把它仍掉。另一方面,不同的站點可以請求同樣的資料,並且都能獲得滿足因爲他們都有自己唯一的標識。每個站點都可以讓請求過期,只需把請求放入一個預定義了大小的隊列中,當新的請求要加進隊列時最底下的老的請求則被仍掉。
2,返回的數據採用什麼形式
2可以是一個音樂文件或其他請求的材料,但Gnutella不僅僅限於傳文件。返回結果可能是一個URL或其他任何一個值。因此,人們很可能用Gnutella來作複雜的搜索,而最終得到一個URL,就象使用一個傳統搜索引擎一樣。(關於這點在後面將作更多討論。)
3,使用何種協議
運行在HTTP協議上(這是Gnutella的簡潔性體現之一)。使用HTTP的有利之處在於即使兩個站點中的一個處在企業的防火牆的後面時它們也能通信,前提是這個防火牆允許數據流向外面的端口爲80的標準Web服務器。如果在防火牆後面的client被要求伺服一個文件時會有一點困難,但它可以通過發一條叫GIV的輸出命令到通信對方的80端口而瞞過防火牆。當防火牆屏蔽了所有的Web交通或通信雙方都處在典型的防火牆後面時,才會出現「此頁無法顯示」。
4,系統怎樣停止搜索?
就象IP包文,每個Gnutella請求都有一個存活期(time-to-live),每經過一個站點通常這個值都要減1,直至變爲0。如果一個站點發現某個請求的存活期值異常的大,那它可以大幅度降低這個存活期。我們馬上可以看到,雖然存活期限制了每個站點所能觸及的範圍,但這同時也帶來了好處。
5,象"MP3"一樣的搜索字符串是被怎麼解釋的?
這是個值64000美元的問題,它讓我們發現Gnutella最偉大的貢獻。
神聖的創舉:搜索動態生成的數據 Gnutella是一個相當簡單的協議。它只定義了一個字符串如何從一個站點傳到另一個站點,而沒有定義如何解釋這個字符串。某個站點可能只是用fgrep答7b序對一堆文件檢索這個字符串,而另外某個站點可能把這個串插入一個SQL查詢中,別的站點可能認爲這是一個日語單詞串,從而返回一個意義大約近似的英語串,以便原始請求的發出站點能使用這個英語串進行進一步搜索。這種靈活性允許每個站點以自己擅長的最複雜的方式來爲分佈式搜索作貢獻。建議讓Gnutella成爲21世紀的搜索引擎運作的平臺,這是否過份了?
現狀
Gnutella項目最初是由美國在線的一個叫做Nullsoft的部門開始的。美國在線因爲害怕在使用這個系統後可能會導致版權侵害問題,便取消了對該項目的支持。但一個名叫Brian Mayland的程序員對這個協議進行了反向工程,開始了一個新的項目來開發client(客戶端軟件)。沒有一個當前版本的開發者看過從Nullsoft來的代碼。Gnutella是一個基於GNU許可的開放源項目。 Limitations and risks of Gnutella
Gnutella的限制和風險
早期對Gnutella的實驗表明它是高效的和有用的,但在系統的伸縮性存在問題。假如你送出一個存活期爲10的請求,並且每個站點都與另6個站點聯繫,那麼交換的總消息數可高達106或1百萬。
呈指數型傳播的請求引入了最可能使系統崩潰的原因:由洪水般的請求引發的拒絕服務型攻擊。開發者們目前沒有解決這個問題的辦法,但是建議client跟蹤請求的出現頻率以便識別出是否有突發性表現從而斷絕同攻擊性節點繼續通信。
此外,存活期給每個用戶限制了眼界。我可能重複地搜索着我附近的幾百個節點,但我從不會找到一個在離我的眼界只有一步之遙的站點上的文件。實際上,信息可能還會移動。總之,中世紀的歐洲人儘管除了最模糊的神話之外對中國一無所知,但他們卻喜歡來自中國的香料。他們所必須知道的只是在小亞細亞的幾個交易地,而這幾個交易地則與在中亞的與中國交易的城市交易。
一個爲Gnutella開發Linux系統上的client的程序員Spencer Kimball說,這種子網化方式可以保護Gnutella免遭攻擊。實際上Gnutella已經歷過服務崩潰,主要起因是client程序中的錯誤。可以肯定將來會出現惡意和複雜的攻擊。雖然有幾組站點曾有過暫時的緩慢或者其他的組的情形變得更嚴峻,但系統從未真正地停止過。
當然除了拒絕服務以外,人們可能還會以其他理由來不正當使用Gnutella。最近有報導說某站點使用Gnutella做了一個釘子:這個站點上登出了一些看似提供兒童色情的文件名,然後把每次到這個站點下載文件的用戶的IP地址和域名都記錄了下來。之所以能利用這種信息是因爲Gnutella使用的是HTTP;Gnutella提供的用戶信息與任何Web瀏覽器提供的沒有什麼區別。
最後一個值得一提的有關Gnutella的限制是難於對返回數據的來源進行認證。你的確不知道數據來自哪裏--而現在的e-mail和news也是這樣。Client沒有必要選擇匿名;他們完全可以按照自己的願望來標識自己。如果Gnutella選擇返回一個URL,那和以任何其他方式獲得的URL一樣的值得信賴。如果數字署名基礎設施變得普及了,Client也同樣可以使用。我在文章「The Value of Gnutella and Freenet」中論及了可靠性和相關的政策性問題。
Freenet (自由網)
基礎
Gnutella和Freenet的目標很不同。對很多人來說Freenet更多的具有明顯的政治性的,顛覆性目的。(譯者:What? 咱可沒想顛覆誰,只是看到被愚弄禁錮的中國人太苦。) a-- 允許人們匿名地散發材料。 b-- 允許人們匿名地獲取材料。 c-- 使得刪除材料幾乎不可能 d-- 運作上沒有集中的控制 後半部份特色Gnutella和Freenet都具有,這使得它們不同於Napster。一個法院的命令可以關閉Napster(和它的所有鏡象站點),但要關閉Gnutella和Freenet就象要起訴所有聲稱在交換着Metallica歌曲的317000因特網用戶一樣的困難。
Freenet的另一個技術目標特別有趣:它把數據隨幾的分佈在各站點上,數據的出現和消失是不可預測的。除了滿足上面所提到的社會目標以外,Freenet還可能爲因特網上的擁擠提供了一個迷人的解決方案,因爲人氣高的信息自動地傳播到了許多的站點上。
Freenet跟80年代和90年代早期具有相似名字的社區網絡沒有任何關係。它起源於1997年由愛丁堡大學信息學部的Ian Clarke發起的一個研究項目。他在本項目中寫的一篇論文可以在網上得到。
在很多方面Freenet的體系結構和協議與Gnutella很相似。每個合作者都下載一個client並向幾個其他的client發送請求。請求都有唯一的標識,被從一個站點傳到另一個站點,都被臨時存放在一個堆棧裏直到數據被返回,當存活期結束後就被拋棄。
查找數據的遊戲
兩個系統之間最大的不同在於當Freenet的client滿足一個請求時,它把整個數據都傳送給請求的發出者。這在Gnutella中是可選的,但不是必須的。更重要的是,當數據沿着Freenet的client鏈被傳送到最初的請求者的過程中,鏈上的每個client都可以保留一個拷貝(除非數據非常巨大,而client認爲不值得爲之花費那麼多磁盤空間來保存它)。只要有人不停地要求這個數據,Client就會一直保留它,但當似乎沒有人在需要它的時候就可以仍掉。
跟因特網比起來顯得低效的這種實踐,到底取得了什麼樣的成就呢?Ian Clarke告訴我它並不一定如我所想象的那麼低效--對於大數據量來來說,它的效率可與WEB匹敵--並且事實上它完成了相當不錯的幾件事情:
a,允許短暫地達到匿名性和持續性的目標。
b,讓小站點發布很大的人氣高的文檔而不必爲網絡帶寬犯愁。你不必僅僅因爲公開了一個令人興奮的錄象想讓好多人來下載,就跑出去找一個16cpu的UltraSPARC,或從別人那而租空間。
c,它鼓勵受歡迎的材料而讓不人氣的材料靜靜地消失。在這一點上,Freenet是與Eternity服務(幾年前被提出來的一種模型,但從爲被實現過)根本不同的。它的目標不是散佈人們想要的垃圾,而是防止許多人都認爲有價值的材料被撤掉。
d,它傾向於把數據弄到那些想要他們的人鄰近的地方。(和Gnutella一樣,"鄰近"一詞在Freenet中沒有地理上的意義,只意味着因特網站點之間的跳躍數。)這是因爲從節點A發到節點B的第一個請求可能要被傳遞到很多別的節點,而第二個以及以後的請求就可以直接由節點B來滿足。此外,節點A和節點B很可能離那些同樣喜歡這種內容的人所運行的節點只有1到2個跳躍數。所有的人都會很驚喜地發現在第一個請求得到滿足後,後面的內容很快就能得到。
最後的一條從架構上來講特別有趣,因爲每個站點的材料的人氣度會導致Freenet系統真正改變它的拓撲結構。當一個站點發現它經常從它的一個合作者那兒獲得大量材料以後,對未來的請求它會傾向於選擇這個合作者。帶寬因此增加而受益的是最終用戶。鑑於我作的歐洲/中國絲綢之路的比方,Clarke說:「Freenet就如同把中國帶到離歐洲更近的地方,因爲越來越多的歐洲人要求與之進行貿易。」
Freenet的其他特徵
Freenet比Gnutella更受網絡交通的制約,也許這是因爲對每一個成功的請求它都希望傳送一個完整的文件的緣故。當一個Freenet的client接到一個它滿足不了的請求時,它把該請求只傳遞給一個對等站點;它並不像Gnutella那樣把請求廣播給所有的對等站點。如果因爲請求沿着傳遞鏈下去再也找不到站點而得到一個失敗通知,或者因爲存活期到期而使client沒有收到響應,client就會另一個對等站點。簡而言之,搜索是按深度優先方式進行,而不是按並行方式。然而,Clarke說搜索的速度可謂相當的快;象傳統的搜索引擎一樣每個搜索都花上幾秒鐘。Freenet中採用的簡單快取系統不比ISP爲了存取網頁而採用的精緻的快取系統遜色。
Freenet正在用Java開發,並且需在Java Runtime Environment上運行。它使用自己的端口和協議,而不像Gnutella那樣在HTTP上運作。
Freenet的限制和風險
Freenet似乎比Gnutella更具有伸縮性。也許有人會認爲可以通過發送洪水般的無關的資料而使整個系統遭到破壞(例如,可以寫一個版本,讓它每小時把你的硬盤中的內容都拋出去一次),但實際上這種攻擊幾乎沒有什麼影響。只要沒有人要求這種資料,它不會去任何地方。
此外,一旦某人提交了一個資料,沒有人可以用一個僞造品來替代它。每個條目都被一個唯一的標識符所標識。如果一個懷有惡意的檢查員試圖用同樣的標識符來提交他自己的資料,系統將會檢查到現有的版本,並說:「我們已經有這個材料!」唯一的效果是使得這個材料保留的時間更長,因爲這個自充爲檢查員的人爲它提出了一個請求。
搜索問題
唯一的標識符是Freenet目前的弱點。儘管有人可以在提交一個材料時賦予它任何字符串作爲標識符,爲了安全的考慮Freenet會將這個字符串散列化處理。兩個只相差一個字符的串(比如"HumanRights"與"Human-Rights")將會被散列成極爲不同的值,不管用哪種散列算法。這意味着當某個檢察機關試圖從一個隨意的檢索中找出對自己不利的材料時將會遇到很大的困難。
然而散列化也使得Freenet對於作隨機檢索顯得無能。如果你準確知道你要在Freenet上所查找的東西-- 比如有人告訴你「在Freenet上搜索HumanRights」 --你一定能獲得成功。可是你不能作自由文本檢索。
Freenet的一個迷人的用法是爲站點提供超鏈接。讓我們拿喜歡觀察野鳥的人們來作一個例子。就象一個熱切的飛禽飼養家可以提供一個鏈接到許多WEB網站的網頁一樣,她也可以提供產生Freenet請求的鏈接,這些請求使用可以在Freenet上獲取有關鳥類數據的已知的字符串。對那些沒有安裝client而又想試一試Freenet的人來說,已經有一個名爲fproxy的到WEB的網關可以使用了。
另一個研究領域是開發一個client,它接受一個串並且爲了得到一個更精確一點的串而對之做輕微的改動,再把它傳遞下去。按照Clarke的說法,目前Freenet project中最重要的一個任務就是解決搜索問題。 Letting go 不要管它。
我再一次建議讀者參考文章The Value of Gnutella and Freenet中有關這些系統的政策和社會影響的討論。在結束本文之際,我建議Gnutella和Freenet這兩個系統繼續朝着把實質的從物理的釋放的方向發展,因爲這標誌着網絡發展的一個主旋律。DNS把名字同物理系統解脫開了;URNs將允許用戶不用域名就能存取文檔;虛擬主機和複製服務器技術改變了名字到系統的一對一的關係。我們不要理睬位置的概念了,也許是該有另一個大步地概念性突破的時候了。歡迎......信息正變的自由可得。
Gnutella和Freenet以不同的方式,使文檔的位置無關緊要;搜索的串變成了位置。爲了實現這一點,二者在我們所熟悉的IP層次的路由功能上增加了一個新的路由層。新的層次看起來可能會在效率與伸縮性上引入許多問題,但實際上都是可被忽略的或可以最小容忍的。我認爲讀者應該好好地看一看這些系統;即使Gnutella 和 Freenet最終可能不一定是新的因特網時代的足夠好的解決方案,當下一個跳躍到來時它們將會教給我們一些經驗教訓。
Andy Oram is an editor at O`Reilly & Associates specializing in books on Linux and programming. Most recently, he edited Peer-to-Peer: Harnessing the Power of Disruptive Technologies.