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