去年年末的時候,有個朋友說要做一個BT協定的上傳和下載下傳,要俺幫忙,于是在那個時候搜尋了各種關于種子檔案的檔案格式資料。順便整了一個BT格式的分析類庫出來。目前,貌似朋友那便沒說要繼續整BT協定的上傳和下載下傳了,估計大概換了協定吧,呵呵。是以這個放在手裡也用處不大了,剛好又很久沒寫博了,這個就作為當年的第一篇開篇部落格吧。言歸正傳,正文開始
說到BT的種子檔案格式,首先我們必須要了解的就是Bencoding編碼格式。關于這個格式的定義,基本上還是比較簡明的,B編碼總共隻支援4種類型,既整數,字元串,清單和字典。整數以i标記開頭以e标記結尾,中間是整數數字,字元串以:标記開頭然後根接字元串的長度,最後是字元串内容,清單以l标記開頭,以e結尾,字典以d開頭以e結尾。清單可以包含任何的BT元素,字典也可以包含任何的BT元素,不過字典的Key必須是字元串。如此以來分析,整數和字元串是兩種單元的元素,可以很好的解析,基本上不用分析就能搞定,而清單和字典,則就需要根據給定的字元串進行分析處理了,這個分析實際上也簡單,先碰到開頭的标記,然後不斷的往下判斷讀取,碰到結尾标記e結束,如果在碰到結尾标記之前還又碰到其他的标記,則可進行遞歸處理,是以,處理起來也友善了。
B編碼解析完成,那麼BT種子檔案的處理也就簡單了。BT種子檔案實際上就是由B編碼的字典組成,其内部的字典鍵介紹,可以參考相關資料,這裡我摘錄一些如下:
Torrent檔案内的資料結構分為以下幾部分:
announce:Tracker的主伺服器
announce-list:Tracker伺服器清單
comment:種子檔案的注釋
comment.utf-8:種子檔案注釋的utf-8編碼
creation date:種子檔案建立的時間,是從1970年1月1日00:00:00到現在的秒數。
encoding:種子檔案的預設編碼,比如GB2312,Big5,utf-8等
info:所有關于下載下傳的檔案的資訊都在這個字段裡,它包括多個子字段,而且根據下載下傳的是單個檔案還是多個檔案,子字段的項目會不同。
當種子裡包含多個檔案時,info字段包括如下子字段:
files:表示檔案的名字,大小,該字段包含如下三個子字段:
lenghth:檔案的大小,用byte計算
path:檔案的名字,在下載下傳時不可更改
path.utf-8:檔案名的UTF-8編碼,同上
以上的三個字段每個檔案都有一組值。
name:推薦的檔案夾名,此項可于下載下傳時更改。
name.utf-8:推薦的檔案夾名的utf-8編碼,同上。
piece length:每個檔案塊的大小,用Byte計算
pieces:檔案的特征資訊,該字段比較大,實際上是種子内包含所有的檔案段的SHA1的校驗值的連接配接,即将所有檔案按照piece length的位元組大小分成塊,每塊計算一個SHA1值,然後将這些值連接配接起來就形成了pieces字段,由于SHA1的校驗值為20Byte,是以該字段的大小始終為20的整數倍位元組。該字段是Torrent檔案中體積最大的部分,可見如果大檔案分塊很小,會造成Torrent檔案體積龐大。
publisher:檔案釋出者的名字
publisher.utf-8:檔案釋出者的名字的utf-8編碼
publisher-url:檔案釋出者的網址
publisher-url.utf-8:檔案釋出者網址的utf-8編碼。
另外,當釋出單檔案時,files字段是沒有的,而
lenghth:
name:
name.utf-8:
這三個字段負責描述單檔案的屬性:大小,名字,名字的utf-8編碼。其他項目和多檔案相同。
以上的項目即為info字段的全部。
說到info就不得不說INFO_HASH,這個值是info字段的HASH值,20個Byte,同樣是使用SHA1作為HASH函數。由于info字段是釋出的檔案資訊構成的,是以INFO_HASH在BT協定中是用來識别不同的種子檔案的。基本上每個種子檔案的INFO_HASH都是不同的(至少現在還沒有人發現有SHA的沖突),是以BT伺服器以及用戶端都是以這個值來識别不同的種子檔案的。
計算的具體範圍是從info字段開始(不包含"info"這四個位元組),一直到nodes字段為止(不包含"nodes"這5個位元組和nodes前邊表示nodes字段長度的"5:"這兩個位元組)。另外,INFO_HASH值是即時計算的,并不包含在Torrent檔案中。
nodes:最後的一個字段是nodes字段,這個字段包含一系列ip和相應端口的清單,是用于連接配接DHT初始node。
綜上,多檔案Torrent的結構的樹形圖為:
Multi-file Torrent
├─announce
├─announce-list
├─comment
├─comment.utf-8
├─creation date
├─encoding
├─info
│ ├─files
│ │ ├─length
│ │ ├─path
│ │ └─path.utf-8
│ ├─name
│ ├─name.utf-8
│ ├─piece length
│ ├─pieces
│ ├─publisher
│ ├─publisher-url
│ ├─publisher-url.utf-8
│ └─publisher.utf-8
└─nodes
單檔案Torrent的結構的樹形圖為:
Single-File Torrent
│ ├─length
BT類庫檔案簡碼:
<a></a>