BT下載技術(shù)解析

三次技術(shù)升級

男性的成長,總會伴隨著信息搜集能力的升級。以我為例,從兒時的懵懂無知,到少年時的初嘗禁果,再到現(xiàn)在的深藏功與名,一路走來,在下載某類型視頻上經(jīng)歷了三次重大的技術(shù)升級。這三次技術(shù)升級堪比人類歷史上的三次工業(yè)革命,在漫漫黑夜中點亮了我的生命,讓我漸漸發(fā)現(xiàn)絢麗多彩的人生。

好了,下面言歸正傳,閑話少敘,敲黑板,正式進(jìn)入BT知識的學(xué)習(xí)。

BT介紹

BT全稱BitTorrent,是一個分布式文件協(xié)議。區(qū)別于傳統(tǒng)的HTTP/FTP下載,HTTP/FTP一般采用C/S架構(gòu),client需要從server下載文件數(shù)據(jù),而BT是一種P2P協(xié)議,client在下載的同時,也承擔(dān)著server的角色,把下載好的數(shù)據(jù)提供給其他client下載。這樣文件源可以支持大量的用戶進(jìn)行下載,而只帶來適當(dāng)?shù)呢?fù)載的增長。

HTTP/FTP下載 vs BT下載

BT下載分為三步,下面我就這三個步驟詳細(xì)講解BT下載的細(xì)節(jié)。

  1. 創(chuàng)建下載任務(wù)
  2. 尋找peer
  3. 下載文件

創(chuàng)建下載任務(wù)

在BT下載軟件中,使用種子文件或者磁力鏈接創(chuàng)建下載任務(wù)。

種子

種子就是后綴為torrent的文件,網(wǎng)上所說的留圖不留種,菊花萬人捅就是指的它。文件發(fā)布者在發(fā)布文件之前會根據(jù)發(fā)布文件生成一個種子文件,種子中包含著發(fā)布文件的詳細(xì)信息。下載者拿到種子文件之后,就可以創(chuàng)建BT下載任務(wù)。用文本編輯器打開種子文件,你會發(fā)現(xiàn)它不是一個直接可讀的文本文件。事實上,種子文件經(jīng)過bencode編碼,bencode編碼很簡單,有興趣的同學(xué)可以通過這篇博客來詳細(xì)了解bencode的詳細(xì)細(xì)節(jié)。用torrent file editor打開種子文件,可以很直觀地讀取種子包含的下載信息。

種子詳情

種子字段:

  • info:必須字段,一個描述torrent文件的字典,有兩種可能形式,一種是沒有目錄結(jié)構(gòu)的單一文件,一種是有目錄結(jié)構(gòu)的多文件。
  • announce:必須字段,tracker服務(wù)器的地址URL。
  • announce-list:,可選字段,tracker服務(wù)器列表,這是官方規(guī)范的一個擴(kuò)展,向后兼容,可用來存儲備用服務(wù)器列表。
  • comment:可選字段,一些備注信息。
  • create date:可選字段,torrent文件的創(chuàng)建時間,為Unix時間戳。
  • created by:可選字段,說明torrent文件是由哪個程序創(chuàng)建的。

info字段(又叫做種子的元數(shù)據(jù) meta data):

  • piece length:必須字段,每個piece的長度。
  • pieces:必須字段,20字節(jié)的SHA1散列值,每塊(piece)一個,用于BT下載完成后校驗是否出錯。
  • name:必須字段,如果是單一文件,表示為文件名;如果是多文件,表示所在的文件夾名稱。
  • length: 單一文件的情況下必須存在,多文件情況下沒有此字段,表示文件的大小。
  • files:多文件情況下必須存在,單一文件下沒有此字段,這是一個文件列表,列表中的每一項又包含兩個必須字段:path表示文件路徑,length表示文件大小。

以上只是最基本的字段,不同的種子制作工作都會添加不同的擴(kuò)展字段。某雷客戶端打開種子文件后的任務(wù)創(chuàng)建列表就是展示的種子元數(shù)據(jù)。

某雷下載任務(wù)

磁力鏈接

類似于magnet:?xt=urn:btih:AD28CACBAEA04BAD181685740D251D76E2EBA37A的鏈接我們叫做磁力鏈接,它是通過種子文件內(nèi)容的Hash結(jié)果生成一個純文本的數(shù)字指紋。磁力鏈接中的四十位16進(jìn)制字符串AD28CACBAEA04BAD181685740D251D76E2EBA37A稱之為infohash,是由種子元數(shù)據(jù)(info字段)經(jīng)過hash算法成成得到。很多BT工具都支持磁力鏈接創(chuàng)建下載任務(wù),但實際上這些BT下載工具必須根據(jù)磁力鏈接生成種子文件,然后再根據(jù)種子文件去下載。每個種子文件可以生成一個唯一的磁力鏈接,相比于種子文件,磁力鏈接更小,很容易在互聯(lián)網(wǎng)上傳播,而且也更容易避開各個網(wǎng)站的審核,因此磁力鏈接被老司機(jī)們廣泛接納。

種子轉(zhuǎn)換為磁力鏈接代碼如下:

# 利用bencode和hashlib
import bencode
import hashlib

torrent = open('/path/to/torrent', 'rb').read()
torrent_data= bencode.bdecode(torrent)
metadata= bencode.bencode(torrent_data['info'])
digest = hashlib.sha1(metadata).digest()
print 'magnet:?xt=urn:btih:%s' % digest.encode('hex')

# 利用libtorrent
import libtorrent
torrent_info = libtorrent.torrent_info('/path/to/torrent')
print 'magnet:?xt=urn:btih:%s' % torrent_info.info_hash()

在某雷里面,如果先用種子創(chuàng)建一個下載任務(wù),再用種子生成的磁力鏈創(chuàng)建一個下載任務(wù),第二次創(chuàng)建的任務(wù)某雷會提示任務(wù)已存在,說明無論是磁力鏈創(chuàng)建的下載還是種子創(chuàng)建的下載,某雷會認(rèn)為是同一種類型的下載,而且每個下載任務(wù)會以唯一的infohash做區(qū)分。

實際上,磁力鏈創(chuàng)建的下載任務(wù)第一步是根據(jù)磁力鏈中的infohash找到種子的元數(shù)據(jù)。這一步也是BT嗅探的關(guān)鍵一步,很多種子搜索引擎的核心也是圍繞這個過程實現(xiàn)。各個BT下載軟件一般有兩種實現(xiàn)方式:建立種子倉庫和DHT網(wǎng)絡(luò)。以某雷為例,某雷有一個海量的種子倉庫,并給客戶端提供了根據(jù)infohash下載的接口,用wireshark抓包可以得到包文信息,只不過內(nèi)容經(jīng)過加密,有想法的同學(xué)可以洗洗睡了。第二種方式是通過DHT網(wǎng)絡(luò),我會在下面詳細(xì)講解DHT,只不過這種方式速度偏慢,并且無法保證成功。

尋找peer

要下載文件數(shù)據(jù)存儲在peer節(jié)點中,因此需要找到當(dāng)前正在做種的Peer節(jié)點。

Peer

簡單理解,peer就是當(dāng)前正在做種的BT客戶端。舉個例子,A和B都在下載Aquaman,而C和D正在為這個文件做種,那么B、C、D都是A的peer,它們都可以為A提供下載數(shù)據(jù)。如何快速地找到自己的peer,是評價一個下載客戶端好壞的關(guān)鍵。目前有兩種方式獲取peer列表:使用tracker服務(wù)器和使用trackerless DHT網(wǎng)絡(luò)兩種方式。

tracker

種子文件中的announce和announce-list字段就是tracker的服務(wù)地址,tracker會維護(hù)種子正在活躍的peer列表。BT客戶端在使用種子文件創(chuàng)建下載任務(wù)后,會把自己注冊到tracker的活躍peer列表中,同時請求得到其他活躍的peer列表,之后BT客戶端就可以和peer通信,下載文件數(shù)據(jù)。這種方式可以快速為BT客戶端找到正在活躍的peer,但同時集中式的特點使得系統(tǒng)魯棒性不好,一旦tracker服務(wù)器出現(xiàn)故障,整個下載也就不可持續(xù)了。

DHT

DHT全稱叫分布式哈希表(Distributed Hash Table),是一種分布式存儲方法。在不需要服務(wù)器的情況下,每個客戶端負(fù)責(zé)一個小范圍的路由,并負(fù)責(zé)存儲一小部分?jǐn)?shù)據(jù),從而實現(xiàn)整個DHT網(wǎng)絡(luò)的尋址和存儲。

下載文件

peer之間的通信協(xié)議又稱為peer wire protocal,即peer連線協(xié)議,它是一個基于TCP協(xié)議的應(yīng)用層協(xié)議。協(xié)議以piece為單位傳輸數(shù)據(jù),peice的大小由種子的piece length字段定義,每個piece是否傳輸正確通過種子中的piece hash來驗證。當(dāng)整個文件下載完成之后,還需要校驗整個文件正確性,一旦校驗不通過,會導(dǎo)致部分piece重新下載,這也就是為什么有時候進(jìn)度會長時間卡在99%的地方。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容