天天看點

bt協定詳解 基礎篇(上)bt協定詳解 基礎篇(上)

bt協定詳解 基礎篇(上)

最近開發了一個免費教程的網站,産生了仔細了解bt協定的想法,是以寫了這一篇文章,後續還會寫一些關于搜尋和索引的東西,都是在開發這個網站的過程中學習到的技術,敬請期待。

1 簡介

bt是BitTorrent協定的簡稱,bt協定是最流行的p2p下載下傳協定,另外一種比較流行的p2p下載下傳協定叫ed2k,ed2k的全稱叫eDonkey2000 network,這裡我們隻讨論bt協定,ed2k協定以後有機會再和大家分享。

相信很多人都聽說過bt協定。但是當我問周圍的人究竟什麼是bt協定呢?他們的解釋讓我對bt協定的了解變得更含糊,為了弄清楚心中的問題,我開始了自己對bt協定的學習。

我在官網 上找到一篇文章The BitTorrent Protocol Specification。這個标題翻譯過來就是“bittorrent協定規範”,是bittorrent協定的基礎篇,為什麼說是基礎篇呢?

BT協定是一個協定簇。

有點像tcp/ip協定一樣,bt協定不是一個簡單的協定,而是一系列相關的協定組成的,而且這個協定簇一直在進化。

既然這篇文章的主題是“基礎篇”,是以它的内容主要來自bep_0003,也就是bittorrent協定規範,因為其它的協定都是以這個協定為基礎的,可見這個的重要性。

2 bittorrent協定規範(中文版)

bittorrent是一個檔案分發協定,它使用url來定位檔案而且跟web服務無縫內建。當有多個人同時下載下傳同一個檔案時,下載下傳者之間可以互相上傳自己已有的那部分檔案,讓一個檔案支援很多人同時下載下傳卻隻增加小量的帶寬負擔變成可能,這就是bt協定相比http協定的優勢。

bt檔案分享由下列内容組成:

  1. 傳統的檔案伺服器
  2. 種子檔案(.torrent檔案)
  3. bt tracker伺服器
  4. 檔案分享者
  5. web浏覽器
  6. web浏覽器使用者(多個)

一個伺服器按照下面的步驟開始檔案分享過程

  1. 啟動一個bt tracker伺服器
  2. 啟動一個普通的web伺服器,如apache
  3. 在web伺服器上配置多媒體類型‘application/x-bittorrent’關聯到.torrent檔案
  4. 生成一個.torrent檔案,在檔案中添加bt tracker伺服器的位址
  5. 上傳torrent檔案到web伺服器
  6. 釋出torrent檔案下載下傳頁面
  7. 等待使用者下載下傳

一個使用者按照下面的步驟開始檔案下載下傳

  1. 安裝bt用戶端
  2. 浏覽web頁面
  3. 下載下傳torrent檔案
  4. 儲存torrent檔案到本地
  5. 使用bt用戶端打開torrent檔案,開始下載下傳
  6. 等待檔案下載下傳完成

bencoding編碼

strings(字元串)編碼為:<字元串長度>:<字元串> 例如: 4:test 表示為字元串"test",4:例子 表示為字元串“例子”,字元串長度機關為位元組,沒開始或結束标記

integers(整數)編碼為:i<整數>e,開始标記i,結束标記為e,例如:i1234e 表示為整數1234,i-1234e 表示為整數-1234,整數沒有大小限制,i0e 表示為整數0,i-0e 為非法,以0開頭的為非法如: i01234e 為非法

lists(清單)編碼為:le,開始标記為l,結束标記為e,清單裡可以包含任何bencoding編碼類型,包括整數,字元串,清單,字典。例如: l4:test5abcdee 表示為二個字元串["test","abcde"]

dictionaries(字典)編碼為de,開始标記為d,結束标記為e,關鍵字必須為bencoding字元串,值可以為任何bencoding編碼類型,例如: d3:agei20ee 表示為{"age"=20},d4:path3:C:\8:filename8:test.txte 表示為{"path"="C:","filename"="test.txt"}

metainfo files

metainfo files(俗稱torrent檔案)使用bencoding進行編碼的一個dictionaries資料類型,有兩個key

announce : bt tracker伺服器位址

info : info又是一個dictionaries(bencoding支援資料類型的嵌套),info裡面的字元串都是使用utf-8編碼。

info dictionary: info字典

name(檔案名) : 通常用作torrent檔案的檔案名

piece length(檔案塊長度): 每一個peace(檔案塊)的位元組長度。為了傳輸的友善,bt協定把檔案分成等大的檔案塊,除了最後一塊。每一個檔案塊的長度通常是2的指數(bittorrent 3.2預設檔案塊大小是 1M)

pieces : pieces是一個字元串,它的長度是20的倍數,每一段20個字元表示對應檔案塊的sha1 hash值。

length和files 兩個中有且隻有一個會出現。當存在length key事,表示torrent種子檔案隻包含一個單一的檔案,length表示這個檔案的位元組數,俗稱檔案長度。

當torrent種子檔案包含多個檔案時,files表示總的檔案個數,

files : files也是一個dictionaries資料類型,它有兩個key

files dictionary:

length: 檔案長度,總位元組數

path: 一個utf-8編碼的字元串數組,最後一個字元串儲存真實的檔案名,前面的字元串儲存檔案路徑。長度為0表示path字段不合法。

trackers

tracker伺服器接收get請求,一個get請求由下列字段組成

  • info_hash 20位元組的sha1哈希值,是bencoding編碼之後的torrent檔案内容的hash。
  • peer_id: 長度為20的字元串,代表下載下傳者的id,每一個下載下傳者開始下載下傳之前會随機生成自己的id。
  • ip : 可選參數,表示檔案下載下傳者的id
  • port: 檔案下載下傳者監聽的端口,預設從6881開始,最大的6889
  • uploaded: 十進制表示的上傳位元組總數
  • downloaded: 十進制表示的下載下傳位元組總數
  • left: 十進制表示的剩餘位元組總數,注意這個值不能通過downloaded和length進行算數計算得到,因為當一些下載下傳檔案塊的資料的完整性校驗失敗的,這些檔案塊必須被重新下載下傳。
  • event : 可選參數,有四個可能的至 started,completed,stopped,empty。

tracker傳回的内容是一個bencoded dictionaries資料類型,如果傳回的内容包含failure reason字段,表示請求失敗,failure reason包含失敗的理由。如果沒有failure reason字段,則傳回内容必須包含interval和peers字段。interval代表用戶端發起下一次請求的間隔,peers包含一個peer清單。一個peer由peer、id、ip、port組成。

bt tracker伺服器可以傳回一個壓縮的peer清單,見BEP 23。

本文來自 免費教程網

我的個人部落格網站 https://lanmaowz.com/