前言
之前看到 lantern 這個十分火的翻墻工具,其利用了P2P的思想,就想了解一下P2P相關的協議。看了下最流行的BT協議官方文檔,就產生了實現BT協議的想法,順便根據協議實現了一個BT種子嗅探器。
也有人將BT種子嗅探器稱為BT種子爬蟲,個人覺得其行為特性和傳統的web爬蟲相差較大,反而和嗅探器很類似,因此暫且稱之為BT種子嗅探器吧。
接下來將寫一系列文章來介紹其原理和具體實現方式。這篇文章先提綱挈領,介紹其工作原理,以對全局有一個把握。后序的文章再介紹具體細節。
背景知識
在講原理之前首先你得具備(簡稱BT)協議的一些基本知識,以便于理解接下來要講的嗅探器。BT協議其實是一個協議簇,BEP-3 是其基本協議內容,其他的大部分都是圍繞這個來進行擴展或補充。要想從BT網絡中下載一個資源,必須具備以下部分:
下載資源的時候,客戶端首先根據bencode(bencode是BT協議中的編碼方式)解碼種子文件,得到Tracker服務器的地址和資源信息,通過和Tracker服務器溝通得到其他已經下載該資源的peers信息(其他已經擁有該資源的客戶端或者發布該資源的人),然后再和這些peers溝通得到自己想要的部分,即互通有無。由于把文件分成很多塊來同時從不同的地方下載,這也就是為什么BT通常下載快的原因。
DHT協議
通過上面我們知道,Tracker服務器在資源下載的過程中起著至關重要的作用,只有通過它我們才能得到其他peers的信息,才能夠下載,但這同時也成了BT協議的一個弱點,如果Tracker服務器掛掉了或者被封被屏蔽,整個網絡也就癱瘓了。由于一些資源都是有版權的,還有一些資源是限制級的,比如色情資源,Tracker服務器很容易被迫關閉或被墻。后來聰明的人類發明了另外一種協議,就是 hash table, 簡稱DHT,這個協議就是用來彌補這個弱點的。
BT協議簇中的DHT協議 是基于 協議 建立的,其基本思想很好理解。DHT 由很多節點組成,每個節點保存一張表,表里邊記錄著自己的好友節點。當你向一個節點A查詢另外一個節點B的信息的時候,A就會查詢自己的好友表,如果里邊包含B,那么A就返回B的信息,否則A就返回距離B距離最近的k個節點。然后你再向這k個節點再次查詢B的信息,這樣循環一直到查詢到B的信息,查詢到B的信息后你應該向之前所有查詢過的節點發個通知,告訴他們,你有B的信息。
舉個例子,比如我現在想要的微信號(額…我要干嘛),我就從自己的微信好友中挑出k個最可能認識她的人,然后依次問他們有沒有的微信號,假如其中一個認識,那么他就會給我的微信號,我也就不繼續問其他人了。假如他不認識,他就給我推薦k個他微信好友中最有可能認識的k個人,然后我再繼續這k個人,就這樣循環一直到我問到為止。OK,現在我已經得到了的微信號,我就會告訴之前所有我問過的人,我有的微信號。
當客戶端下載資源的時候,他會利用上述方式查找peers信息,這樣每個人都充當了Tracker的作用,也就解決了上面那個問題。
嗅探器原理
終于到核心部分了。
BT種子嗅探器就是利用了DHT協議得到peer信息后會向他之前查詢過的節點發送通知這一點,這就是嗅探器的核心。
剩下的工作就是我們要讓更多的節點發給我們通知。那么如何讓更多的節點發給我們通知呢?
這就是BT種子嗅探器的原理,簡單吧 :)
種子下載器
在BT網絡中,通過上述原理收到信息并不是種子,而是發送消息者的ip和port、種子(可以理解為種子的id)。我們如果想要得到種子的話,還需要做一番工作。這里涉及到另外一個非常重要的協議 BEP-09,BEP-09規定了如何通過種子得到種子。
這里不鋪開講,僅說下大致過程。首先同我們收到的消息里邊的 ip:port 建立TCP連接,然后發送握手消息,并告知對方自己支持BEP-09協議,然后向對方請求種子的信息,收到對方返回的種子信息后,依次或同時請求每一個塊。最有所有塊收集完后,對其進行拼接并通過sha1算法計算其,如果和我們請求的值相同則保存起來,否則丟掉。
應用
這樣你可以得到非常多的種子信息,你可以對其進行索引建立自己的BT種子搜索引擎,建立自己的海盜灣。但你需要注意版權問題和色情資源問題。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。