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