天天看點

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

這個擴充并不是對于協定的實質性功能進行更新,而是建立了一個專門的消息去封裝後面的一些擴充。

比如Extension for Peers to Send Metadata Files 這個擴充就是封裝在此擴充之中的。

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