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選地較小。