專利名稱:對等網(wǎng)絡(luò)點播系統(tǒng)中的環(huán)狀節(jié)點組織方法
技術(shù)領(lǐng)域:
本發(fā)明屬于分布式處理技術(shù)和流媒體技術(shù)的交叉領(lǐng)域,具體涉及一種對等網(wǎng)絡(luò)點播系統(tǒng)中的環(huán)狀節(jié)點組織方法,適用于在廣域網(wǎng)范圍內(nèi)提供高質(zhì)量、低成本、大規(guī)模的流媒體點播服務(wù)。
背景技術(shù):
流媒體技術(shù)的應(yīng)用一直是互聯(lián)網(wǎng)上傳播多媒體信息的主要方式,隨著寬帶網(wǎng)的日益普及,作為互聯(lián)網(wǎng)殺手級應(yīng)用之一的視頻點播服務(wù)受到來自學(xué)術(shù)界和企業(yè)界的普遍關(guān)注。傳統(tǒng)流媒體點播系統(tǒng)將大量的媒體數(shù)據(jù)存放在一組集中管理的視頻服務(wù)器上,由視頻服務(wù)器負(fù)責(zé)響應(yīng)所有客戶端的點播請求。在這種客戶端/服務(wù)器模式下,視頻服務(wù)器承擔(dān)全部工作,因而對服務(wù)器的帶寬和處理能力要求相當(dāng)之高,單個流的成本也非常昂貴,而且當(dāng)點播用戶進(jìn)一步增加時,視頻服務(wù)器最終將達(dá)到其能力極限,成為整個系統(tǒng)的瓶頸,并最終導(dǎo)致流媒體服務(wù)質(zhì)量的下降。因此,增強(qiáng)系統(tǒng)可擴(kuò)展性、提高服務(wù)質(zhì)量、降低服務(wù)成本成為在廣域網(wǎng)范圍部署大規(guī)模流媒體點播服務(wù)的核心問題。
針對該問題目前有如下一些解決策略,如通過在網(wǎng)絡(luò)邊緣部署代理服務(wù)器提高系統(tǒng)整體承載能力或利用專有的內(nèi)容分發(fā)網(wǎng)絡(luò)提供高質(zhì)量可擴(kuò)展的點播服務(wù)等。從技術(shù)上而言,上述策略只是將原來由單點服務(wù)器承擔(dān)的壓力分散到廣域分布的多個服務(wù)器上,它們從一定程度上緩解了單服務(wù)器帶寬不足的壓力,但并不能消除點播系統(tǒng)的瓶頸;從成本上而言,單個流的成本并沒有降低??偠灾?,上述策略實現(xiàn)代價仍然過高,視頻服務(wù)器數(shù)量和網(wǎng)絡(luò)帶寬的有限增加也難以滿足用戶無限增加的點播需求。因此找到一項適合提供高質(zhì)量、低成本、大規(guī)模的流媒體點播服務(wù)的技術(shù)迫在眉睫。
近年來,基于對等網(wǎng)絡(luò)的流媒體技術(shù)由于其潛在的高擴(kuò)展性和相當(dāng)?shù)土牟渴鸪杀臼艿狡毡殛P(guān)注,也為解決大規(guī)模的流媒體點播服務(wù)部署過程中所遇到的問題提供了一些新的方法和思路。由于視頻流服務(wù)對帶寬資源的要求高、服務(wù)時間長,使得利用上述策略在提供大規(guī)模低成本的視頻點播服務(wù)方面仍然面臨嚴(yán)峻挑戰(zhàn),特別是當(dāng)某個節(jié)目趨向流行時,系統(tǒng)會在短時間內(nèi)收到大量異步服務(wù)請求,而傳統(tǒng)的在服務(wù)器端為每個請求單獨(dú)分配一條流的多客戶端/單服務(wù)器模式將無法同時服務(wù)如此大規(guī)模的并發(fā)請求?;趯Φ染W(wǎng)絡(luò)的流媒體技術(shù)利用普通節(jié)點(即peer節(jié)點)的帶寬、磁盤等資源為其他節(jié)點提供服務(wù),能夠減少對服務(wù)器資源的占用。而針對流媒體點播系統(tǒng)而言,在Peer節(jié)點上分配一段定長或不定長的數(shù)據(jù)空間緩存其所接收到的數(shù)據(jù),并為其他請求該數(shù)據(jù)段的Peer節(jié)點提供服務(wù),不但可以滿足流媒體點播中異步模式的服務(wù)請求,而且可以緩解服務(wù)器的壓力。
據(jù)調(diào)查,目前基于對等網(wǎng)絡(luò)的流媒體技術(shù)方面的研究更多地集中在直播系統(tǒng)中,而利用對等網(wǎng)絡(luò)技術(shù)成功地實現(xiàn)大規(guī)模的點播服務(wù)的系統(tǒng)則非常少,這主要是因為基于對等網(wǎng)絡(luò)的點播系統(tǒng)在技術(shù)上面臨更大的挑戰(zhàn)。首先,在對等網(wǎng)絡(luò)點播系統(tǒng)中每個節(jié)點都有自己的觀看位置,只能和位置相鄰的節(jié)點相互交換數(shù)據(jù),而不像基于對等網(wǎng)絡(luò)的直播系統(tǒng),每個節(jié)點都在觀看相同的內(nèi)容,只要有空閑的上行帶寬就可以給其他節(jié)點提供數(shù)據(jù)。然而相對于直播而言,在對等網(wǎng)絡(luò)點播系統(tǒng)中找到合適的可提供數(shù)據(jù)的鄰居節(jié)點更為困難,需要對系統(tǒng)中的節(jié)點進(jìn)行有效的組織,并實現(xiàn)有效的查找,才能讓更多的節(jié)點快速找到合適的Peer節(jié)點給自己提供數(shù)據(jù),從而減小對服務(wù)器帶寬資源的消耗。另外,基于對等網(wǎng)絡(luò)的點播系統(tǒng)除了需要支持節(jié)點任意加入和離開的操作外,還需要支持VCR操作(VCR的全文,即用戶的隨意拖動操作),這要求系統(tǒng)的拓?fù)浣Y(jié)構(gòu)具有更強(qiáng)的動態(tài)性,節(jié)點的組織策略必須能夠自動適應(yīng)這種動態(tài)變化。
綜上,對等網(wǎng)絡(luò)點播系統(tǒng)的一個關(guān)鍵問題就是節(jié)點組織方法,即如何構(gòu)建有效的拓?fù)浣Y(jié)構(gòu),使得任何節(jié)點能夠快速的找到提供數(shù)據(jù)的鄰居節(jié)點并適應(yīng)用戶任意拖動導(dǎo)致的拓?fù)渥兓a槍υ搯栴},目前有如下幾種常見的拓?fù)浣Y(jié)構(gòu)1)樹狀拓?fù)浣Y(jié)構(gòu),該結(jié)構(gòu)將觀看同一個節(jié)目的Peer節(jié)點組織成一個分布式的樹狀結(jié)構(gòu),每個節(jié)點記錄自己的父節(jié)點和子節(jié)點。該方法總的控制開銷較小,但樹的分布式維護(hù)算法復(fù)雜,而且Peer節(jié)點之間的控制開銷表現(xiàn)出明顯的不均衡現(xiàn)象,樹的上層節(jié)點需要處理更多的查詢請求。另外,在樹形拓?fù)浣Y(jié)構(gòu)中每個Peer節(jié)點僅向單個節(jié)點請求數(shù)據(jù),如果某個節(jié)點的上行帶寬達(dá)不到當(dāng)前流的播放碼率,那么它的上行帶寬就不能提供給任何子節(jié)點,因此這種結(jié)構(gòu)只能是單對單的數(shù)據(jù)傳輸,不能充分利用終端Peer節(jié)點的帶寬資源;2)分布式哈希表(DHT),該方法通過哈希函數(shù)將數(shù)據(jù)塊分布式存放在多個節(jié)點上,播放的時候利用分布式哈希表定位所需要的數(shù)據(jù)塊。這種結(jié)構(gòu)雖然實現(xiàn)了多對單的節(jié)點數(shù)據(jù)傳輸,但當(dāng)多個節(jié)點離開時,數(shù)據(jù)的可靠性將受到嚴(yán)重威脅;3)網(wǎng)狀結(jié)構(gòu),該結(jié)構(gòu)來自于對等網(wǎng)絡(luò)的直播系統(tǒng),它通過讓相鄰Peer節(jié)點之間相互交換信息來實現(xiàn)節(jié)點信息的擴(kuò)散,具有良好的可靠性,數(shù)據(jù)和控制消息都從多點獲取,并不依賴于單個的節(jié)點。但由于節(jié)點之間的邏輯關(guān)系是隨機(jī)的,所以當(dāng)有鄰居節(jié)點離開或者拖動到新的位置時,難以迅速找到新的鄰近節(jié)點。一種可行的方法就是利用一個集中的索引服務(wù)器記錄所有節(jié)點的位置信息,但當(dāng)節(jié)點規(guī)模擴(kuò)大到一定程度的時候,索引服務(wù)器容易成為系統(tǒng)的性能瓶頸。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種對等網(wǎng)絡(luò)點播系統(tǒng)中的環(huán)狀節(jié)點組織方法,該方法通過維護(hù)一組半徑指數(shù)級增長的邏輯環(huán)結(jié)構(gòu)來管理自己的鄰居節(jié)點,使得每個節(jié)點既有近跳的鄰居節(jié)點交換媒體數(shù)據(jù),又有遠(yuǎn)跳節(jié)點協(xié)助拖動后新鄰居節(jié)點的快速查找,從而實現(xiàn)對等網(wǎng)絡(luò)點播系統(tǒng)中VCR操作的快速定位。
本發(fā)明提供一種對等網(wǎng)絡(luò)點播系統(tǒng)中的環(huán)狀節(jié)點組織方法,其步驟包括(1)新加入的客戶端節(jié)點P向索引服務(wù)器發(fā)送加入請求,索引服務(wù)器將之前索引的各個環(huán)上的節(jié)點作為初始成員節(jié)點列表返回給客戶端節(jié)點P,同時將節(jié)點P加入到自己的內(nèi)層環(huán)上,并淘汰出內(nèi)層環(huán)上加入時間最久的一個節(jié)點;其中,索引服務(wù)器維護(hù)一組以零點為圓心的同心環(huán),其環(huán)半徑符合公式ri=α2i,其中i為環(huán)號,L為最大的環(huán)號,i∈{0,1,2,……,L};i=0的環(huán)稱為內(nèi)層環(huán),所有i≥1的環(huán)稱為外層環(huán),i=L的環(huán)稱為最外層環(huán);ri為第i層環(huán)的環(huán)半徑;2個相鄰環(huán)之間的區(qū)域稱為一個環(huán)帶;a為每個客戶端節(jié)點最大可緩存的連續(xù)媒體數(shù)據(jù)的時間長度;(2)客戶端節(jié)點P根據(jù)從索引服務(wù)器獲取的初始成員節(jié)點列表,建立自己的鄰居節(jié)點,并根據(jù)各個鄰居節(jié)點到自身的距離d,將其分布到對應(yīng)的邏輯環(huán)上,構(gòu)建出自身的邏輯環(huán)結(jié)構(gòu),形成自己的遠(yuǎn)跳鄰居節(jié)點和近跳鄰居節(jié)點;節(jié)點P的鄰居節(jié)點是指和節(jié)點P建有TCP連接的節(jié)點;(3)客戶端節(jié)點P按照步驟(3.1)-(3.8)維護(hù)邏輯環(huán)結(jié)構(gòu)(3.1)客戶端節(jié)點P定期獲取當(dāng)前產(chǎn)生的事件;(3.2)客戶端節(jié)點P根據(jù)事件類型轉(zhuǎn)到相應(yīng)的處理步驟如果是網(wǎng)絡(luò)消息包的發(fā)送事件,則轉(zhuǎn)到步驟(3.3);如果是網(wǎng)絡(luò)消息包的到達(dá)事件,則轉(zhuǎn)到步驟(3.4);如果是用戶拖動的事件,則轉(zhuǎn)到步驟(3.5);如果是網(wǎng)絡(luò)中斷或關(guān)閉事件,則轉(zhuǎn)到步驟(3.6);如果是邏輯環(huán)檢查事件,轉(zhuǎn)到步驟(3.7);(3.3)客戶端節(jié)點P向鄰居節(jié)點發(fā)送自己的位置信息,其中包括消息的類型(Type)、發(fā)送節(jié)點的地址(Peer_Address)、消息可以經(jīng)過的跳數(shù)(TTL)、該鄰居當(dāng)前的播放位置(tCur)和緩沖區(qū)的狀態(tài)(BM),然后轉(zhuǎn)步驟(3.8);(3.4)客戶端節(jié)點P接收來自其鄰居節(jié)點的消息,其類型包括ANNOUNCE、FORWARD和DROP三種,然后根據(jù)消息類型和消息的TTL值決定是否轉(zhuǎn)發(fā)或轉(zhuǎn)發(fā)的對象,最后轉(zhuǎn)步驟(3.8);(3.5)客戶端節(jié)點P通過查找目標(biāo)位置周圍的節(jié)點,重新構(gòu)建拖動后的邏輯環(huán)結(jié)構(gòu)和新位置周圍的鄰居,然后轉(zhuǎn)步驟(3.8);(3.6)客戶端節(jié)點P發(fā)現(xiàn)某個鄰居節(jié)點失效或離開,將該節(jié)點從邏輯環(huán)中刪除并將該節(jié)點失效的消息通知給自己的其它鄰居節(jié)點,然后轉(zhuǎn)步驟(3.8);
(3.7)客戶端節(jié)點P根據(jù)環(huán)上鄰居節(jié)點的分布規(guī)則檢查邏輯環(huán)上的鄰居節(jié)點分布是否符合要求,各個環(huán)帶上分布的鄰居節(jié)點數(shù)目服從如下分布規(guī)則規(guī)則一對于節(jié)點O的最內(nèi)層環(huán)(i=0)最多可分布k個鄰居節(jié)點數(shù)。k的取值取決于對等網(wǎng)絡(luò)點播系統(tǒng)可支持的最大節(jié)點數(shù)目N,k≈logN;規(guī)則二對于節(jié)點O的外層環(huán)(1≤i≤L)最多可分布1個鄰居節(jié)點,左環(huán)帶和右環(huán)帶各保持1/2個遠(yuǎn)跳鄰居。其中左環(huán)帶上的鄰居節(jié)點和節(jié)點O的距離為負(fù)值,表示該鄰居節(jié)點在當(dāng)前節(jié)點的播放位置之后;右環(huán)帶上的鄰居節(jié)點和節(jié)點O的距離為正值,表示該鄰居節(jié)點在當(dāng)前節(jié)點的播放位置之前。
(3.8)是否退出當(dāng)前頻道,如果退出,則轉(zhuǎn)到步驟(4);否則回到步驟(3.1);(4)客戶端節(jié)點P停止當(dāng)前頻道的播放,主動向邏輯環(huán)上的所有鄰居節(jié)點發(fā)送一個帶上自身全局標(biāo)識的DROP消息,通告自己即將離開,退出當(dāng)前頻道的對等網(wǎng)絡(luò)。
上述步驟(2)的處理過程為(2.1)初始化自身的成員節(jié)點表和鄰居節(jié)點表,并將從索引服務(wù)器獲得的初始成員節(jié)點加入到自己的成員節(jié)點表,設(shè)置成員節(jié)點表中的每個成員節(jié)點的狀態(tài)為待連接;(2.2)檢查成員列表中是否存在狀態(tài)為待連接的成員節(jié)點W,如果不存在,則轉(zhuǎn)步驟(3);如果存在,則轉(zhuǎn)步驟(2.3);(2.3)嘗試與成員節(jié)點W建立連接;(2.4)判斷連接建立是否成功,如果連接建立失敗,則轉(zhuǎn)步驟(2.5);如果連接建立成功,則轉(zhuǎn)步驟(2.6);(2.5)將成員節(jié)點W的狀態(tài)更新為無法連接;然后轉(zhuǎn)到步驟(2.2);(2.6)將節(jié)點W加入到自己的鄰居節(jié)點表,并計算節(jié)點W在邏輯環(huán)上的位置,設(shè)鄰居節(jié)點W的播放位置為tw,那么該鄰居到節(jié)點P的距離d=tw-tp,那么環(huán)號 如果iφL,則將i改為最大環(huán)號為L;(2.7)將成員節(jié)點W的狀態(tài)更新為已連接;然后轉(zhuǎn)到步驟(2.2)。
上述步驟(3.3)中,客戶端節(jié)點P按照下述步驟向鄰居節(jié)點發(fā)送自己的位置信息(A1)創(chuàng)建一個消息結(jié)構(gòu)體msg;(A2)獲取當(dāng)前緩沖區(qū)的狀態(tài),初始化消息結(jié)構(gòu)體中的BM字段;(A3)用自己的GUID設(shè)置消息結(jié)構(gòu)體的GUID,Type設(shè)置為ANNOUNCE,Peer_Adress設(shè)置為自己的IP地址和端口,TTL設(shè)置為MAX_TTL;(A4)向所有鄰居節(jié)點發(fā)送該消息體msg。
上述步驟(3.4)中,客戶端節(jié)點P按照下述步驟接收來自其鄰居節(jié)點的位置信息(B1)取得消息中的GUID值,根據(jù)該GUID判斷該節(jié)點在成員節(jié)點表中是否已經(jīng)存在,如果已經(jīng)存在,則更新成員節(jié)點表中該節(jié)點的信息,包括Peer_Address,當(dāng)前的播放位置tCur和更新時間tLastUpdateTime;(B2)將該消息的TTL值減1;(B3)取得消息的類型,如果是ANNOUNCE消息,則轉(zhuǎn)步驟(B4);如果是FORWARD消息,則轉(zhuǎn)步驟(B5);如果是DROP消息,則轉(zhuǎn)步驟(B6);(B4)將消息類型改為FORWARD,然后轉(zhuǎn)發(fā)給內(nèi)環(huán)上的所有鄰居節(jié)點,轉(zhuǎn)步驟(B7);(B5)從內(nèi)環(huán)上隨機(jī)的選出一個鄰居節(jié)點,將消息轉(zhuǎn)發(fā)給它,轉(zhuǎn)步驟(B7);(B6)從成員節(jié)點表和鄰居節(jié)點表中去掉該節(jié)點P,并向所有的鄰居轉(zhuǎn)發(fā)該消息,轉(zhuǎn)步驟(B7);(B7)判斷TTL值,如果TTL等于0,則丟棄該消息;(B8)轉(zhuǎn)到步驟(3.8)。
上述步驟(3.5)中,客戶端節(jié)點P按照下述步驟重新構(gòu)建拖動后的邏輯環(huán)結(jié)構(gòu)(C1)計算目標(biāo)位置tp和節(jié)點當(dāng)前位置to的距離d,d=tp-to;(C2)判斷目標(biāo)位置是否在當(dāng)前的內(nèi)環(huán)上,即比較d和α的大小,如果dπα,則說明目標(biāo)位置tp在內(nèi)環(huán)上,則直接轉(zhuǎn)步驟(C18),否則轉(zhuǎn)步驟(C3);(C3)初始化一個位置tp的查詢消息Q,同時創(chuàng)建一個經(jīng)過節(jié)點表;(C4)將本節(jié)點的基本信息加入到經(jīng)過節(jié)點表;(C5)通過遍歷當(dāng)前鄰居節(jié)點表找出與目標(biāo)位置tp最近的鄰居節(jié)點作為下一跳節(jié)點P’;(C6)將消息Q轉(zhuǎn)發(fā)給下一跳的鄰居節(jié)點P’;(C7)下一跳的鄰居節(jié)點接收到消息Q;(C8)從消息Q中取出查詢的目標(biāo)位置tp,計算當(dāng)前節(jié)點與該目標(biāo)位置之間的距離d;(C9)比較d和α的大小,如果dπα,則說明目標(biāo)位置tp在內(nèi)環(huán)上,則直接轉(zhuǎn)步驟(C10);否則轉(zhuǎn)步驟(C4);(C10)從內(nèi)環(huán)節(jié)點中選出離目標(biāo)位置P最近的m個節(jié)點,構(gòu)建一個回應(yīng)消息R,并將這m個節(jié)點加入到該消息的查詢結(jié)果表中,該表記錄了此次查詢得到的所有節(jié)點信息;(C11)從經(jīng)過節(jié)點表中取出上一跳鄰居節(jié)點F;(C12)比較自身的GUID和節(jié)點F的GUID是否相等,如果相等,轉(zhuǎn)步驟(C16),如果不相等,轉(zhuǎn)步驟(C13);(C13)將自身的節(jié)點信息加入到查詢結(jié)果表中;(C14)將回應(yīng)消息轉(zhuǎn)發(fā)給鄰居節(jié)點F;(C15)上一跳節(jié)點收到回應(yīng)消息R;并轉(zhuǎn)到步驟(C11)對該消息進(jìn)行相應(yīng)的處理;(C16)回應(yīng)消息R按原路徑返回到最初的查詢節(jié)點P;(C17)將查詢結(jié)果表中的所有節(jié)點加入到最初的查詢節(jié)點P的成員節(jié)點表;(C18)節(jié)點P將自身的當(dāng)前播放位置tCur設(shè)置為tp;(C19)轉(zhuǎn)到步驟(3.8)。
上述步驟(3.6)中,客戶端節(jié)點P按照下述步驟進(jìn)行(D1)如果該鄰居節(jié)點所在的環(huán)號i大于等于1,則轉(zhuǎn)到步驟(D2);如果該鄰居節(jié)點所在環(huán)號等于0,則轉(zhuǎn)到步驟(D3);
(D2)直接將該鄰居節(jié)點從鄰居節(jié)點表和成員節(jié)點表中刪除,轉(zhuǎn)步驟(D4);(D3)構(gòu)建一個DROP類型的消息,消息中帶上自己的GUID值,然后向自己內(nèi)環(huán)上的所有節(jié)點發(fā)送該消息,通告該鄰居節(jié)點的離開;(D4)轉(zhuǎn)到步驟(3.8);上述步驟(3.7)中,客戶端節(jié)點P的處理過程為(E1)設(shè)當(dāng)前檢查的環(huán)為第i層環(huán)并且i=0;(E2)如果環(huán)號i=0并且當(dāng)前環(huán)上的鄰居數(shù)m小于或等于k,或者環(huán)號1≤i≤L并且當(dāng)前環(huán)上的鄰居數(shù)m小于1,則該環(huán)上的鄰居數(shù)目不夠,轉(zhuǎn)到步驟(E3);轉(zhuǎn)到步驟(E4);(E3)從成員節(jié)點表中選出位于該環(huán)帶的成員節(jié)點,并主動與其建立鄰居關(guān)系;連接建立成功,將該節(jié)點加入到鄰居節(jié)點表,并設(shè)置其對應(yīng)的環(huán)號;如果連接失敗,則將該節(jié)點從成員節(jié)點表中刪除;(E4)判斷是否檢查完畢,令i=i+1,如果i大于L,則檢查完畢轉(zhuǎn)到(3.8);否則轉(zhuǎn)到步驟(E1)繼續(xù)檢查。
本發(fā)明克服了目前對等網(wǎng)絡(luò)點播系統(tǒng)中現(xiàn)有節(jié)點組織方法所存在的負(fù)載不均、可靠性差、定位時間長、維護(hù)復(fù)雜等問題,實現(xiàn)了對等網(wǎng)絡(luò)流媒體點播系統(tǒng)中節(jié)點的分布式索引、拖動后節(jié)點的快速定位以及鄰居節(jié)點的動態(tài)發(fā)現(xiàn)。具體而言,本發(fā)明具有以下特點。
(1)控制開銷的負(fù)載均衡性系統(tǒng)的控制開銷主要由節(jié)點加入、離開、查找、發(fā)現(xiàn)等過程中收發(fā)的控制消息數(shù)目來體現(xiàn)。本發(fā)明所述的環(huán)狀節(jié)點組織方法中,每個節(jié)點都維護(hù)各自的邏輯環(huán)結(jié)構(gòu),根據(jù)自己的時間位置點選擇自己的近跳和遠(yuǎn)跳的鄰居節(jié)點,并和自己的鄰居節(jié)點交換控制消息,因此每個節(jié)點控制消息所帶來的開銷被分?jǐn)偟交ゲ幌嗤泥従庸?jié)點上,從而使得系統(tǒng)總的控制開銷相對均衡地分布在各個Peer節(jié)點上。相比樹狀結(jié)構(gòu)中任何加入、查找操作都從控制樹的根節(jié)點開始搜索的方法而言,環(huán)狀拓?fù)渚哂懈玫呢?fù)載均衡性。
(2)VCR操作具有本地化特征由于每個Peer節(jié)點維護(hù)一個自己的環(huán)結(jié)構(gòu),每次用戶執(zhí)行VCR拖動操作后,Peer節(jié)點首先從自己本地的環(huán)結(jié)構(gòu)開始尋找相鄰節(jié)點,如果找到,此次查詢操作將完全在本地完成,即減小了對網(wǎng)絡(luò)的壓力,又縮短了查找的時間。因此,基于邏輯環(huán)結(jié)構(gòu)的VCR查找具有明顯的本地化特征。
(3)拖動后可實現(xiàn)快速查找本發(fā)明中每個節(jié)點以自身為圓心,以α2β(其中α為Peer緩存數(shù)據(jù)的最大時間長度,β為環(huán)的層數(shù),最大為5)的指數(shù)步長為半徑,將鄰居節(jié)點分布在不同的環(huán)帶上,保持不同距離的遠(yuǎn)跳節(jié)點,使得拖動后查找新的相鄰節(jié)點的操作最多在5跳時間內(nèi)即可完成,平均查找跳數(shù)為2~3,實現(xiàn)了拖動后的快速查找。
(4)良好的容錯性對等網(wǎng)絡(luò)點播系統(tǒng)由于其動態(tài)性強(qiáng),拓?fù)浣Y(jié)構(gòu)不僅隨著節(jié)點的加入和離開而變化,還會因為用戶的拖動而變化,因此容錯性尤為重要。本發(fā)明中的環(huán)狀節(jié)點組織方法屬于一種弱一致性的拓?fù)漕愋停词乖诙鄠€節(jié)點同時加入、離開或拖動的情況下,節(jié)點也不會被孤立,仍然可以根據(jù)目前的鄰居節(jié)點信息獲取更多的新節(jié)點,并重新構(gòu)建出穩(wěn)定的環(huán)結(jié)構(gòu),即使所有的鄰居都同時失效或離開,該節(jié)點仍然可以通過向索引服務(wù)器查詢得到新的鄰居,而絕不會被孤立,因此該方法具有良好的容錯性。
(5)節(jié)點分散索引,消除集中索引的性能瓶頸在本發(fā)明采用的環(huán)狀節(jié)點組織方法中,拖動后新節(jié)點的查詢首先在本地執(zhí)行,并將查詢消息轉(zhuǎn)發(fā)給當(dāng)前最近的節(jié)點,然后在該節(jié)點執(zhí)行類似的處理,直到轉(zhuǎn)發(fā)給一個位于目標(biāo)位置最內(nèi)環(huán)的節(jié)點為止,最后從經(jīng)過的節(jié)點收集一定數(shù)目的鄰居節(jié)點重構(gòu)新位置上的邏輯環(huán)結(jié)構(gòu)。與傳統(tǒng)的完全依賴集中式索引服務(wù)器進(jìn)行節(jié)點索引的方法相比,本發(fā)明中每個節(jié)點都利用環(huán)結(jié)構(gòu)索引了當(dāng)前系統(tǒng)中的部分節(jié)點,使得任何節(jié)點都可以利用這些環(huán)結(jié)構(gòu)實現(xiàn)節(jié)點的快速查找,其查找過程是分布式的,消除了集中式索引方式中索引服務(wù)器容易成為系統(tǒng)性能瓶頸的弊端。
(6)拓?fù)渚S護(hù)算法簡單易于實現(xiàn)另外,本發(fā)明中邏輯環(huán)只需要維護(hù)弱一致性,各個節(jié)點通過收發(fā)相應(yīng)的位置信息即可維護(hù)其邏輯環(huán),保證系統(tǒng)的可靠性。相比樹狀或者分布式哈希表結(jié)構(gòu)而言,其環(huán)狀結(jié)構(gòu)的維護(hù)算法更為簡單,也易于實現(xiàn)。
圖1為本發(fā)明方法的主流程框圖;圖2為索引服務(wù)器的邏輯環(huán)結(jié)構(gòu)示意圖;圖3為邏輯環(huán)創(chuàng)建的過程圖;圖4為步驟2.3)中客戶端的邏輯環(huán)結(jié)構(gòu)示意圖;圖5為邏輯環(huán)的維護(hù)操作主流程;圖6為步驟2中的消息格式示意圖;圖7為拖動后重新定位的流程圖;圖8為拖動后查找新位置的示意圖;圖9為邏輯環(huán)的檢查流程;圖10為實例的過程示意圖,其中a)為客戶端節(jié)點P初始加入過程示意圖;b)為客戶端節(jié)點P加入10分鐘后構(gòu)建出的邏輯環(huán)結(jié)構(gòu)示意圖;c)為客戶端節(jié)點P拖動后查找新的鄰居節(jié)點的過程示意圖;d)為客戶端節(jié)點P拖動完成后的邏輯環(huán)結(jié)構(gòu)示意圖。
具體實施例方式
本發(fā)明的基本思路是讓每個節(jié)點維護(hù)一個以自身為中心的、半徑長度指數(shù)級增長的邏輯環(huán),根據(jù)節(jié)點當(dāng)前播放位置之間的距離將其放置在對應(yīng)的邏輯環(huán)上,并按一定的分布原則在每個環(huán)帶維護(hù)一定數(shù)目的鄰居節(jié)點,保證每個環(huán)帶中都有自己的鄰居節(jié)點,從而使得每個節(jié)點既有近跳的鄰居節(jié)點交換媒體數(shù)據(jù),又有遠(yuǎn)跳的鄰居節(jié)點協(xié)助拖動后新鄰居節(jié)點的查找,實現(xiàn)快速定位。利用該方法,Peer節(jié)點不僅可以發(fā)現(xiàn)和找到位置相鄰的鄰近節(jié)點,而且在用戶拖動后能夠快速找到目標(biāo)位置附近的鄰居節(jié)點。
下面結(jié)合附圖和實例對本發(fā)明作進(jìn)一步詳細(xì)說明。如圖1所示,本發(fā)明方法包括以下步驟
(1)新加入的客戶端節(jié)點P向索引服務(wù)器發(fā)送加入請求,索引服務(wù)器將之前索引的各個環(huán)上的節(jié)點作為初始成員節(jié)點列表返回給客戶端節(jié)點P,同時將節(jié)點P加入到自己的內(nèi)層環(huán)上,并淘汰出內(nèi)層環(huán)上加入時間最久的一個節(jié)點;索引服務(wù)器是一個播放位置始終為0、不存放任何媒體數(shù)據(jù)的特殊節(jié)點,它的IP地址對所有的客戶端節(jié)點而言是眾所周知的。如圖2所示,索引服務(wù)器維護(hù)一組以零點為圓心的同心環(huán),其環(huán)半徑符合公式ri=α2i(其中i表示環(huán)的環(huán)號,L表示最大的環(huán)號,i∈{0,1,2,……,L};本發(fā)明將i=0的環(huán)稱為內(nèi)層環(huán),所有i≥1的環(huán)稱為外層環(huán),i=L的環(huán)稱為最外層環(huán);ri為第i層環(huán)的環(huán)半徑;2個相鄰環(huán)之間的區(qū)域稱為一個環(huán)帶;a為每個客戶端節(jié)點最大可緩存的連續(xù)媒體數(shù)據(jù)的時間長度,其取值和客戶端節(jié)點最大可共享內(nèi)存空間大小有關(guān),一般取5分鐘≤a≤20分鐘。對于任意節(jié)點H而言,和它建有TCP連接的節(jié)點M稱為它的鄰居節(jié)點,索引服務(wù)器在內(nèi)環(huán)最多維護(hù)n個最新加入的鄰居節(jié)點,每個外環(huán)帶最多維護(hù)m個鄰居節(jié)點,其中n和m的取值與索引服務(wù)器的維護(hù)開銷有關(guān),其值越大,索引服務(wù)器的處理開銷越大。收到新節(jié)點的加入請求后,索引服務(wù)器從自己的各個環(huán)上的鄰居節(jié)點構(gòu)成一個初始成員節(jié)點列表發(fā)送給新加入的客戶端節(jié)點P,并將該客戶端節(jié)點P加入到自己的內(nèi)層環(huán)上,如果此時內(nèi)層環(huán)總的鄰居節(jié)點數(shù)目超過n,則從內(nèi)層環(huán)上淘汰加入時間最久的一個節(jié)點。
初始成員節(jié)點列表包括如下信息初始成員節(jié)點個數(shù)K和K個成員節(jié)點的信息,每個成員節(jié)點的信息包括節(jié)點的IP地址、監(jiān)聽端口、全局惟一的標(biāo)識GUID和當(dāng)前播放位置tCur。
(2)客戶端節(jié)點P根據(jù)從索引服務(wù)器獲取的初始成員節(jié)點列表,建立自己的鄰居節(jié)點,并根據(jù)各個鄰居節(jié)點到自身的距離d,將其分布到對應(yīng)的邏輯環(huán)上,從而構(gòu)建出自身的邏輯環(huán)結(jié)構(gòu),形成自己的遠(yuǎn)跳鄰居節(jié)點和近跳鄰居節(jié)點。其具體的實施過程如圖3所示,主要由如下7個具體步驟來完成
(2.1)初始化自身的成員節(jié)點表和鄰居節(jié)點表,并將從索引服務(wù)器獲得的初始成員節(jié)點加入到自己的成員節(jié)點表,設(shè)置成員節(jié)點表中的每個成員節(jié)點的狀態(tài)為待連接;成員節(jié)點表記錄該客戶端節(jié)點P最近所了解到的x個節(jié)點信息(本發(fā)明中每個節(jié)點信息用一個Host結(jié)構(gòu)來表示,并且x≤M,M為客戶端節(jié)點最大保存的成員節(jié)點信息的數(shù)目)。Host結(jié)構(gòu)主要包括如下重要信息節(jié)點的全局標(biāo)識(GUID)、地址信息(Peer_Adress)、當(dāng)前播放位置(tCur)、上次更新的時間(tLastUpdateTime)以及連接失敗的次數(shù)(nFailedNum)。鄰居節(jié)點表記錄該客戶端節(jié)點P的所有鄰居節(jié)點,每個鄰居節(jié)點和節(jié)點P保持一個TCP連接,并通過TCP連接來轉(zhuǎn)發(fā)自己的節(jié)點信息(包括GUID、地址、當(dāng)前播放位置)。每個鄰居節(jié)點主要包括如下重要信息鄰居節(jié)點的標(biāo)識(GUID)、該鄰居的距離d、該鄰居所處的環(huán)帶號i。邏輯環(huán)的結(jié)構(gòu)通過鄰居節(jié)點表中位于各個不同環(huán)帶的鄰居節(jié)點來體現(xiàn)。
(2.2)檢查成員列表中是否存在狀態(tài)為待連接的成員節(jié)點W,如果不存在,則轉(zhuǎn)步驟(3);如果存在,則轉(zhuǎn)步驟(2.3);(2.3)嘗試與成員節(jié)點W建立連接;(2.4)判斷連接建立是否成功,如果連接建立失敗,則轉(zhuǎn)步驟(2.5);如果連接建立成功,則轉(zhuǎn)步驟(2.6);(2.5)將成員節(jié)點W的狀態(tài)更新為無法連接;然后轉(zhuǎn)到步驟(2.2);(2.6)將節(jié)點W加入到自己的鄰居節(jié)點表,并計算節(jié)點W在邏輯環(huán)上的位置。設(shè)鄰居節(jié)點W的播放位置為tw,那么該鄰居到節(jié)點P的距離d=tw-tp,那么環(huán)號 如果iφL,則將i設(shè)置為最大環(huán)號為L。
(2.7)將成員節(jié)點W的狀態(tài)更新為已連接;然后轉(zhuǎn)到步驟(2.2);(3)客戶端節(jié)點P根據(jù)邏輯環(huán)的鄰居節(jié)點分布規(guī)則,維護(hù)一個穩(wěn)定的邏輯環(huán)結(jié)構(gòu)。一方面,當(dāng)環(huán)上某個鄰居節(jié)點離開或者失效時,客戶端節(jié)點P會及時地發(fā)現(xiàn)并將其從鄰居列表中踢除;另一方面通過環(huán)上的鄰居節(jié)點傳播自己的播放位置信息和發(fā)現(xiàn)新的節(jié)點信息,當(dāng)某個環(huán)上的鄰居節(jié)點數(shù)目不夠時,從成員表中選出新節(jié)點來建立鄰居關(guān)系,以彌補(bǔ)某個環(huán)帶上鄰居節(jié)點的缺失;另外,當(dāng)用戶拖動到新位置的時候,客戶端節(jié)點P會發(fā)送一個目標(biāo)位置的查詢消息,找到目標(biāo)位置周圍的節(jié)點信息,從而重新構(gòu)建目標(biāo)位置上的鄰居節(jié)點和對應(yīng)的邏輯環(huán)結(jié)構(gòu)。如圖5所示,其具體的實施過程由如下8個子步驟來完成(3.1)客戶端節(jié)點P定期獲取當(dāng)前產(chǎn)生的事件;事件主要由邏輯環(huán)檢查定時器、網(wǎng)絡(luò)處理單元以及用戶VCR操作觸發(fā),包括網(wǎng)絡(luò)消息包的到達(dá)事件,網(wǎng)絡(luò)連接的中斷或關(guān)閉事件、網(wǎng)絡(luò)消息包的發(fā)送事件、用戶拖動事件和邏輯環(huán)檢查事件。
(3.2)客戶端節(jié)點P根據(jù)事件類型轉(zhuǎn)到相應(yīng)的處理步驟;如果是網(wǎng)絡(luò)消息包的發(fā)送事件,則轉(zhuǎn)到步驟(3.3);如果是網(wǎng)絡(luò)消息包的到達(dá)事件,則轉(zhuǎn)到步驟(3.4);如果是用戶拖動的事件,則轉(zhuǎn)到步驟(3.5);如果是網(wǎng)絡(luò)中斷或關(guān)閉事件,則轉(zhuǎn)到步驟(3.6);如果是邏輯環(huán)檢查事件,轉(zhuǎn)到步驟(3.7);(3.3)客戶端節(jié)點P向鄰居節(jié)點發(fā)送自己的位置信息,然后轉(zhuǎn)步驟(3.8);對于每個客戶端節(jié)點而言,每個鄰居節(jié)點都與自己保持一個TCP連接,在每個發(fā)送周期t內(nèi)(t的大小和系統(tǒng)的整體控制開銷有關(guān),t越小,導(dǎo)致的控制開銷越大),通過該連接將自己的位置信息發(fā)送給各個環(huán)帶上的鄰居節(jié)點,其消息格式如圖6所示,包括消息的類型(Type)、發(fā)送節(jié)點的地址(Peer_Address)、消息可以經(jīng)過的跳數(shù)(TTL)、該鄰居當(dāng)前的播放位置(tCur)和緩沖區(qū)的狀態(tài)(BM)。其中消息類包括ANNOUNCE消息和FORWARD兩種類型,ANNOUNCE消息是客戶端節(jié)點P給自己鄰居節(jié)點發(fā)送的位置通告消息,F(xiàn)ORWARD消息是內(nèi)環(huán)鄰居節(jié)點在收到TTL不為零的消息后轉(zhuǎn)發(fā)給自己的鄰居節(jié)點的消息;緩沖區(qū)狀態(tài)BM為一個結(jié)構(gòu)體,包含了該客戶端節(jié)點P的緩沖區(qū)的起點位置(nMin)、長度(nLen)以及每個位置上的數(shù)據(jù)是否存在的標(biāo)識數(shù)組Avail。如果Avail[i]為TRUE,則說明它的第Min+i個時間點上的數(shù)據(jù)已存在,否則表示不存在。其消息發(fā)送步驟如下(A1)創(chuàng)建一個消息結(jié)構(gòu)體msg;
(A2)獲取當(dāng)前緩沖區(qū)的狀態(tài),初始化消息結(jié)構(gòu)體中的BM字段;(A3)用自己的GUID設(shè)置消息結(jié)構(gòu)體的GUID,Type設(shè)置為ANNOUNCE,Peer_Adress設(shè)置為自己的IP地址,端口,TTL設(shè)置為MAX_TTL(MAX_TTL為最大的TTL值,其值為一個經(jīng)驗值,和節(jié)點的規(guī)模有關(guān),值越大,消息在對等網(wǎng)絡(luò)中傳得越遠(yuǎn),但控制開銷也會變大;值越小,消息傳播的范圍越小,控制開銷也會相應(yīng)變小);(A4)向所有鄰居節(jié)點發(fā)送該消息體msg;(3.4)客戶端節(jié)點P接收來自其鄰居節(jié)點G的消息,消息類型包括ANNOUNCE、FORWARD和DROP三種類型,然后根據(jù)消息類型和消息的TTL值決定是否轉(zhuǎn)發(fā)或轉(zhuǎn)發(fā)的對象,最后轉(zhuǎn)步驟(3.8),其具體的處理步驟如下(B1)取得消息中的GUID值,根據(jù)GUID判斷該節(jié)點G在成員節(jié)點表中是否已經(jīng)存在,如果已經(jīng)存在,則更新成員節(jié)點表中該節(jié)點G的信息,包括Peer_Address,當(dāng)前的播放位置tCur和更新時間tLastUpdateTime;(B2)將該消息的TTL值減1;(B3)取得消息的類型,如果是ANNOUNCE消息,則轉(zhuǎn)步驟(B4);如果是FORWARD消息,則轉(zhuǎn)步驟(B5);如果是DROP消息,則轉(zhuǎn)步驟(B6);(B4)將消息類型改為FORWARD,然后轉(zhuǎn)發(fā)給內(nèi)環(huán)上的所有鄰居節(jié)點,轉(zhuǎn)步驟(B7);(B5)從內(nèi)環(huán)上隨機(jī)的選出一個鄰居節(jié)點F,將消息轉(zhuǎn)發(fā)給F節(jié)點,然后轉(zhuǎn)步驟(B7);(B6)從成員節(jié)點表和鄰居節(jié)點表中去掉該節(jié)點G的記錄項,并向所有的鄰居轉(zhuǎn)發(fā)該消息,轉(zhuǎn)步驟(B7);(B7)判斷TTL值,如果TTL等于0,則丟棄該消息;(B8)轉(zhuǎn)到步驟(3.8);(3.5)客戶端節(jié)點P查找目標(biāo)位置周圍的節(jié)點,并根據(jù)返回的節(jié)點重新構(gòu)建拖動后邏輯環(huán)結(jié)構(gòu)。
當(dāng)用戶拖動到新的位置后,該節(jié)點和所有鄰居節(jié)點的相對距離都發(fā)生了變化,為了保持邏輯環(huán)結(jié)構(gòu)的一致性,需要對邏輯環(huán)進(jìn)行重構(gòu),即找到新位置上的近跳和遠(yuǎn)跳鄰居節(jié)點,其中尤為重要的是快速找到新位置附近的臨近節(jié)點給自己提供當(dāng)前急需的媒體數(shù)據(jù)。其具體的操作流程如圖7所示(C1)計算目標(biāo)位置tp和節(jié)點當(dāng)前位置tCuro的距離d,d=tp-tCur;(C2)判斷目標(biāo)位置是否在當(dāng)前的內(nèi)環(huán)上,即比較d和α的大小,如果dπα,則說明目標(biāo)位置tp在內(nèi)環(huán)上,則直接轉(zhuǎn)步驟(C18);否則轉(zhuǎn)步驟(C3);(C3)初始化一個位置tp的查詢消息Q,同時創(chuàng)建一個經(jīng)過節(jié)點表(該表的每一項為消息Q所路經(jīng)的一個節(jié)點的基本信息,包括該節(jié)點的GUID、地址信息Peer_Address和當(dāng)前的時間位置tCur);(C4)將本節(jié)點的基本信息加入到經(jīng)過節(jié)點表;(C5)通過遍歷當(dāng)前鄰居節(jié)點表找出與目標(biāo)位置tp最近的鄰居節(jié)點作為下一跳節(jié)點P’;(C6)將消息Q轉(zhuǎn)發(fā)給下一跳的鄰居節(jié)點P’;(C7)下一跳的鄰居節(jié)點接收到消息Q;(C8)從消息Q中取出查詢的目標(biāo)位置tp,計算當(dāng)前節(jié)點與該目標(biāo)位置之間的距離d;(C9)比較d和α的大小,如果dπα,則說明目標(biāo)位置tp在內(nèi)環(huán)上,則直接轉(zhuǎn)步驟(C10);否則轉(zhuǎn)步驟(C4);(C10)從內(nèi)環(huán)節(jié)點中選出離目標(biāo)位置P最近的m個節(jié)點,構(gòu)建一個回應(yīng)消息R,并將這m個節(jié)點加入到該消息的查詢結(jié)果表中,該表記錄了此次查詢得到的所有節(jié)點信息;(C11)從經(jīng)過節(jié)點表中取出上一跳鄰居節(jié)點F;(C12)比較自身的GUID和節(jié)點F的GUID是否相等,如果相等,轉(zhuǎn)步驟(C16),如果不相等,轉(zhuǎn)步驟(C13);(C13)將自身的節(jié)點信息加入到查詢結(jié)果表中;(C14)將回應(yīng)消息轉(zhuǎn)發(fā)給鄰居節(jié)點F;(C15)上一跳節(jié)點收到回應(yīng)消息R;并轉(zhuǎn)到步驟(C11)對該消息進(jìn)行相應(yīng)的處理;(C16)回應(yīng)消息R按原路徑返回到最初的查詢節(jié)點P;(C17)將查詢結(jié)果表中的所有節(jié)點加入到最初的查詢節(jié)點P的成員節(jié)點表;(C18)節(jié)點P將自身的當(dāng)前播放位置tCur改為tp;(C19)轉(zhuǎn)到步驟(3.8);(3.6)客戶端節(jié)點P發(fā)現(xiàn)某個鄰居節(jié)點失效或離開,將該節(jié)點從邏輯環(huán)中刪除并將該節(jié)點失效的消息通知給自己的其它鄰居節(jié)點,其具體步驟如下(D1)如果該鄰居節(jié)點所在的環(huán)號i大于等于1,即該鄰居節(jié)點為一個外環(huán)節(jié)點,則轉(zhuǎn)到步驟(D2);如果該鄰居節(jié)點所在環(huán)號等于0,即該節(jié)點為一個內(nèi)環(huán)節(jié)點,則轉(zhuǎn)到步驟(D3);(D2)直接將該鄰居節(jié)點從鄰居節(jié)點表和成員節(jié)點表中刪除,轉(zhuǎn)步驟(D4);(D3)構(gòu)建一個DROP類型的消息,消息中帶上自己的GUID值,然后向自己內(nèi)環(huán)上的所有節(jié)點發(fā)送該消息,以通告該鄰居節(jié)點的離開,使得某個節(jié)點的意外離開可以快速被周圍臨近節(jié)點所發(fā)現(xiàn),轉(zhuǎn)步驟(D4);(D4)轉(zhuǎn)到步驟(3.8);(3.7)客戶端節(jié)點P根據(jù)環(huán)上鄰居節(jié)點的分布規(guī)則檢查邏輯環(huán)上的鄰居節(jié)點分布是否符合要求。各個環(huán)帶上分布的鄰居節(jié)點數(shù)目服從如下分布規(guī)則規(guī)則一最內(nèi)層環(huán)(i=0)最多可分布k個鄰居節(jié)點數(shù)。k的取值取決于對等網(wǎng)絡(luò)點播系統(tǒng)可支持的最大節(jié)點數(shù)目N,k≈logN;規(guī)則二外層環(huán)(1≤i≤L)最多可分布1個鄰居節(jié)點,左環(huán)帶和右環(huán)帶各保持1/2個遠(yuǎn)跳鄰居。其中左環(huán)帶上的鄰居節(jié)點和節(jié)點O的距離為負(fù)值,表示該鄰居節(jié)點在當(dāng)前節(jié)點的播放位置之后;右環(huán)帶上的鄰居節(jié)點和節(jié)點O的距離為正值,表示該鄰居節(jié)點在當(dāng)前節(jié)點的播放位置之前。其具體步驟為(E1)設(shè)當(dāng)前檢查的環(huán)為第i層環(huán)并且i=0;(E2)如果環(huán)號i=0并且當(dāng)前環(huán)上的鄰居數(shù)m小于或等于k,或者環(huán)號1≤i≤L并且當(dāng)前環(huán)上的鄰居數(shù)m小于1,則該環(huán)上的鄰居數(shù)目不夠,轉(zhuǎn)到步驟(E3);轉(zhuǎn)到步驟(E4);(E3)從成員節(jié)點表中選出位于該環(huán)帶的成員節(jié)點,并主動與其建立鄰居關(guān)系;連接建立成功,將該節(jié)點加入到鄰居節(jié)點表,并設(shè)置其對應(yīng)的環(huán)號;如果連接失敗,則將該節(jié)點從成員節(jié)點表中刪除;(E4)判斷是否檢查完畢,令i=i+1,如果i大于L,則檢查完畢轉(zhuǎn)到(3.8);否則轉(zhuǎn)到步驟(E1)繼續(xù)檢查;(3.8)是否退出當(dāng)前頻道,如果退出,則轉(zhuǎn)到步驟(4);否則回到步驟(3.1);(4)客戶端節(jié)點P停止當(dāng)前頻道的播放,主動向邏輯環(huán)上的所有鄰居節(jié)點發(fā)送一個帶上自身全局標(biāo)識(GUID)的DROP消息,通告自己即將離開,從而退出當(dāng)前頻道的對等網(wǎng)絡(luò)。
實例根據(jù)上述的實施步驟,圖10給出一個實例來說明本發(fā)明方法的具體效果,實例中各系統(tǒng)參數(shù)的配置如表1所示。
表1系統(tǒng)參數(shù)設(shè)置
在圖10-a中,A、B、C、D為四個已經(jīng)加入到系統(tǒng)中的客戶端節(jié)點,其當(dāng)前播放位置分別為00:02:23、00:03:40、00:09:26、00:16:07,環(huán)的半徑公式ri=α2i,其中a的取值為5分鐘,此時A、B節(jié)點位于索引服務(wù)器的內(nèi)層環(huán)(環(huán)號i=0),C、D分別位于第1、2層環(huán)。當(dāng)新的客戶端節(jié)點P加入系統(tǒng)時,向索引服務(wù)器發(fā)送加入請求,索引服務(wù)器會將A、B、C、D作為初始成員節(jié)點列表全部返回給P,客戶端節(jié)點P(剛加入時當(dāng)前播放位置和索引服務(wù)其一樣為0)收到后和A、B、C、D建立TCP連接,并根據(jù)鄰居節(jié)點的位置,將A、B節(jié)點放在內(nèi)層環(huán),C、D分別放在第1、2層環(huán)。如果A、B、C、D、P均在播放,那么A、B、C、D到P相對距離將不會發(fā)生變化,A、B、C、D在節(jié)點P的邏輯環(huán)上的位置也不會發(fā)生變化。如圖10-b所示,10分鐘后,節(jié)點P的邏輯環(huán)結(jié)構(gòu)仍將是A、B節(jié)點位于節(jié)點P的內(nèi)層環(huán),C、D分別位于節(jié)點P的第1、2層環(huán)。在這期間,鄰居節(jié)點A、B由于和節(jié)點P位置非常臨近,它們的緩沖區(qū)將保存有節(jié)點P目前需要的媒體數(shù)據(jù),所以鄰居節(jié)點A、B會給節(jié)點P提供所需的數(shù)據(jù),另外,鄰居節(jié)點C、D為節(jié)點P的遠(yuǎn)跳節(jié)點,隨時為節(jié)點P提供遠(yuǎn)處位置的查詢。如圖10-c,節(jié)點P播放到10分鐘后,用戶執(zhí)行VCR操作,向前拖動到25分鐘,此時節(jié)點P會發(fā)送一個查詢消息,重構(gòu)新的邏輯環(huán)。根據(jù)邏輯環(huán)的重構(gòu)步驟,節(jié)點P首先將查詢消息發(fā)送到距離目標(biāo)位置25分鐘最近的鄰居節(jié)點D,鄰居節(jié)點D收到查詢消息后發(fā)現(xiàn)目標(biāo)位置25分鐘處就在自己的內(nèi)環(huán)中,于是將自己內(nèi)環(huán)上的節(jié)點E(00:23:40)和節(jié)點F(00:27:40)加入到查詢結(jié)果列表中返回給節(jié)點P,同時鄰居節(jié)點D也是一個查詢消息經(jīng)過的節(jié)點,也會被加入到查詢結(jié)果列表中。這樣,節(jié)點P此時就得到D、E、F三個查詢結(jié)果和原來的A、B、C、D四個鄰居,共有A、B、C、D、E、F六個節(jié)點信息,然后修改自己的當(dāng)前位置到25分鐘,重新計算A、B、C、D、E、F到自己的距離d,最后根據(jù)新的距離,將它們放在對應(yīng)的環(huán)帶上,從而得到如圖10-d所示的邏輯環(huán)結(jié)構(gòu),其中D、E、F成為節(jié)點P當(dāng)前的內(nèi)環(huán)鄰居節(jié)點,C位于節(jié)點P的第1層環(huán),A、B位于節(jié)點P的第2層環(huán),即D、E、F成為節(jié)點P的近跳節(jié)點和節(jié)點P交換數(shù)據(jù),A、B、C成為遠(yuǎn)跳節(jié)點為節(jié)點P提供位置查詢。
權(quán)利要求
1.一種對等網(wǎng)絡(luò)點播系統(tǒng)中的環(huán)狀節(jié)點組織方法,其步驟包括(1)新加入的客戶端節(jié)點P向索引服務(wù)器發(fā)送加入請求,索引服務(wù)器將之前索引的各個環(huán)上的節(jié)點作為初始成員節(jié)點列表返回給客戶端節(jié)點P,同時將節(jié)點P加入到自己的內(nèi)層環(huán)上,并淘汰出內(nèi)層環(huán)上加入時間最久的一個節(jié)點;其中,索引服務(wù)器維護(hù)一組以零點為圓心的同心環(huán),其環(huán)半徑符合公式ri=α2i,其中i為環(huán)號,L為最大的環(huán)號,i∈{0,1,2,……,L};i=0的環(huán)稱為內(nèi)層環(huán),所有i≥1的環(huán)稱為外層環(huán),i=L的環(huán)稱為最外層環(huán);ri為第i層環(huán)的環(huán)半徑;2個相鄰環(huán)之間的區(qū)域稱為一個環(huán)帶;a為每個客戶端節(jié)點最大可緩存的連續(xù)媒體數(shù)據(jù)的時間長度;(2)客戶端節(jié)點P根據(jù)從索引服務(wù)器獲取的初始成員節(jié)點列表,建立自己的鄰居節(jié)點,并根據(jù)各個鄰居節(jié)點到自身的距離d,將其分布到對應(yīng)的邏輯環(huán)上,構(gòu)建出自身的邏輯環(huán)結(jié)構(gòu),形成自己的遠(yuǎn)跳鄰居節(jié)點和近跳鄰居節(jié)點;節(jié)點P的鄰居節(jié)點是指和節(jié)點P建有TCP連接的節(jié)點;(3)客戶端節(jié)點P按照步驟(3.1)-(3.8)維護(hù)邏輯環(huán)結(jié)構(gòu)(3.1)客戶端節(jié)點P定期獲取當(dāng)前產(chǎn)生的事件;(3.2)客戶端節(jié)點P根據(jù)事件類型轉(zhuǎn)到相應(yīng)的處理步驟如果是網(wǎng)絡(luò)消息包的發(fā)送事件,則轉(zhuǎn)到步驟(3.3);如果是網(wǎng)絡(luò)消息包的到達(dá)事件,則轉(zhuǎn)到步驟(3.4);如果是用戶拖動的事件,則轉(zhuǎn)到步驟(3.5);如果是網(wǎng)絡(luò)中斷或關(guān)閉事件,則轉(zhuǎn)到步驟(3.6);如果是邏輯環(huán)檢查事件,轉(zhuǎn)到步驟(3.7);(3.3)客戶端節(jié)點P向鄰居節(jié)點發(fā)送自己的位置信息,其中包括消息的類型(Type)、發(fā)送節(jié)點的地址(Peer_Address)、消息可以經(jīng)過的跳數(shù)(TTL)、該鄰居當(dāng)前的播放位置(tCur)和緩沖區(qū)的狀態(tài)(BM),然后轉(zhuǎn)步驟(3.8);(3.4)客戶端節(jié)點P接收來自其鄰居節(jié)點的消息,其類型包括ANNOUNCE、FORWARD和DROP三種,然后根據(jù)消息類型和消息的TTL值決定是否轉(zhuǎn)發(fā)或轉(zhuǎn)發(fā)的對象,最后轉(zhuǎn)步驟(3.8);(3.5)客戶端節(jié)點P通過查找目標(biāo)位置周圍的節(jié)點,重新構(gòu)建拖動后的邏輯環(huán)結(jié)構(gòu)和新位置周圍的鄰居,然后轉(zhuǎn)步驟(3.8);(3.6)客戶端節(jié)點P發(fā)現(xiàn)某個鄰居節(jié)點失效或離開,將該節(jié)點從邏輯環(huán)中刪除并將該節(jié)點失效的消息通知給自己的其它鄰居節(jié)點,然后轉(zhuǎn)步驟(3.8);(3.7)客戶端節(jié)點P根據(jù)環(huán)上鄰居節(jié)點的分布規(guī)則檢查邏輯環(huán)上的鄰居節(jié)點分布是否符合要求,各個環(huán)帶上分布的鄰居節(jié)點數(shù)目服從如下分布規(guī)則規(guī)則一對于節(jié)點O的最內(nèi)層環(huán)(i=0)最多可分布k個鄰居節(jié)點數(shù)。k的取值取決于對等網(wǎng)絡(luò)點播系統(tǒng)可支持的最大節(jié)點數(shù)目N,k≈logN;規(guī)則二對于節(jié)點O的外層環(huán)(1≤i≤L)最多可分布l個鄰居節(jié)點,左環(huán)帶和右環(huán)帶各保持1/2個遠(yuǎn)跳鄰居。其中左環(huán)帶上的鄰居節(jié)點和節(jié)點O的距離為負(fù)值,表示該鄰居節(jié)點在當(dāng)前節(jié)點的播放位置之后;右環(huán)帶上的鄰居節(jié)點和節(jié)點O的距離為正值,表示該鄰居節(jié)點在當(dāng)前節(jié)點的播放位置之前。(3.8)是否退出當(dāng)前頻道,如果退出,則轉(zhuǎn)到步驟(4);否則回到步驟(3.1);(4)客戶端節(jié)點P停止當(dāng)前頻道的播放,主動向邏輯環(huán)上的所有鄰居節(jié)點發(fā)送一個帶上自身全局標(biāo)識的DROP消息,通告自己即將離開,退出當(dāng)前頻道的對等網(wǎng)絡(luò)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于步驟(2)的處理過程為(2.1)初始化自身的成員節(jié)點表和鄰居節(jié)點表,并將從索引服務(wù)器獲得的初始成員節(jié)點加入到自己的成員節(jié)點表,設(shè)置成員節(jié)點表中的每個成員節(jié)點的狀態(tài)為待連接;(2.2)檢查成員列表中是否存在狀態(tài)為待連接的成員節(jié)點W,如果不存在,則轉(zhuǎn)步驟(3);如果存在,則轉(zhuǎn)步驟(2.3);(2.3)嘗試與成員節(jié)點W建立連接;(2.4)判斷連接建立是否成功,如果連接建立失敗,則轉(zhuǎn)步驟(2.5);如果連接建立成功,則轉(zhuǎn)步驟(2.6);(2.5)將成員節(jié)點W的狀態(tài)更新為無法連接;然后轉(zhuǎn)到步驟(2.2);(2.6)將節(jié)點W加入到自己的鄰居節(jié)點表,并計算節(jié)點W在邏輯環(huán)上的位置,設(shè)鄰居節(jié)點W的播放位置為tw,那么該鄰居到節(jié)點P的距離d=tw-tp,那么環(huán)號 如果iφL,則將i改為最大環(huán)號為L;(2.7)將成員節(jié)點W的狀態(tài)更新為已連接;然后轉(zhuǎn)到步驟(2.2)。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于步驟(3.3)中,客戶端節(jié)點P按照下述步驟向鄰居節(jié)點發(fā)送自己的位置信息(A1)創(chuàng)建一個消息結(jié)構(gòu)體msg;(A2)獲取當(dāng)前緩沖區(qū)的狀態(tài),初始化消息結(jié)構(gòu)體中的BM字段;(A3)用自己的GUID設(shè)置消息結(jié)構(gòu)體的GUID,Type設(shè)置為ANNOUNCE,Peer_Adress設(shè)置為自己的IP地址和端口,TTL設(shè)置為MAX_TTL;(A4)向所有鄰居節(jié)點發(fā)送該消息體msg。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于步驟(3.4)中,客戶端節(jié)點P按照下述步驟接收來自其鄰居節(jié)點的位置信息(B1)取得消息中的GUID值,根據(jù)該GUID判斷該節(jié)點在成員節(jié)點表中是否已經(jīng)存在,如果已經(jīng)存在,則更新成員節(jié)點表中該節(jié)點的信息,包括Peer_Address,當(dāng)前的播放位置tCur和更新時間tLastUpdateTime;(B2)將該消息的TTL值減1;(B3)取得消息的類型,如果是ANNOUNCE消息,則轉(zhuǎn)步驟(B4);如果是FORWARD消息,則轉(zhuǎn)步驟(B5);如果是DROP消息,則轉(zhuǎn)步驟(B6);(B4)將消息類型改為FORWARD,然后轉(zhuǎn)發(fā)給內(nèi)環(huán)上的所有鄰居節(jié)點,轉(zhuǎn)步驟(B7);(B5)從內(nèi)環(huán)上隨機(jī)的選出一個鄰居節(jié)點,將消息轉(zhuǎn)發(fā)給它,轉(zhuǎn)步驟(B7);(B6)從成員節(jié)點表和鄰居節(jié)點表中去掉該節(jié)點P,并向所有的鄰居轉(zhuǎn)發(fā)該消息,轉(zhuǎn)步驟(B7);(B7)判斷TTL值,如果TTL等于0,則丟棄該消息;(B8)轉(zhuǎn)到步驟(3.8)。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于步驟(3.5)中,客戶端節(jié)點P按照下述步驟重新構(gòu)建拖動后的邏輯環(huán)結(jié)構(gòu)(C1)計算目標(biāo)位置tp和節(jié)點當(dāng)前位置to的距離d,d=tp-to;(C2)判斷目標(biāo)位置是否在當(dāng)前的內(nèi)環(huán)上,即比較d和α的大小,如果dπα,則說明目標(biāo)位置tp在內(nèi)環(huán)上,則直接轉(zhuǎn)步驟(C18),否則轉(zhuǎn)步驟(C3);(C3)初始化一個位置tp的查詢消息Q,同時創(chuàng)建一個經(jīng)過節(jié)點表;(C4)將本節(jié)點的基本信息加入到經(jīng)過節(jié)點表;(C5)通過遍歷當(dāng)前鄰居節(jié)點表找出與目標(biāo)位置tp最近的鄰居節(jié)點作為下一跳節(jié)點P’;(C6)將消息Q轉(zhuǎn)發(fā)給下一跳的鄰居節(jié)點P’;(C7)下一跳的鄰居節(jié)點接收到消息Q;(C8)從消息Q中取出查詢的目標(biāo)位置tp,計算當(dāng)前節(jié)點與該目標(biāo)位置之間的距離d;(C9)比較d和α的大小,如果dπα,則說明目標(biāo)位置tp在內(nèi)環(huán)上,則直接轉(zhuǎn)步驟(C10);否則轉(zhuǎn)步驟(C4);(C10)從內(nèi)環(huán)節(jié)點中選出離目標(biāo)位置P最近的m個節(jié)點,構(gòu)建一個回應(yīng)消息R,并將這m個節(jié)點加入到該消息的查詢結(jié)果表中,該表記錄了此次查詢得到的所有節(jié)點信息;(C11)從經(jīng)過節(jié)點表中取出上一跳鄰居節(jié)點F;(C12)比較自身的GUID和節(jié)點F的GUID是否相等,如果相等,轉(zhuǎn)步驟(C16),如果不相等,轉(zhuǎn)步驟(C13);(C13)將自身的節(jié)點信息加入到查詢結(jié)果表中;(C14)將回應(yīng)消息轉(zhuǎn)發(fā)給鄰居節(jié)點F;(C15)上一跳節(jié)點收到回應(yīng)消息R;并轉(zhuǎn)到步驟(C11)對該消息進(jìn)行相應(yīng)的處理;(C16)回應(yīng)消息R按原路徑返回到最初的查詢節(jié)點P;(C17)將查詢結(jié)果表中的所有節(jié)點加入到最初的查詢節(jié)點P的成員節(jié)點表;(C18)節(jié)點P將自身的當(dāng)前播放位置tCur設(shè)置為tp;(C19)轉(zhuǎn)到步驟(3.8)。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于步驟(3.6)中,客戶端節(jié)點P按照下述步驟進(jìn)行(D1)如果該鄰居節(jié)點所在的環(huán)號i大于等于1,則轉(zhuǎn)到步驟(D2);如果該鄰居節(jié)點所在環(huán)號等于0,則轉(zhuǎn)到步驟(D3);(D2)直接將該鄰居節(jié)點從鄰居節(jié)點表和成員節(jié)點表中刪除,轉(zhuǎn)步驟(D4);(D3)構(gòu)建一個DROP類型的消息,消息中帶上自己的GUID值,然后向自己內(nèi)環(huán)上的所有節(jié)點發(fā)送該消息,通告該鄰居節(jié)點的離開;(D4)轉(zhuǎn)到步驟(3.8);
7.根據(jù)權(quán)利要求6所述的方法,其特征在于步驟(3.7)中,客戶端節(jié)點P的處理過程為(E1)設(shè)當(dāng)前檢查的環(huán)為第i層環(huán)并且i=0;(E2)如果環(huán)號i=0并且當(dāng)前環(huán)上的鄰居數(shù)m小于或等于k,或者環(huán)號1≤i≤L并且當(dāng)前環(huán)上的鄰居數(shù)m小于l,則該環(huán)上的鄰居數(shù)目不夠,轉(zhuǎn)到步驟(E3);轉(zhuǎn)到步驟(E4);(E3)從成員節(jié)點表中選出位于該環(huán)帶的成員節(jié)點,并主動與其建立鄰居關(guān)系;連接建立成功,將該節(jié)點加入到鄰居節(jié)點表,并設(shè)置其對應(yīng)的環(huán)號;如果連接失敗,則將該節(jié)點從成員節(jié)點表中刪除;(E4)判斷是否檢查完畢,令i=i+1,如果i大于L,則檢查完畢轉(zhuǎn)到(3.8);否則轉(zhuǎn)到步驟(E1)繼續(xù)檢查。
全文摘要
本發(fā)明公開了對等網(wǎng)絡(luò)流媒體點播系統(tǒng)中的環(huán)狀節(jié)點組織方法,其執(zhí)行步驟為①新加入節(jié)點P從索引服務(wù)器獲取初始成員節(jié)點表;②節(jié)點P利用初始成員節(jié)點建立其鄰居節(jié)點,并根據(jù)鄰居節(jié)點到自身的距離d,將其分布到對應(yīng)的第
文檔編號H04N21/61GK1901495SQ20061001950
公開日2007年1月24日 申請日期2006年6月28日 優(yōu)先權(quán)日2006年6月28日
發(fā)明者金海 , 程斌, 廖小飛, 趙斗斗, 王福臣, 周怡, 王浩, 殷江培 申請人:華中科技大學(xué)