這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
之前看到 lantern 這個十分火的翻牆工具,其利用了P2P的思想,就想瞭解一下P2P相關的協議。看了下最流行的BT協議官方文檔,就產生了實現BT協議的想法,順便根據協議實現了一個BT種子嗅探器。
也有人將BT種子嗅探器稱為BT種子爬蟲,個人覺得其行為特性和傳統的web爬蟲相差較大,反而和嗅探器很類似,因此暫且稱之為BT種子嗅探器吧。
接下來將寫一系列文章來介紹其原理和具體實現方式。這篇文章先提綱挈領,介紹其工作原理,以對全域有一個把握。後序的文章再介紹具體細節。
背景知識
在講原理之前首先你得具備BitTorrent(簡稱BT)協議的一些基本知識,以便於理解接下來要講的嗅探器。BT協議其實是一個協議簇,BEP-3 是其基本協議內容,其他的大部分都是圍繞這個來進行擴充或補充。要想從BT網路中下載一個資源,必須具備以下部分:
種子檔案(也就是我們常說的種子,尾碼是 .torrent,本質上是一個由bencode編碼的文字檔,其把資源分成很多虛擬塊,並記錄每個塊的hash值,另外上面還記錄著其他資訊,比如檔案大小、名字、Tracker伺服器等)
BT用戶端(需要有專門解析BT協議的程式,這樣才能下載,比如迅雷,電驢)
Tracker伺服器 (記錄著peer和種子相關資訊,起著中心調控的作用)
下載資源的時候,用戶端首先根據bencode(bencode是BT協議中的編碼方式)解碼種子檔案,得到Tracker伺服器的地址和資源資訊,通過和Tracker伺服器溝通得到其他已經下載該資源的peers資訊(其他已經擁有該資源的用戶端或者發布該資源的人),然後再和這些peers溝通得到自己想要的部分,即互連有無。由於把檔案分成很多塊來同時從不同的地方下載,這也就是為什麼BT通常下載快的原因。
DHT協議
通過上面我們知道,Tracker伺服器在資源下載的過程中起著至關重要的作用,只有通過它我們才能得到其他peers的資訊,才能夠下載,但這同時也成了BT協議的一個弱點,如果Tracker伺服器掛掉了或者被封被屏蔽,整個網路也就癱瘓了。由於一些資源都是有著作權的,還有一些資源是限制級的,比如色情資源,Tracker伺服器很容易被迫關閉或被牆。後來聰明的人類發明了另外一種協議,就是 Distributed hash table, 簡稱DHT,這個協議就是用來彌補這個弱點的。
BT協議簇中的DHT協議 是基於 Kademlia協議 建立的,其基本思想很好理解。DHT 由很多節點群組成,每個節點儲存一張表,表裡邊記錄著自己的好友節點。當你向一個節點A查詢另外一個節點B的資訊的時候,A就會查詢自己的好友表,如果裡邊包含B,那麼A就返回B的資訊,否則A就返回距離B距離最近的k個節點。然後你再向這k個節點重新查詢B的資訊,這樣迴圈一直到查詢到B的資訊,查詢到B的資訊後你應該向之前所有查詢過的節點發個通知,告訴他們,你有B的資訊。
舉個例子,比如我現在想要Angelababy的號(額…我要幹嘛),我就從自己的好友中挑出k個最可能認識她的人,然後依次問他們有沒有Angelababy的號,假如其中一個認識,那麼他就會給我Angelababy的號,我也就不繼續問其他人了。假如他不認識,他就給我推薦k個他好友中最有可能認識Angelababy的k個人,然後我再繼續這k個人,就這樣迴圈一直到我問到為止。OK,現在我已經得到了Angelababy的號,我就會告訴之前所有我問過的人,我有Angelababy的號。
當用戶端下載資源的時候,他會利用上述方式尋找peers資訊,這樣每個人都充當了Tracker的作用,也就解決了上面那個問題。
嗅探器原理
終於到核心部分了。
BT種子嗅探器就是利用了DHT協議得到peer資訊後會向他之前查詢過的節點發送通知這一點,這就是嗅探器的核心。
剩下的工作就是我們要讓更多的節點發給我們通知。那麼如何讓更多的節點發給我們通知呢?
這就是BT種子嗅探器的原理,簡單吧 :)
種子下載器
在BT網路中,通過上述原理收到資訊並不是種子,而是發送訊息者的ip和port、種子infohash(可以理解為種子的id)。我們如果想要得到種子的話,還需要做一番工作。這裡涉及到另外一個非常重要的協議 BEP-09,BEP-09規定了如何通過種子infohash得到種子。
這裡不鋪開講,僅說下大致過程。首先同我們收到的訊息裡邊的 ip:port 建立TCP串連,然後發送握手訊息,並告知對方自己支援BEP-09協議,然後向對方請求種子的資訊,收到對方返回的種子資訊後,依次或同時請求每一個塊。最有所有塊收集完後,對其進行拼接並通過sha1演算法計算其infohash,如果和我們請求的infohash值相同則儲存起來,否則丟掉。
應用
這樣你可以得到非常多的種子資訊,你可以對其進行索引建立自己的BT種子搜尋引擎,建立自己的海盜灣。但你需要注意著作權問題和色情資源問題。
最後
https://github.com/shiyanhui/dht 這個是Go實現的一個BT種子嗅探器,你可以參照一下其具體實現,喜歡這篇文章的話就到github上給個Star唄。
http://bthub.io 是基於上面這個嗅探器寫的一個BT種子搜尋引擎。
有任何問題可以在這裡提問:https://github.com/shiyanhui/...
關注我的公眾號,及時獲得下一篇推送。