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

本文來自 免費教程網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM