P2P網絡區別于其他系統的本質特點如下。
(1)網絡拓撲結構嚴格
P2P網絡在網絡應用層構建了一個有(嚴格)拓撲結構的覆蓋網,覆蓋網拓撲結構對于一個P2P網絡具有基礎性的意義,系統的其他許多機制如分布式散列表、路由、負載均衡、容錯與自適應、自組織都以它為基礎。
(2)節點和數據對象位置確定
分布式散列表(DHT)是P2P網絡的核心設施。如圖 2–11所示,它通常基于一致性散列函數,提供對于任何一個節點、數據對象在覆蓋網中的位置映射。這一點在結構化P2P網絡中尤其重要,因為它保證了能夠準確地定位到某個節點或者數據對象。具體地說,如果分布式散列表采用一致性散列函數H(),對于某個網絡節點(IP,Port,…),該節點在覆蓋網上將有唯一對應的“節點標識”nodeID = H(IF,Fort,…),IP為節點IP地址,Port為端口號,…表示其他屬性;對于某個數據對象(Key,…),它在覆蓋網上也有唯一的“對象標識”objectID=H(Key,…),Key為對象關鍵碼,…表示其他屬性。對于節點而言,nodelD確定了它的覆蓋網位置,對于數據對象而言,objectID確定了它的索引信息在覆蓋網上的存放位置。

圖 2–11 DHT在P2P系統中的位置
(3)高效路由
基于P2P覆蓋網與分布式敢列表,P2P網絡通常有適合自己的路由算法,以保證高效路由。任意兩個節點間定位所需的覆蓋網路由跳數典型地為TTL(無結構網絡)或log N(結構化網絡),TTL(time to live)為跳數限制,N為網絡節點總數。因為覆蓋網與物理網的不一致性,實際IP路由跳數會高于覆蓋網路由跳數,但仍可以控制在log N的常數倍范圍之內。
(4)負載均衡
P2P網絡使用分布式散列表將節點、數據對象分布到覆蓋網上,由于它通常使用一致性散列函數,所以這種分布是均衡的:所有節點大致均勻地分布在整個覆蓋網中,所有數據對象的索引大致均勻地分布在所有節點中,即使有新節點加入、舊節點離開、新對象發布、舊對象刪除,一致性散列函數都能保證高效的動態調整和調整后網絡仍然保持很好的負載均衡。負載均衡是分布式系統努力追求的系統屬性,它對于P2P系統的高效率、可擴展性、動態自適應具有重要意義。
(5)容錯與動態自適應
P2P網絡是動態變化的,不斷地有新節點加人、舊節點離開、新對象發布、舊對象刪除,當這些發生以后,P2P網絡必須有很好的自適應性,做高效的調整,以保持網絡的拓撲結構、位置映射、負載均衡和路由信息的更新。如上節所述,自適應最 重要的是更新節點狀態,自適應的方法有周期性探測、按需檢測、捎帶確認等。
(6)行為的自由性與匿名性
P2P網絡是一個自由、平等的網絡,兩個對等節點之間做什么事情、采取什么樣的行為、交換哪些信息,完全由雙方自由決定。另一方面,P2P網絡中的用戶是匿名的,因為分布式散列表采用安全散列函數將用戶信息、數據對象信息映射到了一個表面上看起來沒有任何意義的數值標識ID,這個ID唯一地代表用戶和數據對象。由于安全散列函數的單向性與抗沖突性,不可能從此ID破解出它所代表的信息。
P2P網絡的最大特點和難點,在于它極大的動態性:不斷有新節點加入、舊節點離開、節點失效等情況發生。面對這樣一個動態環境,P2P網絡需要一套健全、可行的方法來處理這些情況:在新節點加人時通知其他節點新成員的到來,在舊節點離開時通知其他節點老成員的離去,而最難的是需要高效、合理地檢測到節點失效并及時修復P2P網絡。下面介紹基于Gossip的P2P網絡拓撲構建和維護技術。
Gossip算法又被稱為反熵(Anti-Entropy),熵是物理學上的一個概念,代表雜亂無章,而反熵就是在雜亂無章中尋求一致,這充分說明了Gossip的特點:在一個有界網絡中,每個節點都隨機地與其他節點通信,經過一番雜亂無章的通信,最終所有節點的狀態都會達成一致。每個節點可能知道所有其他節點,也可能僅知道幾個鄰居節點,只要這些節可以通過網絡連通,最終他們的狀態都是一致的,當然這也是疫情傳播的特點。
要注意到的一點是,即使有的節點因宕機而重啟,有新節點加入,但經過一段時間后,這些節點的狀態也會與其他節點達成一致,也就是說,Gossip天然具有分布式容錯的優點。Gossip是一個帶冗余的容錯算法,更進一步,Gossip是一個最終一致性算法。雖然無法保證在某個時刻所有節點狀態一致,但可以保證在”最終“所有節點一致,“最終”是一個現實中存在,但理論上無法證明的時間點。因為Gossip不要求節點知道所有其他節點,因此又具有去中心化的特點,節點之間完全對等,不需要任何的中心節點。實際上Gossip可以用于眾多能接受“最終一致性”的領域:失敗檢測、路由同步、Pub/Sub、動態負載均衡。
Gossip假定同步會按照一個固定進度表執行,每個節點定期隨機或是按照某種規則選擇另外一個節點交換數據,消除差異。有三種類型的反熵協議:推(push),拉(pull)和推/拉(push/pull)混合(如圖 2–12所示)。
l push: A節點將數據(key,value,version)及對應的版本號推送給B節點,B節點更新A中比自己新的數據
l pull:A僅將數據key,version推送給B,B將本地比A新的數據(Key,value,version)推送給A,A更新本地
l push/pull:與pull類似,只是多了一步,A再將本地比B新的數據推送給B,B更新本地

圖 2–12三種類型的反熵協議
如果把兩個節點數據同步一次定義為一個周期,則在一個周期內,push需通信1次,pull需2次,push/pull則需3次,從效果上來講,push/pull最好,理論上一個周期內可以使兩個節點完全一致,push/pull的收斂速度是最快的。假設每個節點通信周期都能選擇(感染)一個新節點,則Gossip算法退化為一個二分查找過程,每個周期構成一個平衡二叉樹,收斂速度為O(N2),對應的時間開銷則為O(log N)。這也是Gossip理論上最優的收斂速度。但在實際情況中最優收斂速度是很難達到的,假設某個節點在第i個周期被感染的概率為pi,第i+1個周期被感染的概率為pi+1,則pull的方式:

而push為:

顯然pull的收斂速度大于push,而每個節點在每個周期被感染的概率都是固定的p(0<p<1),因此Gossip算法是基于p的平方收斂,也成為概率收斂,這在眾多的一致性算法中是非常獨特的。
Gossip算法還需要考慮協調機制,即是討論在每次2個節點通信時,如何交換數據能達到最快的一致性,也即消除兩個節點的不一致性。上面所講的push、pull等是通信方式,協調是在通信方式下的數據交換機制。協調所面臨的最大問題是,因為受限于網絡負載,不可能每次都把一個節點上的數據發送給另外一個節點,也即每個Gossip的消息大小都有上限。在有限的空間上有效率地交換所有的消息是協調要解決的主要問題。
總結來看,Gossip是一種去中心化、容錯而又最終一致性的絕妙算法,其收斂性不但得到證明還具有指數級的收斂速度。使用Gossip的系統可以很容易的把Server擴展到更多的節點,滿足彈性擴展輕而易舉。唯一的缺點是收斂是最終一致性,不適用那些強一致性的場景。
博士。資深區塊鏈技術專家和網絡安全專家,從事區塊鏈技術研究與應用近10年,對DAG技術有深入研究,基于DAG技術的明星區塊鏈項目InterValue的創始人兼CEO。
西安電子科技大學區塊鏈應用與評測實驗室副主任、浙江大學計算機學院區塊鏈研究中心特聘研究員、湘江區塊鏈研究院副院長、矩陣數字經濟智庫專家成員。
此外,他還是北京理工大學機電學院特聘研究員、湘潭大學碩士生導師、湖南宸瀚信息科技有限公司董事長、哈希奈特(北京)科技股份有限公司董事長、四川宸瀚信息科技有限公司董事長、浙江物信科技有限公司董事長。