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文件分享由下列內容組成:
- 傳統的文件服務器
- 種子文件(.torrent文件)
- bt tracker服務器
- 文件分享者
- web瀏覽器
- web瀏覽器用戶(多個)
一個服務器按照下面的步驟開始文件分享過程
- 啟動一個bt tracker服務器
- 啟動一個普通的web服務器,如apache
- 在web服務器上配置多媒體類型‘application/x-bittorrent’關聯到.torrent文件
- 生成一個.torrent文件,在文件中添加bt tracker服務器的地址
- 上傳torrent文件到web服務器
- 發布torrent文件下載頁面
- 等待用戶下載
一個用戶按照下面的步驟開始文件下載
- 安裝bt客戶端
- 瀏覽web頁面
- 下載torrent文件
- 保存torrent文件到本地
- 使用bt客戶端打開torrent文件,開始下載
- 等待文件下載完成
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。
本文來自 免費教程網