本發(fā)明涉及網(wǎng)絡(luò)通信領(lǐng)域,特別涉及一種利用相似文件協(xié)同的BitTorrent數(shù)據(jù)分發(fā)系統(tǒng)及方法。
背景技術(shù):
數(shù)據(jù)分發(fā)是網(wǎng)絡(luò)通信領(lǐng)域的核心問題之一。提高數(shù)據(jù)分發(fā)的速度對于提高網(wǎng)絡(luò)的效率和服務(wù)質(zhì)量至關(guān)重要。目前,數(shù)據(jù)分發(fā)技術(shù)主要包括單節(jié)點(diǎn)下載技術(shù)和多節(jié)點(diǎn)協(xié)作下載技術(shù)。每個節(jié)點(diǎn)是擁有處理器、內(nèi)存、磁盤、網(wǎng)卡、操作系統(tǒng)、TCP/IP網(wǎng)絡(luò)協(xié)議棧的可獨(dú)立運(yùn)行的計(jì)算機(jī)。節(jié)點(diǎn)之間可通過網(wǎng)卡基于TCP/IP網(wǎng)絡(luò)協(xié)議相互交換網(wǎng)絡(luò)消息。
單節(jié)點(diǎn)下載技術(shù)將一個文件從一個存儲該文件的節(jié)點(diǎn)(稱為文件存儲節(jié)點(diǎn))通過網(wǎng)絡(luò)傳輸?shù)揭粋€請求文件的節(jié)點(diǎn)(稱為文件請求節(jié)點(diǎn))。如果有多個文件請求節(jié)點(diǎn)同時向一個文件存儲節(jié)點(diǎn)請求文件,那么不同的文件請求節(jié)點(diǎn)與文件存儲節(jié)點(diǎn)之間建立獨(dú)立的網(wǎng)絡(luò)連接并獨(dú)立傳輸數(shù)據(jù),而文件請求節(jié)點(diǎn)之間沒有任何的通信。最終,每個文件請求節(jié)點(diǎn)獲取文件的一個副本。這種方法需要消耗文件存儲節(jié)點(diǎn)大量的網(wǎng)絡(luò)帶寬資源,容易在文件存儲節(jié)點(diǎn)附近造成熱點(diǎn)通信區(qū)域,產(chǎn)生網(wǎng)絡(luò)擁塞。
多節(jié)點(diǎn)協(xié)作下載技術(shù)將一個文件從一個或者多個文件存儲節(jié)點(diǎn)通過網(wǎng)絡(luò)傳輸?shù)蕉鄠€文件請求節(jié)點(diǎn)。每個文件被分為一組相同大小的數(shù)據(jù)塊,而各數(shù)據(jù)塊的大小由應(yīng)用靈活配置。文件的第一個數(shù)據(jù)塊定義為編號0,第二個數(shù)據(jù)塊的編號是1,后續(xù)的數(shù)據(jù)塊編號按照數(shù)據(jù)塊位置遞增計(jì)算。每個文件請求節(jié)點(diǎn)可以同時向多個文件存儲節(jié)點(diǎn)請求不同編號的數(shù)據(jù)塊;同時,如果有多個文件請求節(jié)點(diǎn)同時向文件存儲節(jié)點(diǎn)獲取文件數(shù)據(jù),那么不同的文件請求節(jié)點(diǎn)可以相互傳輸對方缺失的文件數(shù)據(jù)塊,從而降低了文件存儲節(jié)點(diǎn)的網(wǎng)絡(luò)通信壓力,提高了下載速度。
在多節(jié)點(diǎn)協(xié)作下載技術(shù)中,BitTorrent系統(tǒng)是被普遍使用的一種數(shù)據(jù)分發(fā)系統(tǒng),具有簡單實(shí)用,易于部署的特點(diǎn)。BitTorrent系統(tǒng)為一個文件建立一個種子文件(稱為torrent)。一個torrent將文件切分為大小相同的一組數(shù)據(jù)塊,每個數(shù)據(jù)塊通過一個MD5哈希函數(shù)生成一個唯一的哈希值,用于索引數(shù)據(jù)塊內(nèi)容。
BitTorrent數(shù)據(jù)分發(fā)系統(tǒng)包括一個控制節(jié)點(diǎn)(Tracker)、一個或多個文件請求節(jié)點(diǎn)(稱為對等節(jié)點(diǎn),Peer)、一個或多個文件存儲節(jié)點(diǎn)(稱為種子節(jié)點(diǎn),Seed)。
控制節(jié)點(diǎn)與對等節(jié)點(diǎn)和種子節(jié)點(diǎn)交互,安裝有數(shù)據(jù)傳輸控制程序,主要功能是收集對等節(jié)點(diǎn)和種子節(jié)點(diǎn)的地址信息與種子文件,然后存儲到內(nèi)存和磁盤中,并接收對等節(jié)點(diǎn)提交的文件下載的請求。
每個對等節(jié)點(diǎn)和種子節(jié)點(diǎn)安裝數(shù)據(jù)下載上傳程序,數(shù)據(jù)下載上傳程序的主要功能是從控制節(jié)點(diǎn)獲取下載相同文件的對等節(jié)點(diǎn)和種子節(jié)點(diǎn)地址信息,并從對等節(jié)點(diǎn)和種子節(jié)點(diǎn)下載所需要的數(shù)據(jù)塊;同時,為其它對等節(jié)點(diǎn)提供已下載的數(shù)據(jù)塊。
基于BitTorrent的數(shù)據(jù)分發(fā)基本思想是:
(1)對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息;
(2)控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序選擇一定數(shù)量與對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)和擁有該文件的種子節(jié)點(diǎn)的地址信息,并將這些地址信息傳輸給對等節(jié)點(diǎn);
(3)每個對等節(jié)點(diǎn)(記為Peer0)的數(shù)據(jù)下載上傳程序解析控制節(jié)點(diǎn)返回的節(jié)點(diǎn)地址信息,存儲到鄰居節(jié)點(diǎn)集合中,并周期性地與鄰居節(jié)點(diǎn)聯(lián)系并下載所需的數(shù)據(jù)塊,直至獲取到完整的文件,數(shù)據(jù)下載上傳程序退出。具體步驟如下:
3.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序初始化信息,具體包括:
3.1.1對等節(jié)點(diǎn)Peer0令待下載數(shù)據(jù)塊的數(shù)量記為LeftBlock。令N對應(yīng)待下載文件的數(shù)據(jù)塊總數(shù)。設(shè)LeftBlock=N。
3.1.2對等節(jié)點(diǎn)Peer0為每個鄰居i維護(hù)一個已下載數(shù)據(jù)塊數(shù)組,記為DownloadedBlock。數(shù)組DownloadedBlock初始化為包含N個零元素的一維數(shù)組,。若鄰居i已經(jīng)下載編號為j的數(shù)據(jù)塊,那么設(shè)定i.DownloadedBlock(j)=1,否則設(shè)定i.DownloadedBlock(j)=0,其中,i.代表訪問鄰居i的一個數(shù)據(jù)結(jié)構(gòu),這是面向?qū)ο蟮木幊陶Z言中常用的訪問對象屬性的方式,下文采取類似的表示方法。
3.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序選擇鄰居節(jié)點(diǎn)集合S中副本數(shù)量最少的數(shù)據(jù)塊,記其編號為Rarestblock。具體步驟如下:
3.2.1計(jì)算鄰居節(jié)點(diǎn)集合已下載數(shù)據(jù)塊的副本數(shù)。一個數(shù)據(jù)塊的副本數(shù)等于擁有該數(shù)
據(jù)塊的鄰居節(jié)點(diǎn)的總數(shù),對于編號為j的數(shù)據(jù)塊,其副本數(shù)定義為:
∑i∈Si.DownloadedBlock(j)
3.2.2對等節(jié)點(diǎn)Peer0選擇副本數(shù)最少的一個數(shù)據(jù)塊,記其編號為Rarestblock。
3.3對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序向擁有編號為Rarestblock的數(shù)據(jù)塊一個鄰居節(jié)點(diǎn)X發(fā)送一個下載數(shù)據(jù)塊請求。
3.4鄰居節(jié)點(diǎn)X的數(shù)據(jù)下載上傳管理程序選擇請求的數(shù)據(jù)塊,通過TCP/IP協(xié)議傳輸給對等節(jié)點(diǎn)Peer0。
3.5對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序?qū)@得的編號為Rarestblock的數(shù)據(jù)塊存儲到待下載文件的編號為Rarestblock的位置。并更新剩余的數(shù)據(jù)塊數(shù)目LeftBlock=LeftBlock-1,已下載的數(shù)據(jù)塊編號集合DownloadedBlock(Rarestblock)=D1。
3.6對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳管理程序判斷:若待下載數(shù)據(jù)塊數(shù)目LeftBlock=0,說明對等節(jié)點(diǎn)已經(jīng)下載所有的數(shù)據(jù)塊;否則,轉(zhuǎn)3.2步,對等節(jié)點(diǎn)繼續(xù)下載剩余的數(shù)據(jù)塊。
已有的單節(jié)點(diǎn)下載技術(shù)和多節(jié)點(diǎn)協(xié)作下載技術(shù)都是針對相同的文件進(jìn)行傳輸,沒有考慮相似的文件。兩個文件之間的關(guān)系根據(jù)相似程度可分為不相似、相似、相同三種。相似度定義為兩個文件相同的數(shù)據(jù)塊的個數(shù)除以兩個文件所有數(shù)據(jù)塊的總數(shù)。如果兩個文件沒有任何相同的數(shù)據(jù)塊,那么這兩個文件是不相似的;反之,如果兩個文件所有的數(shù)據(jù)塊都相同,那么兩個文件是相同文件;相似文件指的是存在一定數(shù)量相同數(shù)據(jù)塊的兩個文件。因此,相同文件也可以看做是特殊的相似文件。本發(fā)明關(guān)注的相似文件指的是存在一定相同數(shù)據(jù)塊和一定數(shù)量不同數(shù)據(jù)塊的文件。相似文件來源較廣,例如,不同版本的Linux操作系統(tǒng)安裝文件通常包含大量相同的程序和數(shù)據(jù),這些相同的數(shù)據(jù)塊在數(shù)據(jù)分發(fā)過程是等價的。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題是:針對現(xiàn)有的基于BitTorrent的數(shù)據(jù)分發(fā)系統(tǒng)無法利用相似文件實(shí)現(xiàn)快速數(shù)據(jù)分發(fā)的問題,提出一種相似文件協(xié)同的BitTorrent數(shù)據(jù)分發(fā)系統(tǒng)及方法,有效挖掘相似文件資源來加速數(shù)據(jù)分發(fā)。
本發(fā)明的技術(shù)方案是:提供一種基于相似文件協(xié)同的BitTorrent數(shù)據(jù)分發(fā)系統(tǒng),由一個控制節(jié)點(diǎn)、一個或多個對等節(jié)點(diǎn)、一個或多個種子節(jié)點(diǎn)構(gòu)成,每個節(jié)點(diǎn)都是獨(dú)立運(yùn)行、可相互進(jìn)行網(wǎng)絡(luò)通信的計(jì)算機(jī);
所述控制節(jié)點(diǎn)負(fù)責(zé)與對等節(jié)點(diǎn)和種子節(jié)點(diǎn)交互,所述節(jié)點(diǎn)上安裝有數(shù)據(jù)傳輸控制程序,所述數(shù)據(jù)傳輸控制程序接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,存儲各個種子文件對應(yīng)的種子節(jié)點(diǎn)和對等節(jié)點(diǎn)的信息,以及所有的種子文件;所述數(shù)據(jù)傳輸控制程序同時接收每個對等節(jié)點(diǎn)提交的文件下載請求,選擇一組擁有相似文件的種子節(jié)點(diǎn),一組正在下載相同文件的對等節(jié)點(diǎn)以及擁有相同文件的種子節(jié)點(diǎn),并將這些節(jié)點(diǎn)與對應(yīng)的種子節(jié)點(diǎn)傳輸給發(fā)送請求消息的對等節(jié)點(diǎn)。
每個對等節(jié)點(diǎn)安裝有數(shù)據(jù)下載上傳程序,該數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息,消息包括待下載文件的名稱和種子文件信息。同時,該數(shù)據(jù)下載上傳程序讀取控制節(jié)點(diǎn)返回的種子節(jié)點(diǎn)與對等節(jié)點(diǎn)地址信息以及對應(yīng)的種子文件,存入鄰居節(jié)點(diǎn)集合,然后定期從鄰居節(jié)點(diǎn)集合請求數(shù)據(jù)塊。
每個所述種子節(jié)點(diǎn)也安裝有數(shù)據(jù)下載上傳程序,該數(shù)據(jù)下載上傳程序向所述控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,消息包括種子節(jié)點(diǎn)擁有的文件的名稱和種子文件。同時,該數(shù)據(jù)下載上傳程序接收所述對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,根據(jù)請求數(shù)據(jù)塊的編號,從文件對應(yīng)編號位置選擇數(shù)據(jù)塊,并通過網(wǎng)絡(luò)傳輸給請求該數(shù)據(jù)塊的對等節(jié)點(diǎn)。
并且,所述對等節(jié)點(diǎn)在從下載相同文件的對等節(jié)點(diǎn)或擁有相同文件的種子節(jié)點(diǎn)下載數(shù)據(jù)塊時,直接發(fā)送數(shù)據(jù)塊在本地文件的編號到對方節(jié)點(diǎn),對方節(jié)點(diǎn)根據(jù)請求數(shù)據(jù)塊的編號傳輸對應(yīng)的數(shù)據(jù)塊,對等節(jié)點(diǎn)直接將數(shù)據(jù)塊根據(jù)編號存入本地文件;而對等節(jié)點(diǎn)在從擁有相似文件的種子節(jié)點(diǎn)下載數(shù)據(jù)塊時,對等節(jié)點(diǎn)發(fā)送請求數(shù)據(jù)塊在對方節(jié)點(diǎn)文件的位置編號到對方節(jié)點(diǎn),對方節(jié)點(diǎn)將對應(yīng)的數(shù)據(jù)塊傳輸給對等節(jié)點(diǎn),最后對等節(jié)點(diǎn)根據(jù)數(shù)據(jù)塊在本地文件的編號,將數(shù)據(jù)塊存入對應(yīng)的位置。
本發(fā)明的數(shù)據(jù)分發(fā)系統(tǒng)的主要工作原理:控制節(jié)點(diǎn)主動發(fā)現(xiàn)與對等節(jié)點(diǎn)待下載文件相似度最高的一組文件,并將擁有這些文件的種子節(jié)點(diǎn)的地址信息傳輸給對等節(jié)點(diǎn);對等節(jié)點(diǎn)向這些種子節(jié)點(diǎn)請求下載數(shù)據(jù)塊,同時從下載相同文件的其它對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn)獲取數(shù)據(jù)塊,從而顯著提升對等節(jié)點(diǎn)的下載速度。
另外,提供一種基于相似文件協(xié)同的BitTorrent數(shù)據(jù)分發(fā)方法包括如下步驟:
第一步,構(gòu)建一個BitTorrent數(shù)據(jù)分發(fā)系統(tǒng),它由一個控制節(jié)點(diǎn)、一個或多個對等節(jié)點(diǎn)、一個或多個種子節(jié)點(diǎn)構(gòu)成,每個節(jié)點(diǎn)都是獨(dú)立運(yùn)行、可相互進(jìn)行網(wǎng)絡(luò)通信的計(jì)算機(jī)。
第二步,控制節(jié)點(diǎn)執(zhí)行數(shù)據(jù)傳輸控制程序。該數(shù)據(jù)傳輸控制程序獨(dú)立地接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,提取文件發(fā)布消息包含的種子文件信息,并在內(nèi)存和磁盤存儲每個種子文件對應(yīng)的所有種子節(jié)點(diǎn)地址信息。其次,該數(shù)據(jù)傳輸控制程序獨(dú)立地接收每個對等節(jié)點(diǎn)的文件下載請求消息,提取文件下載請求消息包含的請求文件的種子文件,選擇與對等節(jié)點(diǎn)請求文件的種子文件相似度最高的k個不同的種子文件,然后選擇k個擁有對應(yīng)完整文件的種子節(jié)點(diǎn)地址,同時選擇k2個與發(fā)送請求的對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn),然后將這些種子文件、種子節(jié)點(diǎn)地址和對等節(jié)點(diǎn)地址通過網(wǎng)絡(luò)傳輸給發(fā)送請求消息的對等節(jié)點(diǎn)。
第三步,每個對等節(jié)點(diǎn)執(zhí)行數(shù)據(jù)下載上傳程序。數(shù)據(jù)下載上傳程序負(fù)責(zé)向控制節(jié)點(diǎn)請求具有相似文件的種子節(jié)點(diǎn)地址、正在下載相同文件的對等節(jié)點(diǎn)地址和擁有相同文件的種子節(jié)點(diǎn)地址,并將這些節(jié)點(diǎn)地址存入鄰居節(jié)點(diǎn)集合。然后,每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序向本節(jié)點(diǎn)對應(yīng)的鄰居節(jié)點(diǎn)請求缺失的數(shù)據(jù)塊;同時,該程序接收其它對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,并向?qū)?yīng)的對等節(jié)點(diǎn)上傳已經(jīng)下載的數(shù)據(jù)塊。
第四步,每個種子節(jié)點(diǎn)執(zhí)行數(shù)據(jù)下載上傳程序。數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,消息包括本節(jié)點(diǎn)擁有的文件名稱和對應(yīng)的種子文件。同時,數(shù)據(jù)下載上傳程序還接收系統(tǒng)中的對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,并向?qū)Φ裙?jié)點(diǎn)上傳指定的數(shù)據(jù)塊。
所述第一步中的構(gòu)建一個BitTorrent數(shù)據(jù)分發(fā)系統(tǒng)具體為:
所述控制節(jié)點(diǎn)負(fù)責(zé)與對等節(jié)點(diǎn)和種子節(jié)點(diǎn)交互,所述控制節(jié)點(diǎn)上安裝有數(shù)據(jù)傳輸控制程序,所述數(shù)據(jù)傳輸控制程序接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,存儲各個種子文件對應(yīng)的種子節(jié)點(diǎn)和對等節(jié)點(diǎn)的信息,以及所有的種子文件;所述數(shù)據(jù)傳輸控制程序同時接收每個對等節(jié)點(diǎn)提交的文件下載請求,選擇一組擁有相似文件的種子節(jié)點(diǎn),一組正在下載相同文件的對等節(jié)點(diǎn)以及擁有相同文件的種子節(jié)點(diǎn),并將這些節(jié)點(diǎn)與對應(yīng)的種子節(jié)點(diǎn)傳輸給發(fā)送請求消息的對等節(jié)點(diǎn);
每個對等節(jié)點(diǎn)安裝有數(shù)據(jù)下載上傳程序,該數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息,消息包括待下載文件的名稱和種子文件信息;同時,該數(shù)據(jù)下載上傳程序讀取控制節(jié)點(diǎn)返回的種子節(jié)點(diǎn)與對等節(jié)點(diǎn)地址信息以及對應(yīng)的種子文件,存入鄰居節(jié)點(diǎn)集合,然后定期從鄰居節(jié)點(diǎn)集合請求數(shù)據(jù)塊;
每個所述種子節(jié)點(diǎn)也安裝有數(shù)據(jù)下載上傳程序,該數(shù)據(jù)下載上傳程序向所述控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,消息包括種子節(jié)點(diǎn)擁有的文件的名稱和種子文件;同時,該數(shù)據(jù)下載上傳程序接收所述對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,根據(jù)請求數(shù)據(jù)塊的編號,從文件對應(yīng)編號位置選擇數(shù)據(jù)塊,并通過網(wǎng)絡(luò)傳輸給請求該數(shù)據(jù)塊的對等節(jié)點(diǎn)。
所述第二步中的控制節(jié)點(diǎn)執(zhí)行數(shù)據(jù)傳輸控制程序具體還包括以下步驟:
步驟2.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,解析文件發(fā)布消息包含的種子文件信息,并在內(nèi)存和磁盤更新種子文件對應(yīng)的種子節(jié)點(diǎn)集合信息;該信息存儲在一個字典數(shù)據(jù)結(jié)構(gòu)里面,記為種子文件字典TorrentIndexTable;
步驟2.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序接收每個對等節(jié)點(diǎn)提交的文件下載請求消息,解析文件下載請求消息包含的種子文件信息,標(biāo)記為torrent1,然后從種子文件字典TorrentIndexTable記錄的所有的種子文件中,選擇與對等節(jié)點(diǎn)的種子文件的相似度最高的k個不同的種子文件,然后利用這些種子文件查詢種子文件字典TorrentIndexTable以獲取對應(yīng)的種子節(jié)點(diǎn);最后,選擇k2個與對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)地址和種子節(jié)點(diǎn)地址,并將這些節(jié)點(diǎn)地址及對應(yīng)的種子文件傳輸給對等節(jié)點(diǎn)。
所述第三步中的每個對等節(jié)點(diǎn)執(zhí)行數(shù)據(jù)下載上傳程序具體還包括以下步驟:
步驟3.1每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序初始化下載過程;設(shè)定LeftBlock代表未下載的數(shù)據(jù)塊的數(shù)量,設(shè)定N為待下載文件的數(shù)據(jù)塊總數(shù),設(shè)置LeftBlock的初始值為N;同時,該程序?yàn)猷従蛹系拿總€鄰居節(jié)點(diǎn)i維護(hù)一個已下載數(shù)據(jù)塊數(shù)組DownloadedBlock,DownloadedBlock數(shù)組的長度等于鄰居節(jié)點(diǎn)i所擁有文件的數(shù)據(jù)塊的數(shù)目;DownloadedBlock的各項(xiàng)初始化為0,若節(jié)點(diǎn)i擁有編號為j的數(shù)據(jù)塊,那么設(shè)定i.DownloadedBlock(j)=1,否則,設(shè)定i.DownloadedBlock(j)=0;
步驟3.2每個對等節(jié)點(diǎn)每隔t秒請求每個鄰居節(jié)點(diǎn)i已下載的數(shù)據(jù)塊信息,更新鄰居i的已下載數(shù)據(jù)塊數(shù)組DownloadedBlock;其中,t代表兩次下載數(shù)據(jù)塊的等待時間,t為正整數(shù),通常設(shè)置為較小的數(shù)值,以快速下載所有的數(shù)據(jù)塊,因此,t的默認(rèn)值為0.1秒;
步驟3.3每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息,消息包括待下載文件的名稱和對應(yīng)的種子文件;
步驟3.4每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序讀取控制節(jié)點(diǎn)返回的鄰居節(jié)點(diǎn)地址及對應(yīng)的種子文件,并存入鄰居節(jié)點(diǎn)集合;
步驟3.5每個對等節(jié)點(diǎn)記為Peer0,對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序?yàn)閾碛邢嗨莆募拿總€種子節(jié)點(diǎn)維護(hù)一個數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock,記錄本節(jié)點(diǎn)和該種子節(jié)點(diǎn)的相同數(shù)據(jù)塊編號映射信息;
步驟3.6每個對等節(jié)點(diǎn)記為Peer0,對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序每隔t秒從鄰居節(jié)點(diǎn)集合下載一個數(shù)據(jù)塊,參數(shù)t根據(jù)步驟3.2約定取值。
所述第四步中的每個種子節(jié)點(diǎn)執(zhí)行數(shù)據(jù)下載上傳程序具體還包括以下步驟:
步驟4.1種子節(jié)點(diǎn)SeedNode0的數(shù)據(jù)下載上傳程序選擇本地磁盤的一個名稱為F的文件的種子文件,向控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,并傳輸文件F對應(yīng)的種子文件到控制節(jié)點(diǎn);
步驟4.2種子節(jié)點(diǎn)SeedNode0的數(shù)據(jù)下載上傳程序持續(xù)監(jiān)聽對等節(jié)點(diǎn)的數(shù)據(jù)塊請求消息,讀取消息包含的數(shù)據(jù)塊的編號j,從本地文件選擇編號為j的數(shù)據(jù)塊,并通過網(wǎng)絡(luò)傳輸給對方節(jié)點(diǎn)。
并且,所述步驟2.1進(jìn)一步包括以下具體步驟:
步驟2.1.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序解析種子節(jié)點(diǎn)的文件發(fā)布消息,獲得種子節(jié)點(diǎn)的地址SeedAddress,及torrent的名稱,記為TorrentNAME;
步驟2.1.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序更新種子文件字典TorrentIndexTable,記錄當(dāng)前所有的種子節(jié)點(diǎn)地址信息,即
TorrentIndexTable[TorrentNAME]=TorrentIndexTable[TorrentNAME]∪{SeedAddre ss};
所述步驟2.2進(jìn)一步包括以下具體步驟:
步驟2.2.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序查詢種子文件字典TorrentIndexTable記錄的所有的種子文件,計(jì)算種子文件字典TorrentIndexTable記錄的所有的種子文件與對等節(jié)點(diǎn)提交下載請求消息包含的種子文件的相似度;設(shè)種子文件torrent2為種子文件字典TorrentIndexTable記錄的所有的種子文件中的一個,種子文件torrent1為對等節(jié)點(diǎn)提交請求文件下載消息包含的種子文件;
步驟2.2.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序按照相似度的降序排列所有種子文件,然后選擇相似度最大的k個種子文件;其中k代表用于相似文件下載的種子文件的數(shù)目;
步驟2.2.3控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序根據(jù)步驟2.2.2選擇的種子文件查詢k個種子節(jié)點(diǎn)地址;
步驟2.2.4控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序選擇k2個與對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)和擁有該文件的種子節(jié)點(diǎn)的地址信息,記為SameFileSet;
步驟2.2.5控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序?qū)⒎N子集合SeedNodeSet與SameFileSet包含的種子節(jié)點(diǎn)地址信息及對應(yīng)的種子文件傳輸給對方對等節(jié)點(diǎn)。
并且,所述步驟3.5進(jìn)一步包括以下具體步驟:
步驟3.5.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序從本節(jié)點(diǎn)的鄰居節(jié)點(diǎn)集合讀取每個擁有相似文件的種子節(jié)點(diǎn)地址記為SeedNode2,及其對應(yīng)的種子文件記為torrent2,為SeedNode2初始化一個數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock,其中數(shù)組DownloadedSameBlock的長度等于對等節(jié)點(diǎn)Peer0待下載文件的數(shù)據(jù)塊的總數(shù)目,DownloadedSameBlock的各項(xiàng)初始化為0;
步驟3.5.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序計(jì)算待下載文件的數(shù)據(jù)塊的哈希值集合S1與步驟3.5.1選擇的種子節(jié)點(diǎn)SeedNode2的數(shù)據(jù)塊哈希值集合S2的交集SameBlocks,即SameBlocks={j|j∈S1∧j∈S2};
步驟3.5.3對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序讀取集合SameBlocks的每個數(shù)據(jù)塊的哈希值,若該數(shù)據(jù)塊在本節(jié)點(diǎn)的文件中的編號為j,在種子節(jié)點(diǎn)SeedNode2的文件的編號為j2,那么更新鄰居SeedNode2對應(yīng)的數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock(j)=j(luò)2;
所述步驟3.6進(jìn)一步包括以下具體步驟:
步驟3.6.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序選擇鄰居節(jié)點(diǎn)副本數(shù)目最少的數(shù)據(jù)塊;
步驟3.6.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序判斷:若編號為Rarestblock數(shù)據(jù)塊對應(yīng)的鄰居和本節(jié)點(diǎn)待下載的文件相同,那么該程序向該鄰居發(fā)送一個數(shù)據(jù)塊請求消息,消息包含數(shù)據(jù)塊的編號Rarestblock;
步驟3.6.3若步驟3.6.2判斷不成立,即編號為Rarestblock數(shù)據(jù)塊對應(yīng)的鄰居記為Z,和本節(jié)點(diǎn)待下載的文件不是相同文件,那么對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序計(jì)算該數(shù)據(jù)塊在鄰居Z的編號j2,并向鄰居Z請求編號為j2的數(shù)據(jù)塊,
步驟3.6.4對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序設(shè)置待下載數(shù)據(jù)塊數(shù)目LeftBlock=LeftBlock-1,更新本節(jié)點(diǎn)已下載的數(shù)據(jù)塊編號數(shù)組DownloadedBlock(Rarestblock)=1;
步驟3.6.5對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序判斷若待下載數(shù)據(jù)塊數(shù)目LeftBlock=0,說明已經(jīng)下載所有的數(shù)據(jù)塊,轉(zhuǎn)第四步,繼續(xù)為其它對等節(jié)點(diǎn)上傳數(shù)據(jù)塊;否則,對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序休眠t秒,t秒間隔結(jié)束后轉(zhuǎn)步驟3.6.1,繼續(xù)下載剩余的數(shù)據(jù)塊,參數(shù)t取值與步驟3.2相同。
所述步驟3.6.1進(jìn)一步包括以下具體步驟:
步驟3.6.1.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序計(jì)算鄰居節(jié)點(diǎn)集合已下載數(shù)據(jù)塊的副本數(shù)目,每個數(shù)據(jù)塊的的副本數(shù)目等于擁有該數(shù)據(jù)塊的所有鄰居的總數(shù);設(shè)定SameSet代表正在下載相同文件的對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn),設(shè)定SimilarSet代表所有擁有相似文件的種子節(jié)點(diǎn),則編號為j的數(shù)據(jù)塊的副本總數(shù)等于在SameSet集合擁有該數(shù)據(jù)塊的鄰居的數(shù)目與在SimilarSet集合擁有該數(shù)據(jù)塊的鄰居的數(shù)目的之和,即∑i∈SameSeti.DownloadedBlock(j)+∑k∈SimilarSetk.E(j),其中∑i∈SameSeti.DownloadedBlock(j)代表在SameSet集合擁有該數(shù)據(jù)塊的鄰居的數(shù)目,Σk∈SimilarSetk.E(j)代表在SimilarSet集合擁有該數(shù)據(jù)塊的鄰居的數(shù)目,其中i.DownloadedBlock(j)=1代表節(jié)點(diǎn)i下載了數(shù)據(jù)塊j,E(j)代表k是否擁有數(shù)據(jù)塊j:若k擁有該數(shù)據(jù)塊,即DownloadedSameBlock(j)≠0,那么設(shè)定k.E(j)=1;否則,若DownloadedSameBlock(j)=0,那么設(shè)定k.E(j)=0;
步驟3.6.1.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序?qū)⒏鱾€數(shù)據(jù)塊的副本數(shù)目按照升序排列,然后選擇排列的首元素對應(yīng)的數(shù)據(jù)塊作為副本數(shù)目最少的數(shù)據(jù)塊,記其編號為Rarestblock;
所述步驟3.6.3進(jìn)一步包括以下具體步驟:
步驟3.6.3.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序查詢鄰居Z的數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock,獲得編號為Rarestblock的數(shù)據(jù)塊在鄰居Z的編號j2,即j2=Z.DownloadedSameBlock(Rarestblock);
步驟3.6.3.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序發(fā)送數(shù)據(jù)塊請求消息至鄰居Z,消息包含數(shù)據(jù)塊的編號j2;
步驟3.6.3.3對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序接收到鄰居Z發(fā)送的編號為j2的數(shù)據(jù)塊后,將數(shù)據(jù)塊存儲到待下載文件的第Rarestblock個塊。
本發(fā)明采用上述技術(shù)方案,具有以下有益效果:下載節(jié)點(diǎn)在繼承BitTorrent傳輸協(xié)議的同時,實(shí)現(xiàn)了跨相似文件進(jìn)行數(shù)據(jù)塊交換的功能,下載節(jié)點(diǎn)不僅與下載相同文件的其它節(jié)點(diǎn)交換數(shù)據(jù),還能從擁有相似文件的種子節(jié)點(diǎn)下載數(shù)據(jù),有效提高了數(shù)據(jù)分發(fā)的效率。
附圖說明
圖1是本發(fā)明BitTorrent系統(tǒng)的體系結(jié)構(gòu)圖
圖2是本發(fā)明總體流程圖
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合圖示對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
圖1是本發(fā)明構(gòu)建的BitTorrent數(shù)據(jù)分發(fā)系統(tǒng)的體系結(jié)構(gòu)圖,它由一個控制節(jié)點(diǎn)、一個或多個對等節(jié)點(diǎn)、一個或多個種子節(jié)點(diǎn)構(gòu)成。每個節(jié)點(diǎn)都是獨(dú)立運(yùn)行、可相互進(jìn)行網(wǎng)絡(luò)通信的計(jì)算機(jī)。該系統(tǒng)的工作原理:控制節(jié)點(diǎn)主動發(fā)現(xiàn)與對等節(jié)點(diǎn)待下載文件相似度最高的一組文件,并將擁有這些文件的種子節(jié)點(diǎn)的地址信息傳輸給對等節(jié)點(diǎn);對等節(jié)點(diǎn)向這些種子節(jié)點(diǎn)請求下載數(shù)據(jù)塊,同時從下載相同文件的其它對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn)獲取數(shù)據(jù)塊,從而顯著提升對等節(jié)點(diǎn)的下載速度。下面分別介紹每個部分。
控制節(jié)點(diǎn)負(fù)責(zé)與對等節(jié)點(diǎn)和種子節(jié)點(diǎn)交互,控制節(jié)點(diǎn)上安裝有數(shù)據(jù)傳輸控制程序。數(shù)據(jù)傳輸控制程序接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,存儲各個種子文件對應(yīng)的種子節(jié)點(diǎn)和對等節(jié)點(diǎn)的信息,以及所有的種子文件。數(shù)據(jù)傳輸控制程序接收每個對等節(jié)點(diǎn)提交的文件下載請求,選擇一組擁有相似文件的種子節(jié)點(diǎn),一組正在下載相同文件的對等節(jié)點(diǎn)以及擁有相同文件的種子節(jié)點(diǎn),并將這些節(jié)點(diǎn)與對應(yīng)的種子節(jié)點(diǎn)傳輸給發(fā)送請求消息的對等節(jié)點(diǎn)。
每個對等節(jié)點(diǎn)安裝有數(shù)據(jù)下載上傳程序。該數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息,消息包括待下載文件的名稱和種子文件信息。同時,該數(shù)據(jù)下載上傳程序讀取控制節(jié)點(diǎn)返回的種子節(jié)點(diǎn)與對等節(jié)點(diǎn)地址信息以及對應(yīng)的種子文件,存入鄰居節(jié)點(diǎn)集合,然后定期從鄰居節(jié)點(diǎn)集合請求數(shù)據(jù)塊。為了避免因?yàn)猷従庸?jié)點(diǎn)離線導(dǎo)致無法下載所有的數(shù)據(jù)塊,對等節(jié)點(diǎn)每次向鄰居請求的數(shù)據(jù)塊都是鄰居節(jié)點(diǎn)集合中副本數(shù)量最少的數(shù)據(jù)塊。
對等節(jié)點(diǎn)在從下載相同文件的對等節(jié)點(diǎn)或擁有相同文件的種子節(jié)點(diǎn)下載數(shù)據(jù)塊時,直接發(fā)送數(shù)據(jù)塊在本地文件的編號到對方節(jié)點(diǎn),對方節(jié)點(diǎn)根據(jù)請求數(shù)據(jù)塊的編號傳輸對應(yīng)的數(shù)據(jù)塊,對等節(jié)點(diǎn)直接將數(shù)據(jù)塊根據(jù)編號存入本地文件;而對等節(jié)點(diǎn)在從擁有相似文件的種子節(jié)點(diǎn)下載數(shù)據(jù)塊時,對等節(jié)點(diǎn)發(fā)送請求數(shù)據(jù)塊在對方節(jié)點(diǎn)文件的位置編號到對方節(jié)點(diǎn),對方節(jié)點(diǎn)將對應(yīng)的數(shù)據(jù)塊傳輸給對等節(jié)點(diǎn),最后對等節(jié)點(diǎn)根據(jù)數(shù)據(jù)塊在本地文件的編號,將數(shù)據(jù)塊存入對應(yīng)的位置。
每個種子節(jié)點(diǎn)也安裝有數(shù)據(jù)下載上傳程序。該數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,消息包括種子節(jié)點(diǎn)擁有的文件的名稱和種子文件。同時,該數(shù)據(jù)下載上傳程序接收對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,根據(jù)請求數(shù)據(jù)塊的編號,從文件對應(yīng)編號位置選擇數(shù)據(jù)塊,并通過網(wǎng)絡(luò)傳輸給請求該數(shù)據(jù)塊的對等節(jié)點(diǎn)。
圖2是本發(fā)明總體流程圖。具體流程如下:
第一步,構(gòu)建一個BitTorrent數(shù)據(jù)分發(fā)系統(tǒng),它由控制節(jié)點(diǎn)、對等節(jié)點(diǎn)、種子節(jié)點(diǎn)構(gòu)成,每個節(jié)點(diǎn)都是獨(dú)立運(yùn)行、可相互進(jìn)行網(wǎng)絡(luò)通信的計(jì)算機(jī)。
控制節(jié)點(diǎn)負(fù)責(zé)與對等節(jié)點(diǎn)和種子節(jié)點(diǎn)交互,控制節(jié)點(diǎn)上安裝有數(shù)據(jù)傳輸控制程序。數(shù)據(jù)傳輸控制程序接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,存儲各個種子文件對應(yīng)的種子節(jié)點(diǎn)和對等節(jié)點(diǎn)的信息,以及所有的種子文件。數(shù)據(jù)傳輸控制程序接收每個對等節(jié)點(diǎn)提交的文件下載請求,選擇一組擁有相似文件的種子節(jié)點(diǎn),一組正在下載相同文件的對等節(jié)點(diǎn)以及擁有相同文件的種子節(jié)點(diǎn),并將這些節(jié)點(diǎn)與對應(yīng)的種子節(jié)點(diǎn)傳輸給發(fā)送請求消息的對等節(jié)點(diǎn)。
每個對等節(jié)點(diǎn)安裝有數(shù)據(jù)下載上傳程序。該數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息,消息包括待下載文件的名稱和種子文件信息。同時,該數(shù)據(jù)下載上傳程序讀取控制節(jié)點(diǎn)返回的種子節(jié)點(diǎn)與對等節(jié)點(diǎn)地址信息以及對應(yīng)的種子文件,存入鄰居節(jié)點(diǎn)集合,然后定期從鄰居節(jié)點(diǎn)集合請求數(shù)據(jù)塊。為了避免因?yàn)猷従庸?jié)點(diǎn)離線導(dǎo)致無法下載所有的數(shù)據(jù)塊,對等節(jié)點(diǎn)每次向鄰居請求的數(shù)據(jù)塊都是鄰居節(jié)點(diǎn)集合中副本數(shù)量最少的數(shù)據(jù)塊。
對等節(jié)點(diǎn)在從下載相同文件的對等節(jié)點(diǎn)或擁有相同文件的種子節(jié)點(diǎn)下載數(shù)據(jù)塊時,直接發(fā)送數(shù)據(jù)塊在本地文件的編號到對方節(jié)點(diǎn),對方節(jié)點(diǎn)根據(jù)請求數(shù)據(jù)塊的編號傳輸對應(yīng)的數(shù)據(jù)塊,對等節(jié)點(diǎn)直接將數(shù)據(jù)塊根據(jù)編號存入本地文件;而對等節(jié)點(diǎn)在從擁有相似文件的種子節(jié)點(diǎn)下載數(shù)據(jù)塊時,對等節(jié)點(diǎn)發(fā)送請求數(shù)據(jù)塊在對方節(jié)點(diǎn)文件的位置編號到對方節(jié)點(diǎn),對方節(jié)點(diǎn)將對應(yīng)的數(shù)據(jù)塊傳輸給對等節(jié)點(diǎn),最后對等節(jié)點(diǎn)根據(jù)數(shù)據(jù)塊在本地文件的編號,將數(shù)據(jù)塊存入對應(yīng)的位置。
每個種子節(jié)點(diǎn)也安裝有數(shù)據(jù)下載上傳程序。該數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,消息包括種子節(jié)點(diǎn)擁有的文件的名稱和種子文件。同時,該數(shù)據(jù)下載上傳程序接收對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,根據(jù)請求數(shù)據(jù)塊的編號,從文件對應(yīng)編號位置選擇數(shù)據(jù)塊,并通過網(wǎng)絡(luò)傳輸給請求該數(shù)據(jù)塊的對等節(jié)點(diǎn)。
第二步,控制節(jié)點(diǎn)執(zhí)行數(shù)據(jù)傳輸控制程序。該數(shù)據(jù)傳輸控制程序獨(dú)立地接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,并在內(nèi)存和磁盤存儲每個種子文件對應(yīng)的所有種子節(jié)點(diǎn)地址信息。該數(shù)據(jù)傳輸控制程序獨(dú)立地接收每個對等節(jié)點(diǎn)的文件下載請求消息,選擇k個擁有最相似文件的種子節(jié)點(diǎn)地址,和k2個與對等節(jié)點(diǎn)下載相同文件的其它對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn),以及對應(yīng)的種子文件,通過網(wǎng)絡(luò)傳輸給對等節(jié)點(diǎn)。
其次,該數(shù)據(jù)傳輸控制程序獨(dú)立地接收每個對等節(jié)點(diǎn)的文件下載請求消息,提取文件下載請求消息包含的請求文件的種子文件,選擇與對等節(jié)點(diǎn)請求文件的種子文件相似度最高的k(k為正整數(shù),代表相似數(shù)據(jù)分發(fā)選擇的種子節(jié)點(diǎn)數(shù)量,k越大,種子節(jié)點(diǎn)越多,提供的數(shù)據(jù)下載資源越多,因而對等節(jié)點(diǎn)的下載速度越快,默認(rèn)情況下,k設(shè)定為5)個不同的種子文件,然后選擇k個擁有對應(yīng)完整文件的種子節(jié)點(diǎn)地址,同時選擇k2個(k2為正整數(shù),代表BitTorrent原系統(tǒng)選擇的鄰居數(shù)目,默認(rèn)情況下,k2設(shè)定為10)與發(fā)送請求的對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn),然后將這些種子文件、種子節(jié)點(diǎn)地址和對等節(jié)點(diǎn)地址通過網(wǎng)絡(luò)傳輸給發(fā)送請求消息的對等節(jié)點(diǎn)。
具體步驟如下:
2.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序接收每個種子節(jié)點(diǎn)的文件發(fā)布消息,解析文件發(fā)布消息包含的種子文件信息,并在內(nèi)存和磁盤更新種子文件對應(yīng)的種子節(jié)點(diǎn)集合信息。該信息存儲在一個字典數(shù)據(jù)結(jié)構(gòu)里面,記為種子文件字典TorrentIndexTable。例如,假設(shè)某種子文件torrent1的種子節(jié)點(diǎn)有兩個,地址分別為Seed1和Seed2,那么設(shè)定TorrentIndexTable[torrent1]={Seed1,Seed2},反之,如果種子文件字典TorrentIndexTable沒有記錄種子文件torrent1的任何種子節(jié)點(diǎn)信息,那么就設(shè)定TorrentIndexTable[torrent1]={}。具體步驟如下:
2.1.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序解析種子節(jié)點(diǎn)的文件發(fā)布消息,獲得種子節(jié)點(diǎn)的地址SeedAddress,及torrent的名稱,記為TorrentNAME。
2.1.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序更新種子文件字典TorrentIndexTable,記錄當(dāng)前所有的種子節(jié)點(diǎn)地址信息。即TorrentIndexTable[TorrentNAME]=TorrentIndexTable[TorrentNAME]∪{SeedAddress}
2.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序接收每個對等節(jié)點(diǎn)提交的文件下載請求消息,解析文件下載請求消息包含的種子文件(標(biāo)記為torrent1)信息,然后從種子文件字典TorrentIndexTable記錄的所有的種子文件中,選擇與對等節(jié)點(diǎn)的種子文件的相似度最高的k個不同的種子文件,然后利用這些種子文件查詢種子文件字典TorrentIndexTable以獲取對應(yīng)的種子節(jié)點(diǎn)。最后,選擇k2個與對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)地址和種子節(jié)點(diǎn)地址,并將這些節(jié)點(diǎn)地址及對應(yīng)的種子文件傳輸給對等節(jié)點(diǎn)。具體步驟如下:
2.2.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序查詢種子文件字典TorrentIndexTable記錄的所有的種子文件,計(jì)算種子文件字典TorrentIndexTable記錄的所有的種子文件與對等節(jié)點(diǎn)提交下載請求消息包含的種子文件的相似度。設(shè)種子文件torrent2為種子文件字典TorrentIndexTable記錄的所有的種子文件中的一個,種子文件torrent1為對等節(jié)點(diǎn)提交請求文件下載消息包含的種子文件,具體步驟如下:
2.2.1.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序讀取種子文件torrent1與torrent2的所有數(shù)據(jù)塊的哈希值,并將哈希值分別存入兩個集合S1與S2內(nèi);
2.2.1.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序計(jì)算集合S1與S2的交集S1∩S2,及集合的并集S1∪S2:S1∩S2={j|j∈S1∧j∈S2},S1∪S2={j|j∈S1∨j∈S2};
2.2.1.3控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序計(jì)算種子文件torrent1與torrent2的相似度為交集包含的數(shù)據(jù)塊的數(shù)目|S1∩S2|與并集包含的數(shù)據(jù)塊|S1∪S2|的數(shù)目的比值,即
2.2.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序按照相似度的降序排列所有種子文件,然后選擇相似度最大的k個種子文件。其中k代表用于相似文件下載的種子文件的數(shù)目。默認(rèn)值為5。如果系統(tǒng)中的相似文件比較多,k可以設(shè)置為較大的數(shù)目,以提升對等節(jié)點(diǎn)的下載速度。
2.2.3控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序根據(jù)2.2.2節(jié)選擇的種子文件查詢k個種子節(jié)點(diǎn)地址,具體步驟如下:
2.2.3.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序設(shè)定種子節(jié)點(diǎn)集合SeedSet為空;
2.2.3.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序按照相似度由大到小的順序遍歷2.2.2步驟選擇的k個種子文件,利用每個種子文件查詢種子文件字典TorrentIndexTable,獲得k個種子節(jié)點(diǎn)。具體步驟如下:
2.2.3.2.1控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序初始化索引idx為1。初始化種子節(jié)點(diǎn)地址集合SeedNodeSet為空。
2.2.3.2.2控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序從種子文件字典TorrentIndexTable讀取第idx個種子文件,標(biāo)記為torrent-idx。
2.2.3.2.3控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序利用torrent-idx查詢種子文件字典TorrentIndexTable,獲得對應(yīng)的種子節(jié)點(diǎn)地址集合,記為SeedSet1=TorrentIndexTable[torrent-i]。
2.2.3.2.3若集合SeedSet1非空,那么控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序從集合SeedSet1隨機(jī)選擇一個種子節(jié)點(diǎn)的地址,記為SeedAddress1,并存入集合SeedNodeSet,即SeedNodeSet=SeedNodeSet∪{SeedAddress1}。
2.2.3.2.4若種子集合SeedNodeSet的種子節(jié)點(diǎn)數(shù)目等于k,轉(zhuǎn)2.2.4步驟,否則,設(shè)定idx=idx+1,然后轉(zhuǎn)2.2.3.2.1步驟。
2.2.4控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序選擇k2個與對等節(jié)點(diǎn)下載相同文件的對等節(jié)點(diǎn)和擁有該文件的種子節(jié)點(diǎn)的地址信息,記為SameFileSet。
2.2.5控制節(jié)點(diǎn)的數(shù)據(jù)傳輸控制程序?qū)⒎N子集合SeedNodeSet與SameFileSet包含的種子節(jié)點(diǎn)地址信息及對應(yīng)的種子文件傳輸給對方對等節(jié)點(diǎn)。
第三步,每個對等節(jié)點(diǎn)執(zhí)行數(shù)據(jù)下載上傳程序。數(shù)據(jù)下載上傳程序負(fù)責(zé)向控制節(jié)點(diǎn)請求具有相似文件的種子節(jié)點(diǎn)地址、正在下載相同文件的對等節(jié)點(diǎn)地址和擁有相同文件的種子節(jié)點(diǎn)地址,并將這些節(jié)點(diǎn)地址存入鄰居節(jié)點(diǎn)集合。然后,每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序向本節(jié)點(diǎn)對應(yīng)的鄰居節(jié)點(diǎn)請求缺失的數(shù)據(jù)塊;同時,該程序接收其它對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,并向?qū)?yīng)的對等節(jié)點(diǎn)上傳已經(jīng)下載的數(shù)據(jù)塊。
具體步驟如下:
3.1每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序初始化下載過程。設(shè)定LeftBlock代表未下載的數(shù)據(jù)塊的數(shù)量,設(shè)定N為待下載文件的數(shù)據(jù)塊總數(shù)。設(shè)置LeftBlock的初始值為N。同時,該程序?yàn)猷従蛹系拿總€鄰居節(jié)點(diǎn)i維護(hù)一個已下載數(shù)據(jù)塊數(shù)組DownloadedBlock。DownloadedBlock數(shù)組的長度等于鄰居節(jié)點(diǎn)i所擁有文件的數(shù)據(jù)塊的數(shù)目。DownloadedBlock的各項(xiàng)初始化為0。若節(jié)點(diǎn)i擁有編號為j的數(shù)據(jù)塊,那么設(shè)定i.DownloadedBlock(j)=1,否則,設(shè)定i.DownloadedBlock(j)=0。
3.2每個對等節(jié)點(diǎn)每隔t秒請求每個鄰居節(jié)點(diǎn)i已下載的數(shù)據(jù)塊信息,更新鄰居i的已下載數(shù)據(jù)塊數(shù)組DownloadedBlock,其中,t代表兩次下載數(shù)據(jù)塊的等待時間,t為正整數(shù),通常設(shè)置為較小的數(shù)值,以快速下載所有的數(shù)據(jù)塊,因此,t的默認(rèn)值為0.1秒。
3.3每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件請求消息,消息包括待下載文件的名稱和對應(yīng)的種子文件;
3.4每個對等節(jié)點(diǎn)的數(shù)據(jù)下載上傳程序讀取控制節(jié)點(diǎn)返回的鄰居節(jié)點(diǎn)地址及對應(yīng)的種子文件,并存入鄰居節(jié)點(diǎn)集合。
3.5每個對等節(jié)點(diǎn)(記為Peer0)的數(shù)據(jù)下載上傳程序?yàn)閾碛邢嗨莆募拿總€種子節(jié)點(diǎn)維護(hù)一個數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock,記錄本節(jié)點(diǎn)和該種子節(jié)點(diǎn)的相同數(shù)據(jù)塊編號映射信息。具體步驟如下:
3.5.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序從本節(jié)點(diǎn)的鄰居節(jié)點(diǎn)集合讀取每個擁有相似文件的種子節(jié)點(diǎn)地址(記為SeedNode2)與對應(yīng)的種子文件(記為torrent2),為SeedNode2初始化一個數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock。數(shù)組DownloadedSameBlock的長度等于對等節(jié)點(diǎn)Peer0待下載文件的數(shù)據(jù)塊的總數(shù)目。DownloadedSameBlock的各項(xiàng)初始化為0。
3.5.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序計(jì)算待下載文件的數(shù)據(jù)塊的哈希值集合S1與3.5.1步驟選擇的種子節(jié)點(diǎn)SeedNode2的數(shù)據(jù)塊哈希值集合S2的交集SameBlocks,即SameBlocks={j|j∈S1∧j∈S2}。
3.5.3對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序讀取集合SameBlocks的每個數(shù)據(jù)塊的哈希值,若該數(shù)據(jù)塊在本節(jié)點(diǎn)的文件中的編號為j,在種子節(jié)點(diǎn)SeedNode2的文件的編號為j2,那么更新鄰居SeedNode2對應(yīng)的數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock(j)=j(luò)2。
3.6每個對等節(jié)點(diǎn)(記為Peer0)的數(shù)據(jù)下載上傳程序每隔t秒從鄰居節(jié)點(diǎn)集合下載一個數(shù)據(jù)塊,參數(shù)t根據(jù)步驟3.2約定取值。具體步驟如下:
3.6.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序選擇鄰居節(jié)點(diǎn)副本數(shù)目最少的數(shù)據(jù)塊。具體步驟如下:
3.6.1.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序計(jì)算鄰居節(jié)點(diǎn)集合已下載數(shù)據(jù)塊的副本數(shù)目。每個數(shù)據(jù)塊的的副本數(shù)目等于擁有該數(shù)據(jù)塊的所有鄰居的總數(shù)。設(shè)定SameSet代表正在下載相同文件的對等節(jié)點(diǎn)和擁有相同文件的種子節(jié)點(diǎn),i.DownloadedBlock(j)=1代表節(jié)點(diǎn)i下載了數(shù)據(jù)塊j,那么SameSet集合共擁有數(shù)據(jù)塊j的副本數(shù)目可表示為所有擁有數(shù)據(jù)塊j的節(jié)點(diǎn)的總數(shù),即∑i∈SameSeti.DownloadedBlock(j),其中Σ代表累加運(yùn)算符號。設(shè)定SimilarSet代表所有擁有相似文件的種子節(jié)點(diǎn)。設(shè)k.E(j)代表節(jié)點(diǎn)k是否擁有數(shù)據(jù)塊j,若k擁有該數(shù)據(jù)塊,設(shè)定k.E(j)=1;否則,設(shè)定k.E(j)=0。那么SimilarSet集合共擁有數(shù)據(jù)塊j的副本數(shù)目可表示為Σk∈SimilarSetk.E(j),。因此,編號為j的數(shù)據(jù)塊的副本總數(shù)等于
∑i∈SameSeti.DownloadedBlock(j)+Σk∈SimilarSetk.E(j)。
3.6.1.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序?qū)⒏鱾€數(shù)據(jù)塊的副本數(shù)目按照升序排列,然后選擇排列的首元素對應(yīng)的數(shù)據(jù)塊作為副本數(shù)目最少的數(shù)據(jù)塊,記其編號為Rarestblock。
3.6.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序判斷:若編號為Rarestblock對應(yīng)的鄰居和本節(jié)點(diǎn)待下載的文件相同,那么該程序向該鄰居發(fā)送一個數(shù)據(jù)塊請求消息,消息包含數(shù)據(jù)塊的編號Rarestblock。
3.6.3若3.6.2判斷不成立,即編號為Rarestblock對應(yīng)的鄰居(記為Z)和本節(jié)點(diǎn)待下載的文件不是相同文件,那么對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序計(jì)算該數(shù)據(jù)塊在鄰居Z的編號j2,并向鄰居Z請求編號為j2的數(shù)據(jù)塊,具體步驟如下:
3.6.3.1對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序查詢鄰居Z的數(shù)據(jù)塊映射數(shù)組DownloadedSameBlock,獲得編號為Rarestblock的數(shù)據(jù)塊在鄰居Z的編號j2,即j2=Z.DownloadedSameBlock(Rarestblock)。
3.6.3.2對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序發(fā)送數(shù)據(jù)塊請求消息至鄰居Z,消息包含數(shù)據(jù)塊的編號j2;
3.6.3.3對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序接收到鄰居Z發(fā)送的編號為j2的數(shù)據(jù)塊后,將數(shù)據(jù)塊存儲到待下載文件的第Rarestblock個塊。
3.6.4對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序設(shè)置待下載數(shù)據(jù)塊數(shù)目LeftBlock=LeftBlock-1。更新本節(jié)點(diǎn)已下載的數(shù)據(jù)塊編號數(shù)組DownloadedBlock(Rarestblock)=1。
3.6.5對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序判斷若待下載數(shù)據(jù)塊數(shù)目LeftBlock=0,說明已經(jīng)下載所有的數(shù)據(jù)塊,轉(zhuǎn)第四步,繼續(xù)為其它對等節(jié)點(diǎn)上傳數(shù)據(jù)塊;否則,對等節(jié)點(diǎn)Peer0的數(shù)據(jù)下載上傳程序休眠t秒,t秒間隔結(jié)束后轉(zhuǎn)3.6.1,繼續(xù)下載剩余的數(shù)據(jù)塊,參數(shù)t根據(jù)步驟3.2約定取值。
第四步,每個種子節(jié)點(diǎn)執(zhí)行數(shù)據(jù)下載上傳程序。數(shù)據(jù)下載上傳程序向控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息。同時,數(shù)據(jù)下載上傳程序接收系統(tǒng)中的對等節(jié)點(diǎn)的數(shù)據(jù)塊下載請求,并向?qū)Φ裙?jié)點(diǎn)上傳指定的數(shù)據(jù)塊。
具體步驟如下:
4.1種子節(jié)點(diǎn)SeedNode0的數(shù)據(jù)下載上傳程序選擇本地磁盤的一個名稱為F的文件的種子文件,向控制節(jié)點(diǎn)發(fā)送文件發(fā)布消息,并傳輸文件F對應(yīng)的種子文件到控制節(jié)點(diǎn);
4.2種子節(jié)點(diǎn)SeedNode0的數(shù)據(jù)下載上傳程序持續(xù)監(jiān)聽對等節(jié)點(diǎn)的數(shù)據(jù)塊請求消息,讀取消息包含的數(shù)據(jù)塊的編號j,從本地文件選擇編號為j的數(shù)據(jù)塊,并通過網(wǎng)絡(luò)傳輸給對方節(jié)點(diǎn)。
以上對本發(fā)明所提供的基于相似文件協(xié)同的BitTorrent數(shù)據(jù)分發(fā)系統(tǒng)及方法進(jìn)行了詳細(xì)介紹,本具體實(shí)施方式中應(yīng)用了具體個例對本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。