BT(帶中心Tracker)通訊協議的分析
現在的很多BT下載都採用了DHT網路,這樣進行BT下載就不需要中心伺服器了。本文針對的是需要中心伺服器的BT下載。
小弟我最近正在研究BT通訊協議,網上的資料很全,但是不是那事詳細和完整,因此,整理下來,一方面他日用到拿來看看,另一方面,希望對正在研究BT通訊協議的有點幫助。若有不正之處,請指正。
BT協議的工作過程
BT協議主要包括3個部分:.torrent檔案的格式、tracker HTTP/HTTPS協議和peer wire協議(使用TCP)。其中tracker HTTP/HTTPS協議是BT客戶機與tracker伺服器之間的通訊協議,peer wire是BT客戶機之間的通訊協議。
1.1 torrent檔案的結構
.torrent檔案的內容,採用了B編碼。B編碼是一種簡潔的資料組織方式,支援4種資料型別:bytestrings、integers、lists和dictionaries。integers、lists和dictionaries型別分別以字母i、l、d作為首定界符,以字母e作為尾定界符。bytestrings型別不使用首/尾定界符,其格式為<十進位制表示的字串長度>:<字串>,如4:spam表示字串“spam”。這4種資料型別巢狀使用構成了.torrent檔案的內容。 我們先看下所舉例子的種子檔案內容,種子檔案中的伺服器內容如下:
其中的一些主要成份如下:
●announce:tracker伺服器的URL,本例中為http://tracker.cnxp.com:8080/announce。 ●announce-list:可選。備用tracker伺服器的URL列表,本例中為http://tracker.cnxp.com:8080/announce,http://btfans.3322.org:6969/announce等。 ●creationdate:可選。.torrent檔案的建立日期,使用標準的UNIX時間,本例中為1152105243。 ●comment:可選。.torrent檔案製作者新增的任意格式的說明。 ●createdby:可選。製作.torrent檔案的工具,本例中使用的製作工具是BitComet/0.67。 ●encoding:可選。釋出的資源使用的編碼方式,在本例中使用的是GBK。
●info:釋出的檔案的資訊。有兩種格式,單檔案格式和多檔案格式。單檔案格式包括length、md5sum(可選)、name、piecelength、pieces;多檔案格式包括files、name、piecelength、pieces,其中files包括length、path、md5sum(可選),每一個檔案都有單獨的length、path、md5sum(可選)。
另外,還有一些可選項,這裡就不在累述。
1.2 tracker HTTP/HTTPS協議
BT客戶端依次向.torrent中的trackerr伺服器傳送連線請求,以獲得正在下載該檔案的對等方列表。如果連線成功獲得列表,就關閉連線,嘗試與列表中的對等方建立連線;如果不成功,嘗試下一個tracker伺服器。
第一、客戶端獲取Tracker伺服器的IP地址
圖一 客戶端傳送DNS請求包
從DNS伺服器的響應來看,我們可以獲取Tracker伺服器的IP地址:
10.rarbg.com:是一個別名伺服器
主名稱:tracker.publicbt.com:95.211.88.54、95.211.88.49、95.211.88.51、
9.rarbg.com: 83.149.126.97
exodus.desync.com: 208.83.20.164
pow7.com: 同10.rarbg.com
tracker.novalayer.org: 194.54.80.150
tracker.publicbt.com: 95.211.88.54、95.211.88.49、95.211.88.51
tracker.torrent.to: 127.0.0.1
tracker.torrentbay.to: 109.235.55.11
tracker.1337x.org: 95.215.62.224
tracker.openbittorrent.com: 95.215.62.26
以上為各Tracker伺服器的IP地址。
第二、TrackerHTTP/HTTPS協議
BT客戶端依次向.torrent檔案中的tracker伺服器傳送連線請求,以獲取peers列表(主要是IP地址和監聽埠)。如果連線成功獲取列表,就關閉連線,嘗試與列表中的對等方建立連線;如果不成功,嘗試下一個tracker伺服器。
圖二 BT客戶端向Tracker伺服器傳送HTTP請求
447號分組中的HTTP部分內容如圖6所示。
圖三 HTTP部分內容
其中一些成分的含有如下:
● info_hash:.torrent檔案中的info部分的sha1效驗碼,共20位元組。Tracker伺服器通過它在釋出列表中找到對應的記錄。
● peer_id:BT客戶端的唯一性標識,在客戶端啟動時產生,共20bit。貌似沒有具體的產生peer-id的演算法,只要求能夠保證唯一性即可。
● ip:可選,IP地址,沒有的話伺服器會自己找到。
● port:監聽埠,這裡為10775。
● uploaded/downloaded:上傳/下載的位元組數(從客戶機向Tracker伺服器傳送”started”開始計算)。
● left:還需下載的位元組數。
● numwant:可選。客戶端希望從Tracker伺服器得到的對等方的數目。
● key:可選。一個擴充套件的唯一性標識,即使改變了IP地址,也可以使用該欄位標識該BT客戶機。
● compact:壓縮標誌。如果值為1表示接受壓縮格式的對等方列表,即用6byte表示一個對等方 (前4byte表示IP地址,後2byte表示埠號);值為0表示不接受。
另外,在與Tracker伺服器互動的過程中,有很多伺服器的已經被封殺禁止,所以,會有很多這樣的結果。
圖四 被封后的Tracker伺服器互動過程
Tracker伺服器有個tracker程式來管理這些請求,得到這一串程式碼後就會用info_hash來查詢列表,若找到就可以下載。接著就會反連(NatCheck)客戶端的IP地址和埠,判斷它是內網使用者還是公網使用者。接下來伺服器返回現在正在下載這個檔案的所有公網使用者的IP和埠。返回的部分資料如圖五所示。
圖五 HTTP之上部分資料
其中“660:”以及之前的部分使用的是ASCII字符集,“660:”之後的部分是用16進製表示的二進位制數。從分組內容可以看出:完成整個檔案下載的peers數為76;正在下載的peers數目為10個;還沒有完成該檔案下載的peers數目為34;interval的值為1967,也就是說BT客戶端最多每隔1967個時間單位就與tracker伺服器重新聯絡一次;最少時間間隔為983;peer部分共有660個位元組,由於BT客戶端支援對等方列表的壓縮,即6個位元組表示一個對等方,也就說返回的對等方個數為110個。
1.3 peer wire協議
BT客戶機會嘗試與返回的對等方列表中的部分對等方建立連線,下面是對等放列表中的208.131.161.209:53062為例,分析一下對等方之間的互動過程。如圖六所示,只分析TCP之上的部分。約定對等方A指的是208.131.161.209:53062,對等方B指的是172.16.8.93:3012.
圖六 對等方間通訊過程
建立TCP連線之後,對等方之間的互動過程包括以下幾步:
(1) 握手,通過Handshake分組實現。
(2) 互換所擁有的資源的情況。通過Bitfield分組實現。該例中,對等方B尚未下載任何資 源,故公佈資源擁有情況的只有對等方A。對等方A通過分組283公佈了自己資源擁有情況。
(3) 互通對資源的意願情況,包括interested、nointerested、choke、unchoke等4種。
(4) 互相請求資源,通過request piece、piece分組實現。
(5) 斷開連線。因為peer wire協議使用了TCP方式,對等方A與對等方B斷開連線時,只需要斷開他們之間的TCP連線即可。
圖七 Handshake資料包的上層內容
握手:Handshake:
pstrlen: 的字串長度,單個位元組。
pstr: 協議的識別符號,字串型別。
reserved: 8 個保留位元組。當前的所有實現都使用全0.這些位元組裡面的每一個位元組都可以用來 改變協議的行為。來自Bram 的郵件建議應該首先使用後面的位,以便可以使用前面 的位來改變後面位的意義。
info_hash: 元資訊檔案中info 鍵(key)對應值的20 位元組SHA1 雜湊。這個nfo_hash和在tracker 請求中info_hash 是同一個。
peer_id: 用於唯一標識客戶端的20 位元組字串。這個peer_id 通常跟在tracker 請求中傳送 的peer_id相同(但也不盡然,例如在Azureus,就有一個匿名選項)。
在BitTorrent 協議1.0 版本,pstrlen = 19, pstr = “BitTorrent protocol”。
連線的發起者應該立即傳送握手報文。如果接收方能夠同時地服務多個torrent,它會等待發起者的握手報文(torrent 由infohash 唯一標識)。儘管如此,一旦接收方看到握手報文中的info_hash 部分,接收方必須儘快響應。tracker 的NAT-checking 特性不會發送握手報文的peer_id 欄位。
如果一個客戶端接收到一個握手報文,並且該客戶端沒有服務這個報文的info_hash,那麼該客戶端必須丟棄該連線。如果一個連線發起者接收到一個握手報文,並且該報文中peer_id 與期望的peer_id 不匹配,那麼連線發起者應該丟棄該連線。注意發起者可能接收來自tracker 的peer 資訊,該資訊包含peer 註冊的peer_id。來自於tracker 的peer_id 需要匹配握手報文中的peer_id。
圖八 Bitfiled資料包上層資料
bitfield:
itfield 報文可能僅在握手序列傳送之後,其他訊息傳送之前立即傳送。它是可選的,如果一個客戶端沒有piece(片),就不需要傳送該報文。bitfield 報文長度可變,其中x 是bitfield 的長度。payload 是一個bitfield,該bitfield 表示已經成功下載的piece(片)。第一個位元組的高位相當於piece 索引0。設定為0 的位表示一個沒有的piece,設定為1 的位表示有效的和可用的piece。末尾的冗餘位設定為0。
長度不對的bitfield 將被認為是一個錯誤。如果客戶端接收到長度不對的bitfield 或者bitfield 有任一冗餘位集,它應該丟棄這個連線。
圖九 request piece資料包上層部分
request piece分組結構如上圖所示。
該報文長度固定,用於請求一個塊。payload包含如下資訊:
index:整數,指定從零開始的piece索引。
begin:整數,指定piece中從零開始的位元組偏移。
length:整數,指定請求的長度。