eMule協(xié)議的DHT算法
BT協(xié)議和eMule協(xié)議在算法中有著一些差異,導(dǎo)致兩者的使用是無法兼容的。那么我們?nèi)绾慰紤]這算法的差異呢?首先還是讓我們了解一下兩協(xié)議中的DHT算法。DHT的全稱是Distributed Hash Table,即分布式哈希表技術(shù),是一種分布式存儲(chǔ)方法。這種網(wǎng)絡(luò)不需要中心節(jié)點(diǎn)服務(wù)器,而是每個(gè)客戶端負(fù)責(zé)一個(gè)小范圍的路由,并負(fù)責(zé)存儲(chǔ)一小部分?jǐn)?shù)據(jù),從而實(shí)現(xiàn)整個(gè)DHT網(wǎng)絡(luò)的尋址和存儲(chǔ)。和中心節(jié)點(diǎn)服務(wù)器不同,DHT網(wǎng)絡(luò)中的各節(jié)點(diǎn)并不需要維護(hù)整個(gè)網(wǎng)絡(luò)的信息,而是只在節(jié)點(diǎn)中存儲(chǔ)其臨近的后繼節(jié)點(diǎn)信息,幅減少了帶寬的占用和資源的消耗。DHT網(wǎng)絡(luò)還在與關(guān)鍵字最接近的節(jié)點(diǎn)上復(fù)制備份冗余信息,避免了單一節(jié)點(diǎn)失效問題。我們可以把整個(gè)DHT網(wǎng)絡(luò)想象成一個(gè)城市,那么每個(gè)客戶端,就好比城市里各個(gè)角落的地圖,上面繪制了附近區(qū)域的地形情況,把這些地圖一匯總,城市的全貌就出來了。
而DHT所采用的算法中最出名的是Kademlia,eMule最早開始使用,Bitcomet、Azureus和BitTorrent只是步其后塵,同樣使用Kademlia算法的DHT。不過它們各自的實(shí)現(xiàn)協(xié)議不盡相同,因此不能相互兼容(BitComet與BitTorrent兼容,Azureus更像eMule,但與其它都不兼容)。
在2005年5月著名的BiTtorrent在4.0版實(shí)現(xiàn)基于Kademlia協(xié)議的DHT技術(shù)后,很快國內(nèi)的BitComet和BitSpirit也實(shí)現(xiàn)了和BitTorrent兼容的DHT技術(shù),實(shí)現(xiàn)trackerless下載方式。eMule協(xié)議實(shí)現(xiàn)的基于Kademlia類似的技術(shù)(BT中叫DHT,eMule中叫Kad),和BT軟件使用的Kd技術(shù)的區(qū)別在于key、value和node ID的計(jì)算方法不同。
對(duì)于BT協(xié)議,目前國內(nèi)用戶使用最多的BT客戶端就是Bitcomet,默認(rèn)情況下,無須做任何設(shè)置BitComet即可自動(dòng)連接并使用DHT網(wǎng)絡(luò)。啟動(dòng)軟件,它會(huì)使用和TCP端口號(hào)相同的UDP端口進(jìn)行DHT網(wǎng)絡(luò)連接。任何P2P技術(shù)的改進(jìn)都與版權(quán)的博奕脫不了干系,DHT網(wǎng)絡(luò)能夠引起如此注目亦是如此。
確實(shí),BT采用DHT網(wǎng)絡(luò)后,反盜版將變得更加困難。因?yàn)樵诖酥埃脩暨M(jìn)行BT下載時(shí),必需首先連接上Tracker服務(wù)器,根據(jù)所獲得的正在進(jìn)行下載和上傳的用戶列表,才能夠進(jìn)行正常的文件交換。這樣的話,只需封禁掉提供Tracker服務(wù)的網(wǎng)站,便可以截?cái)啾I版?zhèn)鞑サ耐緩?。DHT網(wǎng)絡(luò)則不同,由于此時(shí)互聯(lián)網(wǎng)中任何一個(gè)運(yùn)行BT客戶端的用戶都可以作為DHT網(wǎng)絡(luò)中的節(jié)點(diǎn),因此即使封禁掉那些提供Tracker服務(wù)的網(wǎng)站,用戶還是能夠通過全球范圍的邏輯DHT網(wǎng)絡(luò)分享文件,反盜版就無從談起。除非讓上的人都不上網(wǎng),或宣布使用BT軟件為重罪。但技術(shù)從來都是一把雙刃劍。在批判BT助長盜版氣焰的同時(shí),我們也應(yīng)該看到,BT也正在日漸成為合法作品傳播的途徑。由于無法承受超量流量的訪問,一些免費(fèi)和共享軟件(如Foobar2000等)開始采用BT方式分發(fā)型的合法軟件——Linux系統(tǒng),更是將BT作為主要的分發(fā)渠道。
在eMule協(xié)議中也有使用,常把它叫做KAD,只不過具體實(shí)現(xiàn)的協(xié)議有所不同。Kad網(wǎng)絡(luò)的主要的目標(biāo)是做到不需要服務(wù)器和改善可量測(cè)性。相對(duì)于傳統(tǒng)的ed2k服務(wù)器只能處理一定數(shù)量的使用者(我們?cè)诜?wù)器列表也都看到了,每個(gè)服務(wù)器都有最多人數(shù)限制),而且如果服務(wù)器連接人數(shù)過多,還會(huì)嚴(yán)重的的拖垮網(wǎng)絡(luò)。傳統(tǒng)的ed2k網(wǎng)絡(luò)需要服務(wù)器支持作為中轉(zhuǎn)和存儲(chǔ)hash列表信息,kad可以不通過服務(wù)器同樣完成ed2k網(wǎng)絡(luò)的一切功能。Kad需要UDP端口的支持,之后Emule會(huì)自動(dòng)按照客戶端的要求,來判斷它能否自由連線,然后同樣也會(huì)分配一個(gè)id,這個(gè)過程和ed2k的高id和低id檢查很像,不過這個(gè)id所代表的意義不同于ed2k網(wǎng)絡(luò),它代表一個(gè)是否“ly”的狀態(tài)。
Kad能夠自我組織,并且自我調(diào)節(jié)***的使用者數(shù)量以及他們的連接效果。因此,它更能使網(wǎng)絡(luò)的損失達(dá)到最小。由于具備了以上所敘述的功能,Kad也被稱之為Serverless network(無服務(wù)器網(wǎng)絡(luò))。雖然目前一直處于開發(fā)階段(alpha stage) 。通過進(jìn)行Kad關(guān)鍵字搜尋,任何人可以在文件分享網(wǎng)絡(luò)中尋找資料。沒有任何中央服務(wù)器儲(chǔ)存文件索引,這項(xiàng)工作是平均由所有客戶端擔(dān)當(dāng):擁有要分享的文件的枝節(jié)點(diǎn),會(huì)先處理文件的內(nèi)容,并從內(nèi)容計(jì)算出一組雜湊Hash值,這組值將會(huì)在分享網(wǎng)絡(luò)中辨識(shí)這個(gè)文件。kad網(wǎng)絡(luò)首先給每個(gè)客戶分配一個(gè)唯一的ID值,然后對(duì)不同的ID值進(jìn)行異或來得到兩個(gè)客戶之間的“距離”,kad會(huì)維護(hù)一個(gè)桶,“距離”越近的用戶桶里的數(shù)量會(huì)越多,kad定期對(duì)桶里的用戶進(jìn)行清理,以保持其有效性。
對(duì)于文件和用戶eMule協(xié)議會(huì)有兩個(gè)這樣的結(jié)構(gòu),可以通過kad來查找文件和文件相關(guān)的用戶信息;同樣為了考慮冗余的問題,kad會(huì)將其自身的信息復(fù)制一份給“距離”它最近的一定數(shù)量的用戶,這樣就算在它下線后,這些信息也不會(huì)丟失。Kad本身有一個(gè)nodes.dat文件,也叫做節(jié)點(diǎn)文件,這里面存放了我們?cè)贙ad網(wǎng)絡(luò)中的鄰居節(jié)點(diǎn),我們都是通過這些節(jié)點(diǎn)來進(jìn)入Kad網(wǎng)絡(luò)的,相當(dāng)于Bt下載中通過router來加入DHT網(wǎng)絡(luò)。
注:在eMule協(xié)議具體的實(shí)現(xiàn)過程中,采用的ID是28bit。例如:找到用戶小則是通過將用戶id異或的方式,兩個(gè)id的二進(jìn)位異或值決定他們之間的邏輯距離,如00距離0要比距離00近。那么當(dāng)一個(gè)用戶加入kad后,首先通過一個(gè)已知的用戶找到一批用戶的id和ip地址和端口。當(dāng)該用戶要尋找一個(gè)特定用戶A的時(shí)候,該用戶先詢問幾個(gè)已知的邏輯距離較A較近的用戶,如B用戶,C用戶,D用戶,B,C,D會(huì)告訴該用戶他們知道的更加近的用戶的id和ip地址和端口,同理類推,這個(gè)用戶最終就能找到A。所以尋找的次數(shù)會(huì)在logN數(shù)量級(jí),這里N代表詢問的人數(shù)。
最令人遺憾的是BT和eMule中的DHT算法無法互通和兼容!
注:在Kad網(wǎng)絡(luò)中,系統(tǒng)存儲(chǔ)的數(shù)據(jù)以對(duì)形式存放。在BT的DHT實(shí)現(xiàn)中,其key值為torrent文件的info_hash串,其value值則和torrent文件有密切關(guān)系。