P2P系統的索引:信息到節點位置(IP地址+端口號)的映射
在文件共享(如電驢中):利用索引動態跟蹤節點所共享的文件的位置、節點須要告訴索引它擁有哪些文件、節點搜索索引從而獲知可以獲得哪些文件
在即時消息(如QQ中):索引負責將用戶名映射到位置、當用戶開啓IM應用時須要通知索引它的位置、節點檢索索引肯定用戶的IP地址
內容和文件傳輸是分佈式的,可是內容定位是高度集中式的。節點加入時,通知中央服務器IP地址、內容
缺點:單點失效問題、性能瓶頸、版權問題
徹底分佈式架構。每一個節點對它共享的文件進行索引,且只對它共享的文件進行索引
節點X與Y之間若是有TCP鏈接,那麼構成一個邊(虛擬鏈路),全部的活動節點和邊構成覆蓋網絡(overlay network),每一個結點鄰居數通常少於10個
查詢消息經過已有的TCP鏈接發送,若是查詢未命中則節點轉發查詢消息、若是查詢命中則利用反向路徑發回查詢節點
介於集中式索引和洪泛查詢之間的方法。每一個節點或者是一個超級節點,或者被分配一個超級節點
超級節點負責跟蹤子節點的內容。節點和超級節點間、某些超級節點對間維持TCP鏈接。
1、即時通訊
以Skype爲例說明,其使用私有應用層協議,如下爲大體原理
本質上是P2P的:用戶/節點對之間直接通訊
採用層次式覆蓋網絡架構,分佈在超級節點上的索引負責維護用戶名與IP地址間的映射
2、文件分發
BitTorrent協議是一種用於文件分發的P2P協議
參與一個特定文件分發的全部節點集合被稱爲一個洪流(torrent)。在一個洪流中的節點彼此下載等長度的文件塊(Chunk),典型的塊長度爲256KB。
每一個洪流具備一個基礎設施結點,稱爲追蹤器(tracker),當一個節點加入某洪流時,它向追蹤器註冊本身,並週期性地通知追蹤器它仍在該洪流中。
追蹤器跟蹤正參與在洪流中的節點。當一個新的節點加入該洪流時,追蹤器隨機地從參與節點集合中選擇一部分,並將這些節點IP地址發送給它 。節點收到這張節點列表後,會試圖與該列表上的全部節點建立並行的TCP 鏈接。
全部和其成功地建立了TCP 鏈接的節點稱爲臨近節點,臨近節點是隨時間而波動的。
節點經過TCP鏈接週期性地詢問每一個鄰近節點它們所具備的Chunk列表。每有一個不一樣的鄰居,就得到一個塊列表。隨後節點將經過TCP鏈接,對當前尚未的Chunk發出請求 。當它下載Chunk時,也爲其餘鄰居上載Chunk。
最稀缺優先(rarest first) 技術:針對自身沒有的塊在鄰居中決定最稀缺的塊(即鄰居中副本數量最少的塊),並首先請求那些最稀
缺的塊。這樣,最稀缺塊獲得更爲迅速的從新分發,每一個Chunk在洪流中的副本數量能夠獲得均衡。
節點會對於每一個鄰居持續地測量接收到比特的速率,並肯定以最高速率流入的4個鄰居節點,它只會向正在向其發送Chunk且速率最快的4個鄰居發送Chunk,每10秒從新評估top 4;每過30 秒,她也要隨機地選擇另一個鄰居發送Chunk,這樣新加入的節點也能獲得Chunk。
一且某節點得到了整個文件,它也許(自私地)離開洪流,或(大公無私地)留在該洪流中並繼續向其餘節點上載Chunk。
3、分佈式散列表DHT
DHT是一種分佈式數據庫,其爲每個節點(對等方)分配一個n比特標識符,標識符是0~2^n範圍內的整數。
經過散列函數把每一個鍵映射成標識符範圍內的一個整數。
存儲鍵值對時,若是初始鍵的散列值等於某個節點的標識符,則將該鍵存在這個節點;不然存在最鄰近右繼節點;
若初始鍵的散列值大於全部節點的標識符,則使用模2^n規則,在具備最小標識符的節點存儲鍵值對。
爲了查詢鍵值對,能夠把節點組成環形DHT
節點組成抽象邏輯網,在覆蓋網絡中的鏈路不是物理鏈路,而僅是節點對之間的虛擬聯絡(該網存在於由物理鏈路、路由器和主機組成的「底層」計算機網絡之上)
假如每一個節點只知道直接後繼和直接前驅,爲了找到負責的鍵,在最差的狀況下DHT中的全部N個結點將必須繞環轉發該報文,在平均狀況下須要發送N/2條報文。
所以能夠該環形覆蓋網絡爲基礎,增長捷徑,使每一個節點不只聯繫它的直接後繼和直接前任,並且聯繫分佈在環上的少許捷徑節點,當某節點接收到一條查詢一個鍵的報文時,它向最接近該鍵的鄰居(後繼鄰居或捷徑鄰居之一)轉發該報文。
每一個節點都知道本身的第一個後繼節點和第二個後繼節點的標識符和IP地址,並週期性的要求它們證實本身還活着(例如發送ping並要求迴應)
若是某節點的第一個後繼節點離開了,它能夠直接把第二個後繼節點改爲第一個,再向其詢問下一個後繼節點的標識符和IP地址。
假如一個標識符爲13的節點要加入該DHT,在加入時,它僅知道節點1存在於該DHT之中。
節點13將先要向節點1發送一條報文,問它的前任和後繼是什麼。該報文將經過DHT到達節點12,而它認識到自已將是13的前任節點,而且它的當先後繼節點15將成爲13的後繼節點。
節點12向節點13發送它的前任和後繼信息。
節點13此時可以加入DHT,標識它的後繼節點爲節點15,並通知節點12將其直接後繼改成13 。
BitTorrent使用Kademlia DHT來產生一個分佈式跟蹤器。
在BitTorrent中,其鍵是洪流標識符而其值是當前參與洪流的全部節點的IP地址,
一個新到達的BitTorrent節點經過用某洪流標識符來查詢DHT,肯定負責該標識符(即在洪流中跟蹤節點)的節點。在找到該節點後,到達的節點可以向它查詢在洪流中的其餘節點列表。