chord協議闡述了怎樣找到給定值的儲存位置,新結點怎麼樣加入系統以及怎麼樣從已有結點的失敗(或離開)中恢復。chord的核心在於提供了乙個快速的分布式的hash功能計算,把值對映到儲存它們的結點上去。hash功能可以平衡負載,而且,當第n個結點加入(離開)網路時,只有o(1/n)部分值被移到了不同的地方。chord可以使得每個結點並不需要知道其他所有的結點,改進了連續hash的可擴充套件性。乙個chord結點只需要一小部分關於其他結點的路由資訊。因為這些資訊都是分布式的。乙個結點需要通過與一些結點的通訊來解析hash函式的。在穩定狀態下,在乙個有n個結點的系統中。每個結點只需要維持o(logn)條關於其他結點的資訊,解析所有的搜尋也只需要o(logn)條資訊。
為了搭建這一平台,實現chord層的結點路由以及定位。本文設計了如下六個類:
1. doc類:該類主要描述了所有關於文件的操作。實現了文件的生成,查詢,插入,刪除,移動等功能。
2. event類:該類主要描述了事件及事件棧的操作。實現了事件棧的初始化,新事件的生成,刪除,插入,返回。
3. node類:該類主要描述了所有關於網路中結點的操作以及連續hash函式的構造。實現了新結點的加入,刪除,列印以及雜湊表的構造和結點隨機返回等功能。
4. finger類:該類主要描述了結點finger表的相關操作。實現了結點finger表的建立,刪除,更新,列印以及尋找結點前驅,後繼結點等功能。
5. request類:該類主要實現了新請求建立,插入掛起列表,請求處理,列印請求列表,複製後繼結點的finger表等功能。
6. fun類:該類實現了結點的加入,離開以及因此帶來的網路自我調整等功能。
上述類中具體演算法實現請參見程式部分,在接下來的幾節中,作者將描述乙個基本的chord協議,包括了連續hash函式的構建,鍵值的搜尋和結點的加入,離開等。
3.3.1 連續hash函式
連續的hash函式為每個結點以及值分配乙個m位的識別符號。雜湊結點的ip位址得到結點的識別符號,同樣的,雜湊關鍵字可以得到值的識別符號。其中,識別符號長度m必須確保兩個結點或者值被雜湊到同乙個識別符號的可能性可以忽略不計。
hash函式按照如下規則將值分配給結點:識別符號被有秩序地分配在乙個模2^m的識別符號圓環上。鍵值k被分配到第乙個在識別符號空間內的id值是大於等於k的結點。這個結點被稱之為鍵值k的後繼結點,表示為successor(k),即chord環上從k順時針出發第乙個被訪問到的結點。下圖為m=6,有10個結點以及5個值的chord環。當乙個結點n加入或離開網路中時,某些值會重新進行分配,從而達到網路的自適應。
乙個擁有10個結點的chord環事實上,對於任何乙個hash函式,總有一些值沒有被雜湊函式分散得很開,但在實際應用中這些潛在的所謂壞集出現的可能性不大。在雜湊函式中引入隨機性的技術已經大大的提高了,給定乙個值的集合,我們可以找到乙個隨機的雜湊函式,使得這些值能夠盡可能的分開。對於標準的雜湊而言,任意乙個非針對性的值的集合都能被分析,在這裡,我們就把它們當作是隨機的。
實現該功能的相關函式原型如下:
void initnodehashtable()
/*初始化結點雜湊表*/
node *addnode(int id)
/*在雜湊表中加入指定結點資訊*/
void deletenode(node *n)
/*在雜湊表中刪除指定結點資訊*/
node *getnode(int id)
/*返回雜湊表中的結點資訊*/
int getrandomactivenodeid()
/*隨機生成動態結點id*/
int getrandomnodeid()
/*返回乙個隨機結點*/
3.3.2 鍵值搜尋
這一部分主要介紹一種有效的並能準確維持路由資訊的chord搜尋演算法。如前所述,假設key/node對的識別符號為m位。每個結點n擁有一張最多有m條記錄的路由表,稱之為finger表。結點n表中的第i項包含了與n的id至少相差2^i-1的第乙個節點s,換言之,s=successor(n+2^i-1),此處的i要滿足1< i < m,s表示為n.figher[i]。finger表中的每一項都包含了結點在chord網中的id以及對應的真實ip位址。
結點n8的finger表利用finger表進行鍵值搜尋的主要演算法如下:如果需要查詢的值的id正好落在n以及n 的後繼結點之間,find_successor操作完成,返回其後繼結點。否則,n就搜尋他finger表中最靠近這個id的結點m,然後遞迴呼叫find_successor函式,直到找到值id的前驅結點為止。
實現該功能的具體演算法如下:
node find_successor(node n, id id)
node closest_preceding_node(node n, id id)
/*查詢n的finger表中最靠近指定id的節點*/
{for(int i=n; i>0; i++)
{if(n.finger[i]>n.id&&n.finger[i]文章原文: http://blog.csdn.net/nwpuyjz2001/archive/2007/04/08/1556755.aspx
結構化P2P網路 DHT網路原理
p2p系統的應用越來越廣泛,在檔案共享 流 服務 即時通訊交流 計算和儲存能力共享以及協同處理與服務等方面都能看到p2p的存在,一些p2p應用如napster emule bittorrent等早已是家喻戶曉了。p2p按其拓撲關係大致可以分為兩類四種形式 1.非結構化拓撲。包括中心化拓撲 分布式拓撲...
結構化P2P網路 DHT網路原理
p2p系統的應用越來越廣泛,在檔案共享 流 服務 即時通訊交流 計算和儲存能力共享以及協同處理與服務等方面都能看到p2p的存在,一些p2p應用如napster emule bittorrent等早已是家喻戶曉了。p2p按其拓撲關係大致可以分為兩類四種形式 1.非結構化拓撲。包括中心化拓撲 分布式拓撲...
基於pjsip實現p2p語音對講
config file 大家先大致瀏覽上面的pjsua文件說明,對整個pjsua的選項有個了解。然後我們關注到最後的config file。this is a comment in the config file.id sip alice example.com registrar sip exam...