1. 程式人生 > >BT協議學習筆記3--協議擴充套件

BT協議學習筆記3--協議擴充套件

前段時間參考我在上一篇部落格裡面的內容,將BT協議的主要內容看了一看。

主要有:

一、Bencode and Metadata File Structure

二、Tracker HTTP Protocol/THP

三、Peer Wire Protocol/PWP

四、Algorithms:Piece Selection & Peer Selection

這些內容有時間我會進行一下總結,主要是最主要的內容以及我理解的一些細節。

今天開始讀一些協議的擴充套件。

暫時不會特別詳細的介紹,只是將讀到的擴充套件和對應的內容聯絡起來。

順序就按我自己的閱讀順序,而擴充套件方面一般就只有閱讀官方文件了:http://www.bittorrent.org/beps/bep_0000.html

BEP:10 Extension Protocol

這個擴充套件並不是對於協議的實質性功能進行更新,而是建立了一個專門的訊息去封裝後面的一些擴充套件。

BEP:9 Extension for Peers to Send Metadata Files

這個擴充套件的意思是不需要下載metadata檔案也就是.torrent檔案到硬碟,而直接靠info-hash資訊加入swarm下載metadata資訊到記憶體,然後再開始實際想要的檔案的下載。

magnet磁力連結就是靠的這個擴充套件。

BEP:6 Fast Extension

擴充套件了Message訊息裡面的關鍵字,而其中最主要的就是Allowed Fast關鍵字,其功能就是讓新加入的peer能快速獲得若干piece然後愉快地下載。

BEP:5 DHT Protocol

非常重要的extension,實現了真正意義上的分散式系統,之前的協議從tracker的意義上來說仍然是集中式的,tracker仍然存在單點故障以及瓶頸鍊路問題。

DHT從某種意義上來說可以看做是一個分散式的tracker,獲得peer資訊需要向特定的一部分node請求,但是這特定的點是分散式的並且並不是固定的點。

特定的點體現了tracker的特性,而並不固定並且多個點體現了分散式的特性。

BEP:11 Peer Exchange

PEX目前沒有正式的標準,在BEP:1000裡面,我這裡看的是libtorrent裡面的實現,屬於UT_PEX。

PEX跟DHT最大的區別就是,不需要向特定的nodes獲得peer資訊,只需要自己任意的有connection的peer(當然首先都要支援PEX擴充套件)相互交換就行。

需要指出的是DHT是單獨的extension而PEX是建立在之前介紹的Extension Protocol之上的。

BEP:23 Trackers Return Compact Peer Lists

tracker 應答的最重要內容當然就是peer資訊了。BEP3中規定的返回格式是 a list of dicts,一個dict就表示一個peer資訊,dict{peerid,ip,port}

而通過此擴充套件,可以返回a string of multi-6bytes, 4 bytes for ip,2 bytes for port。

此擴充套件的主要目的就是節約頻寬。

BEP:7 IPv6 Tracker Extension

IPv6的擴充套件沒有細看,目前沒什麼用。

BEP:12 Multitracker Metadata Extension

這個支援annoucelist的,作為單tracker的替代,作用有二:backup和loadbalance。

backup是指幾個tracker之間資訊不能共享的,loadbalance是資訊能共享的,加上這兩種目的的混合形式,annoucelist有三種形式。

BEP:15 UDP Tracker Protocol for BitTorrent

採用UDP來代替在TCP上的TCP在client和tracker之間的資訊傳輸。目的:1. reduce traffic 50% 2.reduce the complexity of tracker code

本來的HTTP GET Request以及Response變為connect request -- connect response -- announce request -- announce response

BEP: 16 Superseeding

對於上傳能力有限的seeder,採用限制leecher得到的piece,使得它能以有限的頻寬傳輸更多的copy。

BEP: 17 HTTP Seeding

使用HTTP作為seed,提高種子最開始存活的機率。

BEP:18 Search Engine Specification

為搜尋提供便利。

下面是我google這個功能找到的一個解釋,在:http://file.org/extension/btsearch

The .btsearch extension is used by the BitTorrent peer-to-peer file sharing applications. 

The BTSEARCH files control how the BitTorrent client searches for a torrent on a particular P2P search engine.

 This allows the search engines, such as Google, to be added to a user's built-in torrent search bar. 

The BTSEARCH files contain the name, URL and description of the search engine that is being added.

BEP:19 WebSeed - HTTP/FTP Seeding

更詳細的web seed,它對於piece selection 的rarest first方案有修改。

key idea 是儘量讓p2p來傳輸小的連續的沒有的piece,又叫gap,大的gap就給HTTP/FTP來傳輸。

所以修改後的piece selection會選gap小的piece,除非稀有程度相當巨大。

BEP:21 Extension for partial seeds

重要的就是什麼事partial seed。它指那些沒有完整下載torrent裡面的檔案,但又不需要繼續下載的情況。

比如,torrent裡面有多個檔案而user只想要下載其中的一部分。

更細地區分partial seed與其他的incomplete 可以給與client更為準確的健康度資訊。

BEP:22  BitTorrent Local Tracker Discovery Protocol

這是為了方便一些ISP,它們會部署一些Cache在自己的網中,自己的使用者向這些Cache變成的peer下載東西的過程中,Cache的upload頻寬沒有限制,並且Cache可以有很大的storage存放很多東西,這樣將流量控制在一定的範圍之內,節約了運營商的頻寬。

此協議就是幫助找到這些運營商部署的Cache peer的。

BEP:24  Tracker Returns External IP

所有的節點和tracker交換資訊,在tracker一端看到的client的IP都是它們的公網IP(當然如果client和tracker在同一個私網的話就還是私網IP)。

client收到的Tracker的Response裡面的peer的IP資訊都是公網IP,部署這個協議的目的是為了從tracker那裡獲得自己的公網IP。

BEP:26  Zeroconf Peer Advertising and Discovery

這個擴充套件就是使用一系列的zeroconf技術實現在區域網中尋找peer,從而最大化BT的效用。

BEP:27  Private Torrents

這個擴充套件目的是是某一些torrent分享侷限在一定的使用者群體之中,對於斷開再連線以及PEX是否支援都有特別要求,以防止非指定的使用者對於private torrent的訪問。

BEP:28  Tracker exchange extension

這個明顯是和PEX相對的交換tracker資訊的擴充套件,可以簡稱TEX,交換那些自身verify了的tracker給peer。

BEP:29  uTorrent transport protocol

正常的peer之間實際的file share採用的是TCP協議。由於TCP建立大量的連線會造成其他高優先順序的網路服務(比如email、phone call、browe WEB)延遲。

採用了一種架設在UDP之上的新的傳輸層協議,採用了基於延遲的擁塞控制,可以在沒有其他要求的時候充分利用頻寬,在有上述服務的時候讓出頻寬。

BEP: 30  Merkle hash torrent extension 

隨著BT要傳輸的檔案越來越大,為了使torrent檔案保持一定的大小,piece便越來越大(我看了一下17G的星際穿越每個piece已經達到了8MB),但是太大的piece

又會給peer之間的piece交換帶來不利影響,一個方面是最開始要等很久才能得到一個完整的piece以開始和peer的正常交換。

此擴展采用了一種hash tree的結構,將每一個piece的hash作為樹葉,每一個父節點又是子節點的hash,這樣總會得到一個root 的hash。

驗證的時候,通過下載的piece計算hash再與傳輸的其父節點的hash再計算hash這樣會計算出一個root hash對比以驗證piece完整性。

這樣在torrent檔案之中只需要存放root hash可以保持torrent檔案很小,但是也可以將每個piece選地較小。