天天看點

B編碼以及BT種子檔案分析

去年年末的時候,有個朋友說要做一個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>