新聞中心
去年10月份開始研究相關(guān)的協(xié)議與資料,中途亂七八糟的事情差點(diǎn)沒堅(jiān)持下來,寒假里修修補(bǔ)補(bǔ)上禮拜把Btbook發(fā)布了,經(jīng)過社交網(wǎng)絡(luò)的推廣之后,上線第三天UV就達(dá)到了兩萬多,也算是對這幾個(gè)月工作的一點(diǎn)肯定吧。

如果你想下載對應(yīng)的文件,電腦里面需要安裝一款支持磁力鏈接的軟件,例如迅雷,QQ旋風(fēng),BitComet等。
DHT Protocal
一個(gè)種子主要包含元信息(文件標(biāo)題、文件大小、文件列表等)和Tracker服務(wù)器信息,每當(dāng)一個(gè)用戶想要下載一個(gè)文件,客戶端會先詢問Tracker服務(wù)器,目前有哪些電腦正在下載這個(gè)文件,這些電腦被稱為“peer”,然后客戶端會向這些peer分別請求文件的各個(gè)片段,等每個(gè)片段都下載完成之后再組合成一個(gè)完整的文件,至此整個(gè)下載過程完畢。
由此可見,Tracker服務(wù)器相當(dāng)于提供了一種“路由”服務(wù),在整個(gè)下載過程中揮舞著指揮棒。但近年來由于打擊盜版等原因,一些Tracker服務(wù)器開始陸續(xù)關(guān)閉,沒有Tracker用戶還怎么用種子下載文件呢?后來bt協(xié)議進(jìn)行了擴(kuò)充,添加了DHT(Distributed Hash Table) ,它把Tracker的路由服務(wù)分散到了BT網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn),那么一個(gè)種子由哪個(gè)或哪些節(jié)點(diǎn)負(fù)責(zé)路由服務(wù)呢?
首先,每個(gè)種子都有一個(gè)對應(yīng)的20字節(jié)的hash,這個(gè)hash有sha1算法得到,每個(gè)節(jié)點(diǎn)也有一個(gè)20字節(jié)的id,通常是隨機(jī)的20字節(jié)。如果這時(shí)有兩個(gè)節(jié)點(diǎn)A和B,怎么判斷這個(gè)種子放在A好還是B好呢?通過Kademlia算法計(jì)算種子hash和節(jié)點(diǎn)id的異或值(稱為距離),異或值最小(距離最近)的那個(gè)節(jié)點(diǎn)更適合提供這個(gè)種子的路由。
那整個(gè)網(wǎng)絡(luò)之間的節(jié)點(diǎn)是如何進(jìn)行溝通的呢?根據(jù)DHT Protocal,主要有四種請求:ping,find_node,get_peers,announce_peer。這四種消息其實(shí)都是字典類型,要經(jīng)過B編碼之后才能被對方正確的處理,使用UDP協(xié)議進(jìn)行發(fā)送,這四種請求都會影響自己維護(hù)的一張路由表。
路由表
路由表主要用于存儲跟自己打過交道的節(jié)點(diǎn)信息,節(jié)點(diǎn)信息包含IP、Port和節(jié)點(diǎn)ID信息。而路由表由一個(gè)個(gè)的吊桶(Bucket)組成,在這里我簡稱它為“桶”。每個(gè)桶只能存儲一定節(jié)點(diǎn)ID在一定范圍的節(jié)點(diǎn)信息,并且桶的容量有限,一般規(guī)定一個(gè)桶只能存儲8個(gè)節(jié)點(diǎn)。起初路由表里面只有1個(gè)桶,這個(gè)桶能存儲的節(jié)點(diǎn)ID范圍在2^0至2^160,也就是任何節(jié)點(diǎn)它都能保存,等這個(gè)桶滿了之后怎么辦?——分裂。例如桶(min, max)分裂為兩個(gè)桶后,兩個(gè)桶能保存的范圍分別為(min, max/2), (max/2, max),原先的那個(gè)桶里面的8個(gè)節(jié)點(diǎn)也要重新分配到分裂后的兩個(gè)桶中。
偉大的毛主席說過,只要有一撥人,就分左中右。節(jié)點(diǎn)也是這樣,分為good、questionable和bad,“good”指過去15分鐘內(nèi)該節(jié)點(diǎn)跟我有過聯(lián)系,如果15分鐘內(nèi)該節(jié)點(diǎn)沒有跟我聯(lián)系過,它會變成“questionable”狀態(tài),客戶端就會向它發(fā)出幾個(gè)ping,如果沒有收到回應(yīng),它就變?yōu)椤癰ad”,可以把它從路由表中刪除。
KPRC Protocal
1. ping
注意這里的ping,不是你用cmd黑框框里面的ping。這個(gè)請求主要用戶詢問對方是否在線,比較簡單,主要用于維護(hù)自己路由表里面的節(jié)點(diǎn)。
2. find_node
顧名思義,find_node就是為了查詢節(jié)點(diǎn),它根據(jù)對方節(jié)點(diǎn)的id詢問DHT網(wǎng)絡(luò),收到這個(gè)請求的節(jié)點(diǎn),會把自己路由表中與該節(jié)點(diǎn)距離最接近的8個(gè)節(jié)點(diǎn)返回。
3. get_peers
get_peers用于查找一個(gè)資源hash對應(yīng)的peer,它詢問路由表中與該hash最接近的8節(jié)點(diǎn),收到該請求的節(jié)點(diǎn)如果發(fā)現(xiàn)自己知道對應(yīng)的peer,返回這些peer的信息,否則返回它自己路由表中跟該hash最近的8個(gè)節(jié)點(diǎn)信息。發(fā)起get_peers的節(jié)點(diǎn)在收到peer信息了,則跟peer建立連接,正式開始下載文件片段。如果收到的是節(jié)點(diǎn)信息,則選出這些節(jié)點(diǎn)中跟hash最近的幾個(gè)節(jié)點(diǎn),遞歸的get_peers,直到發(fā)現(xiàn)peer。有兩種情況要控制這種遞歸的返回:1. 超時(shí),在一定時(shí)間內(nèi)如果沒有發(fā)現(xiàn)peer,則放棄。2. 已經(jīng)發(fā)現(xiàn)了跟該hash最近的節(jié)點(diǎn),但它沒有peer信息。
4. announce_peer
announce_peer用于在自己get_peers發(fā)現(xiàn)peers之后發(fā)送,發(fā)送的對象是先前回復(fù)過自己get_peers的節(jié)點(diǎn),告訴對方自己發(fā)現(xiàn)了peer,你們也可以“備份”一下,減小整個(gè)網(wǎng)絡(luò)查詢該hash的次數(shù)。
磁力鏈接
以前一個(gè)種子對應(yīng)一個(gè)文件,現(xiàn)在一個(gè)hash對應(yīng)一個(gè)文件,通過hash構(gòu)造的磁力鏈接就可以下載一個(gè)文件。磁力鏈接的構(gòu)造方式如下:
- magnet:?xt=urn:btih:{hash}
磁力鏈接中的hash就是一個(gè)40個(gè)字符組成的字符串,由20字節(jié)的hash計(jì)算得來:
- public static string ToHexString(byte[] hash)
- {
- var sb = new StringBuilder();
- foreach (var b in bytes)
- {
- sb.Append(b.ToString("X2"));
- }
- return sb.ToString();
- }
例如構(gòu)造了一個(gè)磁力鏈接:magnet:?xt=urn:btih:EAE833FFE5A06B42B9B8C3F239660B537579C8A3 ,用迅雷打開后,迅雷就會下載對應(yīng)的種子,然后下載該資源。
Btbook是什么
Btbook主要由DHT網(wǎng)絡(luò)爬蟲,種子下載分析器,一個(gè)搜索網(wǎng)站組成。
DHT網(wǎng)絡(luò)爬蟲用一些“交友策略”,例如我可以遞歸的find_node,盡可能多的認(rèn)識DHT網(wǎng)絡(luò)中的節(jié)點(diǎn),讓自己加入到對方的路由表中。剩下的事情就是等待對方的請求,所有的請求都正常的給予回復(fù),對于announce_peer請求,則記錄下資源的hash,交給種子下載分析器處理。
種子下載分析器通過hash下載對應(yīng)的種子文件,從種子文件中獲取文件標(biāo)題、文件列表、文件大小等元信息,保存到索引文件中。
搜索網(wǎng)站用ASP.NET MVC搭建,用于處理用戶的搜索,對用戶的搜索內(nèi)容進(jìn)行分詞,對一些敏感詞匯進(jìn)行過濾,從索引文件中獲取標(biāo)題與搜索內(nèi)容最匹配的結(jié)果,默認(rèn)按資源的創(chuàng)建時(shí)間進(jìn)行排序,突出“新”。
因?yàn)檎麄€(gè)過程是實(shí)時(shí)的,一旦網(wǎng)絡(luò)中有人分享了東西被我捕獲的話,我就能發(fā)現(xiàn)這個(gè)資源,所以一些最新的資源往往都能被索引,是“追劇者”的神器。
使用Btbook
如果你用電腦訪問btbook,你的電腦安裝了支持磁力鏈接的軟件即可。如果你使用的是移動設(shè)備,你可以安裝迅雷手機(jī)版之類的軟件(“手雷”),把btbook添加進(jìn)收藏,在手雷中打開btbook,就可以直接在手機(jī)中下載文件了。Btbook的網(wǎng)址是:http://btbook.net/ ,考慮了移動版瀏覽器兼容性,have fun!
目前服務(wù)器配置較低,如果有園友有帶寬較好的VPS,愿意幫助提高btbook體驗(yàn)的話,請與我聯(lián)系。
原文鏈接:http://www.cnblogs.com/technology/p/btbook.html
分享名稱:用.NET開發(fā)的磁力搜索引擎:Btbook.net
分享路徑:http://m.fisionsoft.com.cn/article/dpcoipi.html


咨詢
建站咨詢
