Torrent 文件图文解析
Torrent文件格式分析
首先。我在網(wǎng)上找一個(gè)近期比較流行的大片《環(huán)太平洋》的torrent文件。通過(guò)用UE把它打開(kāi)。我們來(lái)看一下此torrent文件的內(nèi)容:
d8:announce39:http://tracker.bestxl.com:8077/announce13:announce-listll39:http://tracker.bestxl.com:8077/announceel30:http://tracker.prq.to/announceee8:codepagei936e13:creationdatei1381766089e4:infod5:filesld6:lengthi202e4:pathl40:本片簡(jiǎn)單介紹,海報(bào),截圖等,雙擊進(jìn)入查看.urle10:path.utf-8l58:鏈?墖綆€浠嬶紝嫻鋒姤錛屾埅鍥劇瓑錛屽弻鍑昏繘鍏ユ煡鐪?urleed6:lengthi275e4:pathl37:飛鳥(niǎo)網(wǎng)-和浪子一起來(lái)開(kāi)心農(nóng)場(chǎng)偷菜吧.urle10:path.utf-8l53:椋為笩緗?
鍜屾氮瀛愪竴璧鋒潵寮€蹇?jī)鍐滃満鍋疯彍鍚?urleed6:lengthi266e4:pathl45:飛鳥(niǎo)娛樂(lè)-邊看電影邊學(xué)英語(yǔ),娛樂(lè)學(xué)習(xí)兩不誤.urle10:path.utf-8l65:椋為笩濞變箰-杈圭湅鐢?shù)濯?jiǎng)杈瑰?鑻辮?錛屽ū涔愬?涔?fàn)涓や笉?.urleed6:lengthi2640e4:pathl37:飛鳥(niǎo)娛樂(lè)論壇-超多最新爆爽資源下載.rtfe10:path.utf-8l53:椋為笩濞變箰璁哄潧-瓚呭?鏈€鏂扮垎鐖借祫婧愪笅杞?rtfeed6:lengthi288e4:pathl45:飛鳥(niǎo)娛樂(lè)原創(chuàng)IMDBTOP250經(jīng)典大片一網(wǎng)打盡.urle10:path.utf-8l59:椋為笩濞變箰鍘熷垱IMDBTOP250緇忓吀澶х墖涓€緗戞墦灝?urleed6:lengthi2195501970e4:pathl55:環(huán)太平洋Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e10:path.utf-8l59:鐜?お騫蟲(chóng)磱Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4eed6:lengthi266e4:pathl35:老調(diào)網(wǎng)-下載中英字幕電影的好地方.urle10:path.utf-8l50:鑰佽皟緗?涓嬭澆涓?嫳瀛楀箷鐢?shù)濯?jiǎng)鐨勫ソ鍦版柟.urleee4:name51:環(huán)太平洋Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD10:name.utf-855:鐜?お騫蟲(chóng)磱Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD12:piecelengthi2097152e6:pieces20940:(此處省略20940個(gè)字節(jié)的hash值,每一個(gè)piece的hash值占用20個(gè)字節(jié),即20940/20=1047個(gè)piece。)9:publisher8:飛鳥(niǎo)娛樂(lè)13:publisher-url21:http://bbs.hdbird.com19:publisher-url.utf-821:http://bbs.hdbird.com15:publisher.utf-812:椋為笩濞變箰e5:nodesll21:router.bittorrent.comi6881eel20:router.lanspirit.neti53eeee
以下我們開(kāi)始具體解說(shuō)一下torrent文件格式:
B編碼
為了在torrent文件里存儲(chǔ)bt下載所需信息。須要一定規(guī)范記錄這些信息,在這里torrent文件使用的是BEncode格式規(guī)范,和JSON一樣,本質(zhì)都是用來(lái)交換和存儲(chǔ)信息。
BEncode有四種存儲(chǔ)類(lèi)型:(字符串型、數(shù)值型、列表型、字典型)
1、字符串[string]
字符串表示方式為:數(shù)字前綴:字符串。比如super表示為:5:super數(shù)字前綴以十進(jìn)制數(shù)字指出字符串的長(zhǎng)度。比如:
0:””
4:大慶
6:daqing
15:www.sina.com.cn
2、數(shù)值[integers]
數(shù)值的表示方式為:以小寫(xiě)字母”i”開(kāi)始。以小寫(xiě)字母”e”結(jié)尾,ie中間放置十進(jìn)制數(shù)值。比如:
i0e 表示數(shù)字0(零)
i-3e表示數(shù)字-3
i7e 表示數(shù)字7
3、列表
列表類(lèi)型同意嵌套,列表中的能夠存儲(chǔ)列表。列表的表示方式:以小寫(xiě)字母”l”開(kāi)始。以小寫(xiě)字母”e”結(jié)尾,le中間放置存儲(chǔ)的內(nèi)容。比如:
l7:figo’s4:blog3:url23:http://news.sina.com.cne
該list的內(nèi)容為[‘super’s’,’blog’,’url’,’http://news.sina.com.cn’]
l4:yeari2013ee
該list的內(nèi)容為[‘year’,2013]
4、字典[dictionary]
字典是為了讓一個(gè)詳細(xì)的名字[name]與一個(gè)詳細(xì)的數(shù)據(jù)類(lèi)型表示的數(shù)據(jù)關(guān)聯(lián),上面三種類(lèi)型(字符串、整數(shù)、列表)的數(shù)據(jù)僅僅是單純的表示數(shù)據(jù)本身,并未有變量名來(lái)指出該數(shù)據(jù)名稱(chēng)。字典類(lèi)似C語(yǔ)言變量的定義,比如定義一個(gè)名為strName的字符串例如以下:
Char*strName=NULL;
當(dāng)strName指向字符串”Figo”時(shí),那么當(dāng)我們說(shuō)strName時(shí)也即在說(shuō)”Figo”。
BEncode中字典類(lèi)型的存在。就是為了讓數(shù)據(jù)與名稱(chēng)關(guān)聯(lián)配對(duì)。也即dictionary后的數(shù)據(jù)要兩兩配對(duì)。
這里須要注意的是。名稱(chēng)必須為string類(lèi)型。
Dictionary可同意嵌套使用。表示方式:以小寫(xiě)字母’d’開(kāi)始。以小寫(xiě)字母’e’結(jié)尾。de中間放置要存儲(chǔ)的內(nèi)容。例如以下:
d4:Name:4:Figo5:Hobbyl8:football5:sleep8:thinkingee
該dictionary內(nèi)容為{
‘name’=‘Figo’,
’Hobby’=[‘football’,’sleep’,’thinking’]}
d8:Name-dicd5:First4:Figo6:Second3:Tomee
該dictionary內(nèi)容為{
‘Name-dic’={
‘First’=’Figo’,
’Second’=’Tom’}
}
那么開(kāi)頭的torrent文件announce部分
d8:announce39:http://tracker.bestxl.com:8077/announce13:announce-listll39:http://tracker.bestxl.com:8077/announceel30:http://tracker.prq.to/announceee8:codepagei936e13:creationdatei1381766089e
就可以理解為:
announce=[‘http://tracker.bestxl.com:8077/announce’]
announce-list=[‘http://tracker.bestxl.com:8077/announce’,’http://tracker.prq.to/announce’]
codepage=936#代碼936中文簡(jiǎn)體GBK
creationdate=1381766089#unix時(shí)間格式。此處是2013-10-1423:54:49
種子文件結(jié)構(gòu)
|
keyword |
含義 |
|
|
info |
該keyword相應(yīng)的值是一個(gè)字典。它有兩種模式,”singlefile”和”multiplefile”:?jiǎn)挝募J胶投辔募J剑瑔挝募J绞侵腹蚕淼奈募H僅有一個(gè),多文件模式是指提供共享的文件不止一個(gè)。而是兩個(gè)或兩個(gè)以上,假設(shè)使用BT軟件下載一部影片時(shí),影片的上下部分可能分別放在不同的文件中。 |
|
|
announce |
必選 |
該keyword的值為T(mén)racker的URL。 |
|
announce-list |
可選 |
它的值存放的是備用Tracker的URL。 |
|
creation-date |
可選 |
該keyword相應(yīng)的值存放的是種子文件創(chuàng)建的時(shí)間。 |
|
comment |
可選 |
它的值存放的是種子文件制作者的備注信息。 |
|
createdby |
可選 |
值存放生成種子文件的BTclient軟件的信息,如client名、版本。 |
在bitTorrent規(guī)范中,torrent文件又被稱(chēng)作Metainfofiles,其主要有announce部分和info部分組成。
1、announce部分(紅色表示必選,藍(lán)色部分表示可選)
比如:
announce
默認(rèn)的trackerserver地址
announce-list
(對(duì)標(biāo)準(zhǔn)的擴(kuò)展)備選的trackerserver列表,這里須要說(shuō)明一下備選server的選擇和嘗試連接順序。
例如以下的表示為announce-list的一種表示:
{‘a(chǎn)nnounce-list’=[[tracker1,tracker2,tracker3],[backup2-list],[backup3-list]]}
在btclient程序連接trackerserver時(shí),對(duì)于announce-list的處理步驟例如以下:
1)、首先依次嘗試連接第一個(gè)列表提供的url。假設(shè)tracker1無(wú)響應(yīng)。嘗試tracker2.當(dāng)tracker2連接成功時(shí)。則第一個(gè)備份列表中的處理順序變?yōu)椋?/p>
[tracker2,tracker1,tracker3]
2)、假設(shè)第一個(gè)備份列表依次連接失敗,則嘗試backup2-list。假設(shè)backup2-list也依次連接失敗。
則嘗試連接backup3-list。可是backup2-list與backup3-list不會(huì)由于連接失敗而像backup1-list那樣改變處理順序;
3)、改變的list順序僅僅對(duì)此次程序連接嘗試順序有影響,原始的torrent文件并不更改,下次重新啟動(dòng)程序后依然依照torrent文件里的announce-list次序嘗試。
creationdate
torrent文件的創(chuàng)建時(shí)間,為UNIX時(shí)間格式。
comment
string類(lèi)型,是關(guān)于torrent文件的描寫(xiě)敘述信息。
createdby
創(chuàng)建此torrent文件的程序信息。
encoding
指出info中pieces部分的編碼類(lèi)型,一般為UTF-8。有時(shí)也會(huì)遇到GBK。
比如文件前面的B編碼
d8:announce39:http://tracker.bestxl.com:8077/announce13:announce-listll39:http://tracker.bestxl.com:8077/announceel30:http://tracker.prq.to/announceee8:codepagei936e13:creationdatei1381766089e
可分解為
d
8:announce
39:http://tracker.bestxl.com:8077/announce
13:announce-list
l
l39:http://tracker.bestxl.com:8077/announcee
l30:http://tracker.prq.to/announcee
e
8:codepage
i936e
13:creationdate
i1381766089e
#上圖中:D表示字典型、S表示字符串型、L表示列表型、N表示數(shù)值型
2、info部分(紅色表示必須的部分,藍(lán)色部分表示可選的部分)
這里須要注意info部分的單文件傳輸和多文件傳輸時(shí)的不同:?jiǎn)挝募鬏斒侵竧orrent文件僅僅存儲(chǔ)了單個(gè)文件下載信息;多文件傳輸指torrent中存儲(chǔ)了一個(gè)以上的文件下載信息。
|
keyword |
含義 |
|
|
piecelength |
每一個(gè)piece的長(zhǎng)度,值是B編碼類(lèi)型,通常為i262144e。即256K |
|
|
pieces |
字符串類(lèi)型。存放每一個(gè)piece的hash值,這個(gè)字符串長(zhǎng)度一定是20的倍數(shù)。由于每一個(gè)piece的hash值的長(zhǎng)度為20字節(jié)。 |
|
|
private |
該值假設(shè)為1。則表明client必須通過(guò)連接Tracker來(lái)獲取其他下載者信息。即peer的IP地址和port號(hào);假設(shè)為0,則表明client還能夠通過(guò)其他方式獲取peer的IP地址和port號(hào),如DHT方式。DHT(DistributeHashTabel)即分布式哈希表。它是一種以分布式的方式來(lái)獲取peer的方法,如今很多BTclient既支持通過(guò)Tracker來(lái)獲取peer,也支持通過(guò)DHT來(lái)獲取peer,假設(shè)種子文件里沒(méi)有privatekeyword。則表明不限制一定要通過(guò)連接tracker來(lái)獲取peer。 |
|
|
單文件 |
name |
共享文件的文件名稱(chēng)。也就是要下載的文件的文件名稱(chēng)。 |
|
length |
共享文件的長(zhǎng)度,以byte為單位。 |
|
|
md5sum |
可選,是共享文件的md5值,這個(gè)值在bt協(xié)議中根本不是用。 |
|
|
多文件 |
name |
存放共享文件的目錄名字。 |
|
file |
它的值是一個(gè)列表。含有多個(gè)字典,每一個(gè)共享文件為一個(gè)字典。每一個(gè)字典中含有三個(gè)keyword:length、md5sum、path |
|
|
files字典 |
length |
共享文件的長(zhǎng)度。以byte為單位。 |
|
md5sum |
可選,同上。 |
|
|
path |
存放共享文件的路徑和文件名稱(chēng)。 |
|
1)、單文件傳輸形式:
name
要下載的文件名稱(chēng)字
length
要下載文件的大小(單位為byte)
md5sum
32為的16進(jìn)制MD5字符串。
piecelength
要下載文件依照piecelength指定大小分片,此處指明單個(gè)分片大小。
pieces
存儲(chǔ)每一個(gè)分片的SHA1值(每一個(gè)SHA1的hash長(zhǎng)度為20byte)
比如:目標(biāo)文件大小FileSpace為1039143285bytes,文件每一個(gè)分片大小PerPieceSpace為1048576bytes,計(jì)算可得:
1039143285=1048576x991+4469
即FileSpace=PerPieceSpace*991+4469
目標(biāo)文件依照指定大小分片后,為991個(gè)滿(mǎn)足分片大小的分片文件和1個(gè)余數(shù)文件。總共是992個(gè)小文件。
其存儲(chǔ)的SHA1每一個(gè)長(zhǎng)度為20bytes。進(jìn)而可知pieces中存儲(chǔ)的SHA1個(gè)數(shù)為:
NumberOfSHA1=19840/20=992
即torrent文件的pieces中存儲(chǔ)了992個(gè)SHA1值。這樣每一個(gè)小文件都相應(yīng)上了一個(gè)SHA1校驗(yàn)值。
2)、多文件傳輸形式
files
表示該torrent為多文件形式,每一個(gè)文件都是dictionary類(lèi)型數(shù)據(jù)表示。
name
表示多個(gè)文件存儲(chǔ)在以name命名的目錄。
length
要下載文件的大小(單位為byte)
path
指出要下載文件存儲(chǔ)相對(duì)于name字段表示的目錄的位置。
如果name為dir1,此時(shí):
1)假設(shè)path值為file1.rmvb。表示file1.rmvb的存儲(chǔ)路徑為dir1file1.rmvb
2)假設(shè)path值為dir2file1.rmvb。表示file1.rmvb的存儲(chǔ)路徑為dir1dir2file1.rmvb
md5sum
32位的16進(jìn)制MD5值字符串。
piecelength
要下載文件安裝piecelength指定大小分片,此處指明單個(gè)分片大小。
pieces
存儲(chǔ)每一個(gè)分片的SHA1值(每一個(gè)SHA1的hash長(zhǎng)度為20字節(jié))
以下我們看一下info部分的演示樣例:
4:infod5:filesld6:lengthi202e4:pathl40:本片簡(jiǎn)單介紹,海報(bào),截圖等,雙擊進(jìn)入查看.urle10:path.utf-8l58:鏈?墖綆€浠嬶紝嫻鋒姤錛屾埅鍥劇瓑錛屽弻鍑昏繘鍏ユ煡鐪?
urleed6:lengthi275e4:pathl37:飛鳥(niǎo)網(wǎng)-和浪子一起來(lái)開(kāi)心農(nóng)場(chǎng)偷菜吧.urle10:path.utf-8l53:椋為笩緗?鍜屾氮瀛愪竴璧鋒潵寮€蹇?jī)鍐滃満鍋疯彍鍚?urleed6:lengthi266e4:pathl45:飛鳥(niǎo)娛樂(lè)-邊看電影邊學(xué)英語(yǔ),娛樂(lè)學(xué)習(xí)兩不誤.urle10:path.utf-8l65:椋為笩濞變箰-杈圭湅鐢?shù)濯?jiǎng)杈瑰?鑻辮?錛屽ū涔愬?涔?fàn)涓や笉?.urleed6:lengthi2640e4:pathl37:飛鳥(niǎo)娛樂(lè)論壇-超多最新爆爽資源下載.rtfe10:path.utf-8l53:椋為笩濞變箰璁哄潧-瓚呭?鏈€鏂扮垎鐖借祫婧愪笅杞?
rtfeed6:lengthi288e4:pathl45:飛鳥(niǎo)娛樂(lè)原創(chuàng)IMDBTOP250經(jīng)典大片一網(wǎng)打盡.urle10:path.utf-8l59:椋為笩濞變箰鍘熷垱IMDBTOP250緇忓吀澶х墖涓€緗戞墦灝?urleed6:lengthi2195501970e4:pathl55:環(huán)太平洋Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e10:path.utf-8l59:鐜?お騫蟲(chóng)磱Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4eed6:lengthi266e4:pathl35:老調(diào)網(wǎng)-下載中英字幕電影的好地方.urle10:path.utf-8l50:鑰佽皟緗?涓嬭澆涓?嫳瀛楀箷鐢?shù)濯?jiǎng)鐨勫ソ鍦版柟.urleee4:name51:環(huán)太平洋Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD10:name.utf-855:鐜?お騫蟲(chóng)磱Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD12:piecelengthi2097152e6:pieces20940:(此處省略20940個(gè)字節(jié)的hash值,每一個(gè)piece的hash值占用20個(gè)字節(jié)。即20940/20=1047個(gè)piece。
)9:publisher8:飛鳥(niǎo)娛樂(lè)13:publisher-url21:http://bbs.hdbird.com19:publisher-url.utf-821:http://bbs.hdbird.com15:publisher.utf-812:椋為笩濞變箰e5:nodesll21:router.bittorrent.comi6881eel20:router.lanspirit.neti53eeee
分解文件為
4:info
d
5:files
l
d
6:length
i202e
4:path
l40:本片簡(jiǎn)單介紹,海報(bào),截圖等,雙擊進(jìn)入查看.urle
10:path.utf-8
l58:鏈?墖綆€浠嬶紝嫻鋒姤錛屾埅鍥劇瓑錛屽弻鍑昏繘鍏ユ煡鐪?urle
e
d
6:length
i275e
4:path
l37:飛鳥(niǎo)網(wǎng)-和浪子一起來(lái)開(kāi)心農(nóng)場(chǎng)偷菜吧.urle
10:path.utf-8
l53:椋為笩緗?鍜屾氮瀛愪竴璧鋒潵寮€蹇?jī)鍐滃満鍋疯彍鍚?urle
e
d
6:length
i266e
4:path
l45:飛鳥(niǎo)娛樂(lè)-邊看電影邊學(xué)英語(yǔ),娛樂(lè)學(xué)習(xí)兩不誤.urle
10:path.utf-8
l65:椋為笩濞變箰-杈圭湅鐢?shù)濯?jiǎng)杈瑰?鑻辮?錛屽ū涔愬?涔?fàn)涓や笉?.urle
e
d
6:length
i2640e
4:path
l37:飛鳥(niǎo)娛樂(lè)論壇-超多最新爆爽資源下載.rtfe
10:path.utf-8
l53:椋為笩濞變箰璁哄潧-瓚呭?鏈€鏂扮垎鐖借祫婧愪笅杞?
rtfe
e
d
6:length
i288e
4:path
l45:飛鳥(niǎo)娛樂(lè)原創(chuàng)IMDBTOP250經(jīng)典大片一網(wǎng)打盡.urle
10:path.utf-8
l59:椋為笩濞變箰鍘熷垱IMDBTOP250緇忓吀澶х墖涓€緗戞墦灝?urle
e
d
6:length
i2195501970e
4:path
l55:環(huán)太平洋Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e
10:path.utf-8
l59:鐜?お騫蟲(chóng)磱Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD.mp4e
e
d
6:length
i266e
4:path
l35:老調(diào)網(wǎng)-下載中英字幕電影的好地方.urle
10:path.utf-8
l50:鑰佽皟緗?
涓嬭澆涓?嫳瀛楀箷鐢?shù)濯?jiǎng)鐨勫ソ鍦版柟.urle
e
e#這是緊隨files后L的結(jié)束符。
4:name
51:環(huán)太平洋Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD#存放共享文件的目錄名字
10:name.utf-8
55:鐜?お騫蟲(chóng)磱Pacific.Rim.2013.BluRay.720p.x264.AAC-LZHD
12:piecelength
i2097152e
6:pieces
20940:....................#20940/20=1047個(gè)piece
9:publisher
8:飛鳥(niǎo)娛樂(lè)
13:publisher-url
21:http://bbs.hdbird.com
19:publisher-url.utf-8
21:http://bbs.hdbird.com
15:publisher.utf-8
12:椋為笩濞變箰
e#這個(gè)e是緊隨info后面d的結(jié)束符
5:nodes
l
l
21:router.bittorrent.com
i6881e
e
l
20:router.lanspirit.net
i53e
e
e
e#這個(gè)e是文件開(kāi)頭d的結(jié)束符
#這個(gè)nodes部分是torrent文件的擴(kuò)展,包括IP和port的列表,用于連接DHT網(wǎng)絡(luò)的初始節(jié)點(diǎn)。并通過(guò)這些節(jié)點(diǎn)進(jìn)行find_node。
終于維護(hù)一張完整的DHT路由表。
至此!torrent文件格式所有解說(shuō)完成,有時(shí)間再把BT的通信過(guò)程總結(jié)一下以作編程及(P2SP、P4P)網(wǎng)絡(luò)使用。
總結(jié)
以上是生活随笔為你收集整理的Torrent 文件图文解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Panabit镜像功能配合wiresha
- 下一篇: 螺栓的材料及技术标准