一步一步教你寫BT種子嗅探器之一---原理篇

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

之前看到 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資訊後會向他之前查詢過的節點發送通知這一點,這就是嗅探器的核心。

剩下的工作就是我們要讓更多的節點發給我們通知。那麼如何讓更多的節點發給我們通知呢?

  • 我們要不斷的查詢自己的好友節點表,並對返回回來的節點進行查詢,這樣才會有更多的人認識我們

  • 別人向我們查詢Target的時候,我們要偽裝成Target的好友,返回結果裡邊包括自己,這樣會有更多被查詢、收到通知的機會

這就是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/...

關注我的公眾號,及時獲得下一篇推送。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.