BitTorrent 協議規範(翻譯)

2021-03-31 21:49:18 字數 2449 閱讀 3236

元檔案和tracker的響應都採用的是一種簡單、有效、可擴充套件的格式,被稱為bencoding,它可以包含字串和整數。由於對不需要的字典關鍵字可以忽略,所以這種格式具有可擴充套件性,其它選項以後可以方便的加進來。

bencoding格式如下:

對於字串,首先是乙個字串的長度,然後是冒號,後面跟著實際的字串,例如:4:spam,就是「 spam」

整數編碼如下,以 『i』 開始,然後10進製的整數值,最後以』e』結尾。例如,i3e表示3,i-3e表示-3。整數沒有大小限制。i-0e是無效的。除了 i0e外,所以以0起始的整數都無效。i0e當然表示0。

列表編碼如下,以』l』開始,接下來是列表值的編碼(也採用bencoded編碼),最後以』e』結束。例如:l4:spam4:eggse 表示 [『spam』, 『eggs』]。

字典編碼如下,以』d』開始,接下來是可選的keys和它對應的值,最戶以』e』結束。例如:d3:cow3:moo4:spam4:eggse,表示,而d4:spaml1:al:bee 表示 。鍵值必須是字串,而且已經排序(並非是按照字母順序排序,而是根據原始的字串進行排序)。

元檔案是採用bencoded編碼的字典,包括以下關鍵字:

announce tracker的伺服器

info 它實際上是乙個字典,包括以下關鍵字:

name:

乙個字串,在儲存檔案的時候,作為乙個建議值。僅僅是個建議而已,你可以用別的名字儲存檔案。

piece length:

為了更好的傳輸,檔案被分隔成等長的片斷,除了最後乙個片斷以外,這個值就是片斷的大小。片斷大小幾乎一直都是2的冪,最常用的是 256k(bt的前乙個版本3.2,用的是1m作為預設大小)

pieces:

乙個長度為20的整數倍的字串。它將再被分隔為20位元組長的字串,每個子串都是相應片斷的hash值。

為了能支援其它關鍵字,對於多個檔案的情況,也把它當作乙個檔案來看,也就是按照檔案出現的順序,把每個檔案的資訊連線起來,形成乙個字串。每個檔案的資訊實際上也是乙個字典,包括以下關鍵字:

length:檔案長度

path:子目錄名稱的列表,列表最後一項是檔案的實際名稱。(不允許出現列表為空的情況)。

name:在單檔案情況下,name是檔案的名稱,而在多檔案情況下,name是目錄的名稱。

傳送給tracker的get請求,包含以下關鍵字:

info_hash:

元檔案中info部分的sha hash,20位元組長。這個字元創幾乎肯定需要被轉義(譯註:在url中,有些字元不能出現,必須通過unicode進行編碼)

uploaded:

已經上載的資料大小,十進位制表示。

(********** 通過 http 的get 命令來向 tracker 傳送查詢請求,tracker 響應乙個peers 的列表)

如果你想對元資訊檔案或者tracker查詢進行擴充套件,那麼需要同bram cohen協調,以確保所有的擴充套件都是相容的。

對等協議由乙個握手開始,後面是迴圈的訊息流,每個訊息的前面,都有乙個數字來表示訊息的長度。握手的過程首先是先傳送19,然後傳送「bittorrent protocol」。19就是「bittorrent protocol」的長度。

後續的所有的整數,都採用big-endian 來編碼為4個位元組

在協議名稱之後,是8個保留的位元組,這些位元組當前都設定為0。

接下來對元檔案中的 info 資訊,通過 sha1 計算後得到的 hash值,20個位元組長。接收訊息方,也會對 info 進行乙個 hash 運算,如果這兩個結果不一樣,那麼說明對方要的檔案,並不是自己所要提供的,所以切斷連線。

接下來是20個位元組的 peer id。

這就是握手過程

接下來就是以訊息長度開始的訊息流,這是可選的。長度為0 的訊息,用於保持連線的活動狀態,被忽略。通常每隔2分鐘傳送乙個這樣的訊息。

其它型別的訊息,都有乙個位元組長的訊息型別,可能的值如下:

『choke』, 『unchoe』, 『interested』, not interested』型別的訊息不再含有其它資料了。

『bitfield』永遠也僅僅是第乙個被傳送的訊息。它的資料實際是乙個位圖,如果**********已經傳送了某個片斷,那麼對應的位置1,否則置0。**********s如果乙個片斷也沒有,可以忽略這個訊息。(通過這個訊息,能知道什麼了?)

『request』型別的訊息,後面包含索引、開始位置和長度)長度是2的冪。當前的實現都用的是215 ,而關閉連線的時候,請求乙個超過2 17的長度。(這種型別的訊息,就是當乙個peer希望另乙個peer給它提供片斷的時候,發出的請求)

『piece』型別的訊息,後面保護索引號、開始位置和實際的資料。注意,這種型別的訊息和 『request』訊息之間有潛在的聯絡(譯註:因為通常有了request訊息之後,才會響應『piece』訊息)。如果choke和unchoke訊息傳送的過於迅速,或者,傳輸速度變的很慢,那麼可能會讀到一些並不是所期望的片斷。( 也就是說,有時候讀到了一些片斷,但這些片斷並不是所想要的)

BitTorrent 協議規範(BT協議集合)七

bt種子檔案使用了一種叫bencoding的編碼方法來儲存資料。bencoding現有四種型別的資料 srings 字串 integers 整數 lists 列表 dictionaries 字典 編碼規則如下 strings 字串 編碼為 字串長度 字串 例如 4 test 表示為字串 test 4...

BitTorrent 協議規範(BT協議集合)十一

tracker伺服器原始碼分析之三 httphandler 類 本篇文章分析 httphandler類,它在 httphandler.py 檔案中。external connection made 在建立新的連線的時候被呼叫 data came in 連線上有資料可讀的時候被呼叫 connectio...

BitTorrent協議小結

1.bittorrent協議 2.bittorrent協議中的幾個概念 1 tracker伺服器 2 眾多客戶端 3 種子檔案 3.bittorrent協議在實際中運作的過程 1 要分享的資訊的某個bt客戶端,拿本機中的某個檔案或者目錄做種,生成種子檔案 torrent.然後,它會該告訴tracke...