日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

dht 爬虫 java_[C#搜片神器] 之P2P中DHT网络爬虫原理

發(fā)布時間:2024/8/1 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dht 爬虫 java_[C#搜片神器] 之P2P中DHT网络爬虫原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

昨天由于開源的時候沒有注意運(yùn)行環(huán)境,直接沒有考慮下載BT種子文件時生成子文件夾,可能導(dǎo)致有的朋友運(yùn)行沒有結(jié)果,在此表示對支持開源的朋友道謙.另外也對源程序增加了一些說明,已經(jīng)提交.

個人電腦編譯環(huán)境是WIN7+VS2005,如果程序運(yùn)行出錯,請自行下載代碼進(jìn)行編譯.

先說下運(yùn)行方法:

1)有固定IP的朋友可以試試H31DHT.exe數(shù)據(jù)抓取程序,會獲取一些數(shù)據(jù),如果>2小時還沒有數(shù)據(jù)返回,直接說明不是固定IP的返回數(shù)據(jù)很少;

2)直接從http://torrage.com/sync下載幾個文本文件回來,放到程序目錄下,H31DHTMgr程序會自動遍歷這個文件夾取HASH文件,

存儲到數(shù)據(jù)庫中,如果將此網(wǎng)站的200多萬數(shù)據(jù)(個人估計的)全部下載成功,那也可以搜索很多內(nèi)容了.

3)新程序界面如下:需要的自己下載源代碼進(jìn)行編譯(VS2005),不提供EXE下載,希望大家感興趣的一起開源下;

[增加了復(fù)制磁鏈接和下載選中項目的代碼,之前只能查看,不能顯示.]

--------------------先來點大家感興趣的東西-------------------------------------

大家可能問目前的程序采用什么方法下載BT種子的比較關(guān)心,下面就自己的體會給大家說說:

DHT磁力種子其實就是20字節(jié)的HASH值,這個值可以直接從很多網(wǎng)站下載種子,舉例子說明:

比如說上一篇文件中有那么多HASH值的字符串,怎么利用呢,比如有個HASH值13ce77b3b934b12dc77fded6646426a6db5c3428,有40位,因為在內(nèi)存里面占用20位,顯示為16進(jìn)制所以顯示為40位了;

有這個HASH值,我們可以加上磁頭magnet:?xt=urn:btih:???? 兩個合在一起就可以下載BT種子了,

當(dāng)然需要使用BT工具,(magnet:?xt=urn:btih:13ce77b3b934b12dc77fded6646426a6db5c3428)復(fù)制試下.

但我們的程序沒有使用BT協(xié)議去下載,而是通過別人的網(wǎng)站下載.

會提示找不到這個種子,那就說明這個網(wǎng)站沒有收集到最新的BT種子.

可以從其它網(wǎng)站下載,大家可以去看下源程序里面的組合方法.

-------------------------下面介紹一些從網(wǎng)上收集的資料信息----------------------------------------------

DHT網(wǎng)絡(luò)爬蟲基于DHT網(wǎng)絡(luò)構(gòu)建了一個P2P資源搜索引擎。這個搜索引擎不但可以用于構(gòu)建DHT網(wǎng)絡(luò)中活躍的資源索引(活躍的資源意味著該網(wǎng)絡(luò)中肯定有人至少持有該資源的部分?jǐn)?shù)據(jù)),還可以分析出該網(wǎng)絡(luò)中的熱門分享資源。網(wǎng)絡(luò)上其實也有其他人做了類似的應(yīng)用:DHTmonitoring,Crawling Bittorrent DHT

DHT/Magnet/Torrent

在P2P網(wǎng)絡(luò)中,要通過種子文件下載一個資源,需要知道整個P2P網(wǎng)絡(luò)中有哪些計算機(jī)正在下載/上傳該資源。這里將這些提供某個資源下載的計算機(jī)定義為peer。傳統(tǒng)的P2P網(wǎng)絡(luò)中,存在一些tracker服務(wù)器,這些服務(wù)器的作用主要用于跟蹤某個資源有哪些關(guān)聯(lián)的peer。下載這個資源當(dāng)然得首先取得這些peer。

DHT的出現(xiàn)用于解決當(dāng)tracker服務(wù)器不可用時,P2P客戶端依然可以取得某個資源的peer。DHT解決這個問題,是因為它將原來tracker上的資源peer信息分散到了整個網(wǎng)絡(luò)中。這里將實現(xiàn)了DHT協(xié)議的計算機(jī)定義為節(jié)點(node)。通常一個P2P客戶端程序既是peer也是節(jié)點。DHT網(wǎng)絡(luò)有多種實現(xiàn)算法,例如Kademlia。

當(dāng)某個P2P客戶端通過種子文件下載資源時,如果沒有tracker服務(wù)器,它就會向DHT網(wǎng)絡(luò)查詢這個資源對應(yīng)的peer列表。資源的標(biāo)識在DHT網(wǎng)絡(luò)中稱為infohash,是一個20字節(jié)長的字符串,一般通過sha1算法獲得,也就是一個類似UUID的東西。

實際上,種子文件本身就對應(yīng)著一個infohash,這個infohash是通過種子文件的文件描述信息動態(tài)計算得到。一個種子文件包含了對應(yīng)資源的描述信息,例如文件名、文件大小等。Magnet,這里指的是磁力鏈接,它是一個類似URL的字符串地址。P2P軟件通過磁力鏈接,會下載到一個種子文件,然后根據(jù)該種子文件繼續(xù)真實資源的下載。

磁力鏈接中包含的最重要的信息就是infohash。這個infohash一般為40字節(jié)或32字節(jié),它其實只是資源infohash(20字節(jié))的一種編碼形式。

Kademlia

各種DHT的實現(xiàn)算法,不論是Chord, Pastry還是Kademlia,其最直接的目標(biāo)就是以最快的速度來定位到期望的節(jié)點,在P2P文件分享應(yīng)用中則是以最快的速度來查找到正在分享某一文件/種子的peers列表信息。因為每個節(jié)點都是分布式存在于地球的任何角落,如果用地理距離來衡量兩節(jié)點間的距離則可能給計算帶來極大復(fù)雜性甚至不可能進(jìn)行衡量,因此基本所有的DHT算法都是采用某種邏輯上的距離,在Kademlia則采用簡單的異或計算來衡量兩節(jié)點間的距離,它和地理上的距離沒有任何關(guān)系,但卻具備幾何公式的絕大特征:

(1)節(jié)點和它本身之間的異或距離是0

(2)異或距離是對稱的:即從A到B的異或距離與從B到A的異或距離是等同的

(3)異或距離符合三角形不等式:給定三個頂點A B C,假如AC之間的異或距離最大,那么AC之間的異或距離必小于或等于AB異或距離和BC異或距離之和.

(4)對于給定的一個距離,距離A只存在有唯一的一個節(jié)點B,也即單向性,在查找路徑上也是單向的,這個和地理距離不同。

Kademlia中規(guī)定所有的節(jié)點都具有一個節(jié)點ID,該節(jié)點ID的產(chǎn)生方法和種子文件中的info hash采用相同算法:即sha-1(安全hash算法),因此每個節(jié)點的id,以及每個共享文件/種子的info-hash都是唯一的,并且都是20個字符160bits位組成。兩個節(jié)點間的距離就是兩個節(jié)點id的異或結(jié)果,節(jié)點離鍵值(種子)的距離為該節(jié)點的id和該種子文件的info-hash的異或結(jié)果。Kademlia在異或距離度量的基礎(chǔ)上又把整個DHT網(wǎng)絡(luò)拓?fù)浣M織成一個二叉前綴樹(XuanWu系統(tǒng)中arp的實現(xiàn)則是一個例子),所有的節(jié)點(所有的正在運(yùn)行的,并且開取了DHT功能的Bt,Btspilits應(yīng)用)等作為該二叉前綴樹的葉子節(jié)點,可以想象這棵二叉樹可以容納多達(dá)2128個葉子(節(jié)點),這足以組織任何規(guī)模的網(wǎng)絡(luò)了。對于每個節(jié)點來說按照離自己的遠(yuǎn)近區(qū)域又可以把這棵樹劃分為160棵子樹,每一個子樹和該節(jié)點都有一個共同的前綴,共同前綴越少離得越遠(yuǎn)。如下圖所示:

(注意:上圖只是一個劃分子樹的例子,節(jié)點都沒有位于同一層的葉子上面)

以上圖紅色節(jié)點位例0011位例,它可以把其他的節(jié)點劃分位4棵不同子樹,離自己越近子樹和自己有越長的公共前綴,如果節(jié)點是均勻分布則離自己越近的子樹含有的葉子節(jié)點更少(兄弟只有一個即和自己有159個共同前綴的那個)。因為節(jié)點都位于該樹最底層的葉子位置,水平看上去則所有的葉子都在一條線上,如果把這條線當(dāng)作2128空間的每一個點,則更能體現(xiàn)上面的劃分特性(折半拆分)。為了能快速到達(dá)這160棵子樹,處于DHT網(wǎng)絡(luò)中的每一個節(jié)點都記錄了每棵子樹上的k個節(jié)點的信息(ip,port,id),在BT中K固定為8,比如上圖中紅色節(jié)點就可能保存有最左邊子樹的8個葉子節(jié)點信息,當(dāng)然靠近自己的子樹可能沒有8個葉子,則把所有當(dāng)前存在的葉子記錄上去,這份記錄信息在Kademlia算法中叫作K桶,也叫作“路由表”,當(dāng)然這個“路由表”的信息和我們IP路由的含義有點不同,它代表的是為了到達(dá)處于距離自己某范圍[ 2i— 2i+1 )的節(jié)點,可以通過該范圍內(nèi)的選取的k個節(jié)點來進(jìn)一步定位.

Kademlia是DHT網(wǎng)絡(luò)的一種實現(xiàn)。網(wǎng)絡(luò)上關(guān)于這個算法的文章,主要是圍繞整個DHT網(wǎng)絡(luò)的實現(xiàn)原理進(jìn)行論述。個人覺得這些文章很蛋疼,基本上讀了之后對于要如何去實現(xiàn)一個DHT客戶端還是沒有概念。這里主要可參考P2P中DHT網(wǎng)絡(luò)介紹,以及BitTorrent網(wǎng)站上的DHT協(xié)議描述

Kad的主要目的是用于查詢某個資源對應(yīng)的peer列表,而這個peer列表實際上是分散在整個網(wǎng)絡(luò)中。網(wǎng)絡(luò)中節(jié)點數(shù)量很大,如果要獲得peer列表,最簡單的做法無非就是依次詢問網(wǎng)絡(luò)中的每個節(jié)點。這當(dāng)然不可行。所以在Kad算法中,設(shè)立了一個路由表。每一個節(jié)點都有一份路由表。這個是按照節(jié)點之間的距離關(guān)系構(gòu)建出來的。節(jié)點之間的距離當(dāng)然也有特定的算法定義,在Kad中通過對兩個節(jié)點的ID進(jìn)行異或操作得到。節(jié)點的ID和infohash通過相同算法構(gòu)建,都是20字節(jié)長度。節(jié)點和infohash之間也有距離關(guān)系,實際上表示的是節(jié)點和資源的距離關(guān)系。

有了這個路由表之后,再通過一個基于距離關(guān)系的查找算法,就可以實現(xiàn)不用挨個遍歷就找到特定的節(jié)點。而查找資源peer這個操作,正是基于節(jié)點查找這個過程。

路由表的實現(xiàn),按我的理解,有點類似一般的hash表結(jié)構(gòu)。在這個表中有160個桶,稱為K桶,這個桶的數(shù)量在實現(xiàn)上可以動態(tài)增長。每個桶保存有限個元素,例如K取值為8,指的就是這個桶最多保存8個元素。每個元素就是一個節(jié)點,節(jié)點包含節(jié)點ID、地址信息以及peer信息。這些桶可以通過距離值索引得到,即距離值會經(jīng)過一個hash算法,使其值落到桶的索引范圍內(nèi)。

要加入一個DHT網(wǎng)絡(luò),需要首先知道這個網(wǎng)絡(luò)中的任意一個節(jié)點。如何獲得這個節(jié)點?在一些開源的P2P軟件中,會提供一些節(jié)點地址,例如transmission中提供的dht.transmissionbt.com:6881。

kademlia的消息:

為了實現(xiàn)上面的“路由表”建立,刷新,獲取peers-list,保存peers-list這些功能,kademlia定義四個最基本的KRPC操作:

(1)ping操作,作用是探測一個節(jié)點,用以判斷該節(jié)點是否仍然在線。

(2)store操作,作用是通知一個節(jié)點存儲一個對,以便以后查詢需要。

(3)find_node操作,作用是從自己的“路由表”對應(yīng)的K桶中返回k個節(jié)點信息(IP address,UDP port,Node ID)給發(fā)送者

(4)find_value 操作,作用是把info-hash作為參數(shù),如果本操作接收者正好存儲了info-hash的peers則返回peers list,否則從自己的“路由表“中返回離info-hash更近的k個節(jié)點信息(同find_node過程)。

上面只是最基本的操作,一次nodes或者info-hash的查找lookup過程則需要節(jié)點進(jìn)行若干次上面的find操作的,一個遞歸查找的過程。利用上面的操作更精確的描述一次一個節(jié)點x要查找ID值為t 的節(jié)點, 過程如下:

1、 計算到t 的距離:d(x,y) = x⊕y

2、 從x 的第[㏒ d]個K 桶中取出α 個節(jié)點的信息(各個實現(xiàn)α值不一樣,有些是3有些則等于k值),同時進(jìn)行FIND_NODE 操作。如果這個K 桶中的信息少于α 個,則從附近多個桶中選擇距離最

接近d 的總共α個節(jié)點。

3、 對接受到查詢操作的每個節(jié)點,如果發(fā)現(xiàn)自己就是t,則回答自己是最接近t 的。否則測量自己和t 的距離,并從自己對應(yīng)的K 桶中選擇α 個節(jié)點的信息給x。

4、 X 對新接受到的每個節(jié)點都再次執(zhí)行FIND_NODE 操作,此過程不斷重復(fù)執(zhí)行,直到

每一個分支都有節(jié)點響應(yīng)自己是最接近t 的,或者說FIND_NODE操作返回的節(jié)點值沒有都已經(jīng)被查找過了,即找不到更近的節(jié)點了。

5、 通過上述查找操作,x 得到了k 個最接近t 的節(jié)點信息。

注意:這里用“最接近”這個說法,是因為ID 值為t 的節(jié)點不一定存在網(wǎng)絡(luò)中,也就是說t 沒有分配給任何一臺電腦。

查找peers-list的過程則換成find_value動作,但注意前文提到的區(qū)別即可以有類似的描述。

-----------------------------------------------------------------------------

協(xié)議

Kad定義了節(jié)點之間的交互協(xié)議。這些協(xié)議支撐了整個DHT網(wǎng)絡(luò)里信息分布式存儲的實現(xiàn)。這些協(xié)議都是使用UDP來傳送。其協(xié)議格式使用一種稱為bencode的編碼方式來編碼協(xié)議數(shù)據(jù)。bencode是一種文本格式的編碼,它還用于種子文件內(nèi)的信息編碼。

Kad協(xié)議具體格式可參考BitTorrent的定義:DHT Protocol。這些協(xié)議包括4種請求:ping,find_node,get_peer,announce_peer。在有些文檔中這些請求的名字會有不同,例如announce_peer又被稱為store,get_peer被稱為find_value。這4種請求中,都會有對應(yīng)的回應(yīng)消息。其中最重要的消息是get_peer,其目的在于在網(wǎng)絡(luò)中查找某個資源對應(yīng)的peer列表。

值得一提的是,所有這些請求,包括各種回應(yīng),都可以用于處理該消息的節(jié)點構(gòu)建路由表。因為路由表本質(zhì)就是存儲網(wǎng)絡(luò)中的節(jié)點信息。

ping

用于確定某個節(jié)點是否在線。這個請求主要用于輔助路由表的更新。

find_node

用于查找某個節(jié)點,以獲得其地址信息。當(dāng)某個節(jié)點接收到該請求后,如果目標(biāo)節(jié)點不在自己的路由表里,那么就返回離目標(biāo)節(jié)點較近的K個節(jié)點。這個消息可用于節(jié)點啟動時構(gòu)建路由表。通過find_node方式構(gòu)建路由表,其實現(xiàn)方式為向DHT網(wǎng)絡(luò)查詢自己。那么,接收該查詢的節(jié)點就會一直返回其他節(jié)點了列表,查詢者遞歸查詢,直到無法查詢?yōu)橹?。那?#xff0c;什么時候無法繼續(xù)查詢呢?這一點我也不太清楚。每一次查詢得到的都是離目標(biāo)節(jié)點更接近的節(jié)點集,那么理論上經(jīng)過若干次遞歸查詢后,就無法找到離目標(biāo)節(jié)點更近的節(jié)點了,因為最近的節(jié)點是自己,但自己還未完全加入網(wǎng)絡(luò)。這意味著最后所有節(jié)點都會返回空的節(jié)點集合,這樣就算查詢結(jié)束?

實際上,通過find_node來構(gòu)建路由表,以及順帶加入DHT網(wǎng)絡(luò),這種方式什么時候停止在我看來并不重要。路由表的構(gòu)建并不需要在啟動時構(gòu)建完成,在以后與其他節(jié)點的交互過程中,路由表本身就會慢慢地得到構(gòu)建。在初始階段盡可能地通過find_node去與其他節(jié)點交互,最大的好處無非就是盡早地讓網(wǎng)絡(luò)中的其他節(jié)點認(rèn)識自己。

get_peer

通過資源的infohash獲得資源對應(yīng)的peer列表。當(dāng)查詢者獲得資源的peer列表后,它就可以通過這些peer進(jìn)行資源下載了。收到該請求的節(jié)點會在自己的路由表中查找該infohash,如果有收錄,就返回對應(yīng)的peer列表。如果沒有,則返回離該infohash較近的若干個節(jié)點。查詢者若收到的是節(jié)點列表,那么就會遞歸查找。這個過程同find_node一樣。

值得注意的是,get_peer的回應(yīng)消息里會攜帶一個token,該token會用于稍后的announce_peer請求。

announce_peer

該請求主要目的在于通知,通知其他節(jié)點自己開始下載某個資源。這個消息用于構(gòu)建網(wǎng)絡(luò)中資源的peer列表。當(dāng)一個已經(jīng)加入DHT網(wǎng)絡(luò)的P2P客戶端通過種子文件開始下載資源時,首先在網(wǎng)絡(luò)中查詢該資源的peer列表,這個過程通過get_peer完成。當(dāng)某個節(jié)點從get_peer返回peer時,查詢者開始下載,然后通過announce_peer告訴返回這個peer的節(jié)點。

announce_peer中會攜帶get_peer回應(yīng)消息里的token。關(guān)于這一點,我有一個疑問是,在P2P中DHT網(wǎng)絡(luò)介紹文檔中提到:

(announce_peer)同時會把自己的peer信息發(fā)送給先前的告訴者和自己K桶中的k個最近的節(jié)點存儲該peer-list信息

不管這里提到的K的最近的節(jié)點是離自己最近,還是離資源infohash最近的節(jié)點,因為處理announce_peer消息時,有一個token的驗證過程。但是這K個節(jié)點中,并沒有在之前創(chuàng)建對應(yīng)的token。我通過transmission中的DHT實現(xiàn)做了個數(shù)據(jù)收集,可以證明的是,announce_peer消息是不僅僅會發(fā)給get_peer的回應(yīng)者的。

------------------------------------------------------------------------------------

DHT爬蟲

DHT爬蟲是一個遵循Kad協(xié)議的假節(jié)點程序。

這個爬蟲的實現(xiàn)方式,主要包含以下內(nèi)容:

通過其他節(jié)點的announce_peer發(fā)來的infohash確認(rèn)網(wǎng)絡(luò)中有某個資源可被下載

通過從網(wǎng)絡(luò)中獲取這個資源的種子文件,來獲得該資源的描述

通過累計收集得到的資源信息,就可以提供一個資源搜索引擎,或者構(gòu)建資源統(tǒng)計信息。以下進(jìn)一步描述實現(xiàn)細(xì)節(jié)。整個爬蟲的實現(xiàn)依賴了一個很重要的信息,那就是資源的infohash實際上就是一個磁力鏈接(當(dāng)然需要包裝一下數(shù)據(jù))。這意味著一旦我們獲得了一個infohash,我們就等于獲得了一個種子。

獲得資源通知

當(dāng)爬蟲程序加入DHT網(wǎng)絡(luò)后,它總會收到其他節(jié)點發(fā)來的announce_peer消息。announce_peer消息與get_peer消息里都帶了資源的infohash,但是get_peer里的infohash對應(yīng)的資源在該網(wǎng)絡(luò)中不一定存在,即該資源沒有任何可用peer。而announce_peer則表示已經(jīng)確認(rèn)了該網(wǎng)絡(luò)中有節(jié)點正在下載該資源,也即該資源的數(shù)據(jù)確實存在該網(wǎng)絡(luò)中。

所以,爬蟲程序需要盡最大努力地獲取其他節(jié)點發(fā)來的announce_peer消息。如果announce_peer消息會發(fā)送給離消息發(fā)送節(jié)點較近的節(jié)點,那么,一方面,爬蟲程序應(yīng)該將自己告訴網(wǎng)絡(luò)中盡可能多的節(jié)點。這可以通過一次完整的find_node操作實現(xiàn)。另一方面,爬蟲程序內(nèi)部實現(xiàn)可以部署多個DHT節(jié)點,總之目的在于盡可能地讓爬蟲程序稱為其他節(jié)點的較近者。

當(dāng)收集到infohash之后,爬蟲程序還需要通過該infohash獲得對應(yīng)資源的描述信息。

獲取資源信息

獲得資源描述信息,其實就是通過infohash獲得對應(yīng)的種子文件。這需要實現(xiàn)P2P協(xié)議里的文件分享協(xié)議。種子文件的獲取其實就是一個文件下載過程,下載到種子文件之后,就可以獲取到資源描述。這個過程一種簡單的方法,就是從infohash構(gòu)建出一個磁力鏈接,然后交給一個支持磁力下載的程序下載種子。

從infohash構(gòu)建出磁力鏈接非常簡單,只需要將infohash編碼成磁力鏈接的xt字段即可,構(gòu)建實現(xiàn)可以從transmission源碼里找到.

現(xiàn)在你就可以做一個實驗,在transmission的DHT實現(xiàn)中,在announce_peer消息的處理代碼中,將收到的infohash通過上面的appendMagnet轉(zhuǎn)換為磁力鏈接輸出到日志文件里。然后,可以通過支持磁力鏈接的程序(例如QQ旋風(fēng))直接下載。有趣的是,當(dāng)QQ旋風(fēng)開始下載該磁力鏈接對應(yīng)的種子文件時,你自己的測試程序能收到QQ旋風(fēng)程序發(fā)出的announce_peer消息。當(dāng)然,你得想辦法讓這個測試程序盡可能地讓其他節(jié)點知道你,這可以通過很多方式實現(xiàn)。

UPDATE

通過詳細(xì)閱讀transmission里的DHT實現(xiàn),一些之前的疑惑隨之解開。

announce_peer會發(fā)給哪些節(jié)點

在一次對infohash的查詢過程中,所有對本節(jié)點發(fā)出的get_peer作出回應(yīng)的節(jié)點(不論這個回應(yīng)節(jié)點回應(yīng)的是nodes還是peers),當(dāng)本節(jié)點取得peer信息時,就會對所有這些節(jié)點發(fā)出announce_peer。get_peer的回應(yīng)消息里,不論是peer還是node,都會攜帶一個token,這樣在將來收到對方的announce_peer時,就可以驗證該token。

節(jié)點和bucket狀態(tài)

在本地的路由表中,保存的node是有狀態(tài)之分的。狀態(tài)分為三種:good/dubious/bad。good節(jié)點基本可以斷定該節(jié)點是一個在線的并且可以正常回應(yīng)消息的節(jié)點;而bad節(jié)點則是可確定的無效節(jié)點,通常會盡快從路由表中移除;而dubious則是介于good和bad節(jié)點之間,表示可能有問題的節(jié)點,需要進(jìn)一步發(fā)送例如ping消息來確認(rèn)其狀態(tài)。路由表中應(yīng)該盡可能保證保存的是good節(jié)點,對查詢消息的回應(yīng)里也需攜帶好的節(jié)點。

bucket也是有狀態(tài)的,當(dāng)一個bucket中的所有節(jié)點在一定時間之內(nèi)都沒有任何活動的時候,該bucket則應(yīng)該考慮進(jìn)行狀態(tài)的確認(rèn),確認(rèn)方式可以隨機(jī)選擇該bucket中的節(jié)點進(jìn)行find_node操作(這也是find_node除了用于啟動之外的唯一作用,但具體實現(xiàn)不見得使用這種方式)。沒有消息來往的bucket則應(yīng)該考慮移除。DHT中幾乎所有操作都會涉及到bucket的索引,如果索引到一個所有節(jié)點都有問題的bucket,那么該操作可能就無法完成。

search在何時停止

首先,某次發(fā)起的search,無論是對node還是對peer,都可能導(dǎo)致進(jìn)一步產(chǎn)生若干個search。這些search都是基于transaction id來標(biāo)識的。由一次search導(dǎo)致產(chǎn)生的所有子search都擁有相同的transaction id,以使得在該search成功或失敗時可以通過該transaction id來刪除對應(yīng)的所有search。transaction id也就是DHT中每個消息消息頭”t”的值。

但是search何時停止?transmission中是通過超時機(jī)制來停止。在search過程中,如果長時間沒有收到跟該search關(guān)聯(lián)的節(jié)點發(fā)來的回應(yīng)消息,那么就撤銷該search,表示搜索失敗。

參考資料

---------------------------------------------------------

再告訴大家一個神奇的方法

有了HASH值可以去 ? 試下是否可以播放等功能,輸入magnet:?xt=urn:btih:13ce77b3b934b12dc77fded6646426a6db5c3428就可以播放了;

另外求服務(wù)器進(jìn)行程序測試,需要有固定IP,10G的WIN服務(wù)器空間,h31h31@163.com,謝謝.

ps:本人開源程序的目的只是大家交流,如果有什么違法的行為與本人無關(guān).

希望大家多多推薦哦...大家的推薦才是下一篇介紹的動力...

總結(jié)

以上是生活随笔為你收集整理的dht 爬虫 java_[C#搜片神器] 之P2P中DHT网络爬虫原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。