BT下載技術(shù)解析

三次技術(shù)升級

男性的成長,總會伴隨著信息搜集能力的升級旱易。以我為例禁偎,從兒時的懵懂無知,到少年時的初嘗禁果阀坏,再到現(xiàn)在的深藏功與名如暖,一路走來,在下載某類型視頻上經(jīng)歷了三次重大的技術(shù)升級忌堂。這三次技術(shù)升級堪比人類歷史上的三次工業(yè)革命盒至,在漫漫黑夜中點(diǎn)亮了我的生命,讓我漸漸發(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)它不是一個直接可讀的文本文件。事實(shí)上摄狱,種子文件經(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下載完成后校驗(yàn)是否出錯图贸。
  • name:必須字段蹂季,如果是單一文件,表示為文件名疏日;如果是多文件偿洁,表示所在的文件夾名稱。
  • length: 單一文件的情況下必須存在沟优,多文件情況下沒有此字段涕滋,表示文件的大小。
  • files:多文件情況下必須存在挠阁,單一文件下沒有此字段宾肺,這是一個文件列表,列表中的每一項(xiàng)又包含兩個必須字段: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ù),但實(shí)際上這些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ū)分怀偷。

實(shí)際上家厌,磁力鏈創(chuàng)建的下載任務(wù)第一步是根據(jù)磁力鏈中的infohash找到種子的元數(shù)據(jù)。這一步也是BT嗅探的關(guān)鍵一步椎工,很多種子搜索引擎的核心也是圍繞這個過程實(shí)現(xiàn)饭于。各個BT下載軟件一般有兩種實(shí)現(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é)點(diǎn)中纽门,因此需要找到當(dāng)前正在做種的Peer節(jié)點(diǎn)。

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悠夯,但同時集中式的特點(diǎn)使得系統(tǒng)魯棒性不好癌淮,一旦tracker服務(wù)器出現(xiàn)故障,整個下載也就不可持續(xù)了沦补。

DHT

DHT全稱叫分布式哈希表(Distributed Hash Table)乳蓄,是一種分布式存儲方法。在不需要服務(wù)器的情況下夕膀,每個客戶端負(fù)責(zé)一個小范圍的路由虚倒,并負(fù)責(zé)存儲一小部分?jǐn)?shù)據(jù),從而實(shí)現(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來驗(yàn)證擦囊。當(dāng)整個文件下載完成之后违霞,還需要校驗(yàn)整個文件正確性,一旦校驗(yàn)不通過瞬场,會導(dǎo)致部分piece重新下載买鸽,這也就是為什么有時候進(jìn)度會長時間卡在99%的地方。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贯被,一起剝皮案震驚了整個濱河市眼五,隨后出現(xiàn)的幾起案子妆艘,更是在濱河造成了極大的恐慌,老刑警劉巖看幼,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批旺,死亡現(xiàn)場離奇詭異,居然都是意外死亡诵姜,警方通過查閱死者的電腦和手機(jī)汽煮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棚唆,“玉大人暇赤,你說我怎么就攤上這事∠瑁” “怎么了鞋囊?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞎惫。 經(jīng)常有香客問我溜腐,道長,這世上最難降的妖魔是什么微饥? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任逗扒,我火速辦了婚禮古戴,結(jié)果婚禮上欠橘,老公的妹妹穿的比我還像新娘。我一直安慰自己现恼,他們只是感情好肃续,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叉袍,像睡著了一般始锚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喳逛,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天瞧捌,我揣著相機(jī)與錄音,去河邊找鬼润文。 笑死姐呐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的典蝌。 我是一名探鬼主播曙砂,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骏掀!你這毒婦竟也來了鸠澈?” 一聲冷哼從身側(cè)響起柱告,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笑陈,沒想到半個月后际度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡新锈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年甲脏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹笆。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡块请,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拳缠,到底是詐尸還是另有隱情墩新,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布窟坐,位于F島的核電站海渊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哲鸳。R本人自食惡果不足惜臣疑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徙菠。 院中可真熱鬧讯沈,春花似錦、人聲如沸婿奔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萍摊。三九已至挤茄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冰木,已是汗流浹背穷劈。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踊沸,地道東北人歇终。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像雕沿,于是被迫代替她去往敵國和親练湿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容