常見P2P協議之BitTorrent 分析

這段時間在研究BT數據流如何突破防火牆的,但是最後好像有點攔截的意思,反了:(,還是把它總結一下,歡迎討論,[email protected]

BitTorrent協議介紹

BitTorrent是一種P2P協議。用於在對等網絡中,用戶羣和用戶羣(peer-to-peer)之間的文件分享。並且,對於一個文件,用戶羣越大,下載速度就越快。BitTorrent協議能夠減少服務端和網絡環境對分享大文件的影響,由於是分佈式節點互傳數據,某一部分的網絡擁堵或服務器宕機並不會對整個傳輸鏈路造成太大的影響。

BitTorrent協議是由程序員Bram Cohen在2001年四月份設計的,最終版本在2008年確定。有很多客戶端實現了BitTorrent協議,最常見的有VuzeµTorrent、BitTorrentBitCometTransmissionXunlei

BitTorrent協議組成部分

一個BitTorrent文件傳輸過程,通常需要由以下幾個部分組成:

  •  WEB服務器
  •  文件元信息(metainfo,種子)
  •  BitTorrent Tracker
  •  原始下載者(發佈資源者)
  •  終端用戶瀏覽器(下載.torrent種子)
  •  終端用戶下載者

種子文件結構

一個種子文件,通常是以.torrent後綴結尾。BitTorrent協議規定,torrent文件本身,內容必須是utf8編碼格式,並且其中的字段結構採用bencoding編碼格式。

Torrent種子文件由兩部分組成:announcetracker url)和文件信息。

下面以一個正常的torrent文件來分析種子文件的結構。

該種子文件的一部分如下:

d8:announce78:http://www.chinahdtv.org/announce.php?passkey=6e7a1c7ca4164d87e9b0e00ec63aa74910:created by13:uTorrent/204013:creation datei1369699038e8:encoding5:UTF-84:infod5:filesld6:lengthi158784e4:pathl53:Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.chn.srteed6:lengthi107117e4:pathl54:Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.chn1.srteed6:lengthi93644e4:pathl54:Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.chn2.srteed6:lengthi4272200020e4:pathl49:Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.mkveee4:name56:鋼鐵俠3.Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x26412:piece lengthi4194304e6:pieces20380:012ef......:privatei1e6:source23:[hd.gg] CNHD  ChinaHDTVee

根據bencoding編碼格式,把這段字符解碼還原後,就是如下內容:

announce:http://www.chinahdtv.org/announce.php?passkey=6e7a1c7ca4164d87e9b0e00ec63aa749

created by:uTorrent/2040

creation date:1369699038

encoding:UTF-8

info:

{files:[

{length:158784,path:[Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.chn.srt]}, {length:107117,path:[Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.chn1.srt]}, {length:93644,path:[Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.chn2.srt]},

{length:4272200020,path:[Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264.mkv]}],

name:鋼鐵俠3.Iron.Man.3.2013.HDSCR.ULTRA.EDiTiON.720p.x264,

piece length:4194304,

pieces:P1,P2,P3...P1019

private:1

source:[hd.gg] CNHD ChinaHDTV

}

關於具體bencoding編碼,請參考引用中的鏈接。從上面的結果可以看出,一個torrent種子文件有點類似於XML格式的文件,包含如下組成部分:

  •  tracker地址,這裏就是announce後面的url
  •  種子創建軟件及其版本號,這裏是uTorrent軟件創建的,版本號爲2040
  •  創建日期,這裏是1369699038,這個數字顯示的是從UTC 1970-1-1 00:00:00到到現在所經歷的秒數,如果你用工具轉換一下,你會發現創建的時間是2013-5-28 7:57:18
  •  編碼格式,這裏是UTF-8
  •  info區,這裏指定的是該種子有幾個文件,文件有多長,目錄結構,以及目錄和文件的名字,從上面的結果,可以看出這個種子有4個文件,3個字幕,一個視頻文件
  •  Name字段,指定頂層目錄名字
  •  每個段的大小,Bittorrent協議是把一個文件分成很多個小段,然後分段下載的,這個地方就是指定每個段的大小,單位是字節,這裏每個段的大小大約爲4MB
  •  段哈希值,就是整個種子中,每個段的SHA1哈希值拼在一起,後面的那個省略號是全部段的SHA1哈希值,很長,這裏用省略號代替。每個段的哈希長度是固定的,20個字符,所以pieces後面跟的那個數字20380其實是段數量*20,如果你用20380除以20,就會發現這個種子段數量爲1019,乘上前面的段大小,這個種子大概有4GB大小,也就是說你把這個種子下載完後,佔硬盤4GB空間
  •  private值,這個屬性主要顯示這個種子是私有的,還是公有的。一般那些各大PT站就是私有的。私有的種子會禁掉DHT(distributed hash table),因爲如果你的client開這個功能,那就會跳過tracker來和其他peer進行數據交換,在很多PT內站(CHDbits,CMCT,CNHD)把這種行爲稱爲作弊,會直接ban掉你在PT站上的帳號。關於DHT的具體信息,請參考引用中的鏈接。
  •  源,顯示該種子的來源,這裏是CNHD

注意,以上的每個屬性並不是必須的,有的屬性屬於BitTorrent Enhancement Proposals (BEPs),就是BitTorrent協議的擴展,雖然不屬於正式標準的一部分,但是很多客戶端都支持這種格式

BitTorrent通信流程與網絡包結構

BitTorrent協議支持基於TCPUTP網絡協議進行數據傳輸,但是由於TCP協議是有連接的,需要先進行握手。在進行數據傳輸的過程中,每個種子會佔有大量的TCP連接,從而佔有大量的用戶帶寬。這給其他需要高實時性的應用造成很大的網絡壓力。

於是BitTorrent又支持UTP協議用來進行數據傳輸,這也是當前大部分BT下載客戶端所採用的實現方式。UTP(uTorrent Transport Protocol)是基於UDP網絡協議的,也就是無連接協議,採用這種協議進行數據交換,可以很容易進行帶寬控制,不會造成網絡擁堵。

下面主要分析BitTorrent中的UTP協議,因爲這個常用嘛!

UTP協議的包結構如下:(不包含UDP header


Fig. 1 UTP包結構(來自bittorrent.org)

  •  type:數據包類型,0--帶負載數據包,就是通常在連接建立後,上傳數據或下載數據的包;1--連接結束數據包,結束一個連接;2--數據迴應包,當一個peer收到一個帶負載數據包後,會回一個ACK包,來表示這個包已正確接收,有點類似於TCPSYN的感覺,但是這個是在UDP包的數據段做連接控制;3--重置連接;4--開始一個連接
  •  ver:協議版本,通常爲1
  •  extension:擴展段,用於支持BEPs
  •  connection_id:連接id,同一個連接id的數據包屬於一個連接,一般每兩個peer之間會開兩個連接,一個用於發,一個用於收
  •  timestamp_microseconds:包的發送時間
  •  timestamp_difference_microseconds:對於當前連接,最近收到的包時間和當前要發送的包之間的時間間隔
  •  wnd_size:發送方當前剩餘窗口大小,用於進行速度和帶寬控制。BitTorrent協議中每一個發出去的數據包,都要求接收方回一個ACK包。而一個peer的窗口大小是指當前發送出去,但還沒有收到迴應的包的總大小,單位爲字節。每一個peer都一個最大窗口值和一個窗口大小上限值。當wnd_size小於最小UTP包大小的時候,發送方會停止發送數據包,或調整每個數據包的數據負載大小
  •  seq_nr:相對於一個連接,數據包的序列號,以一個包爲計數單位
  •  ack_nr:發送方最近接收到的包的序列號

可能說這麼多,有點混亂了,下面以一個具體的UTP包做說明。

數據包內容如下:

0000   78 ac c0 55 45 4a 00 0c 86 23 b8 00 08 00 45 00

0010   00 30 2f e7 00 00 66 11 a4 23 01 a4 60 2e db f6

0020   42 ea 8f b9 cf 46 00 1c 00 00 21 00 19 a2 ec 07

0030   ea 27 c3 62 4a be 00 37 f5 10 11 89 32 d4

其中0x00-0x29UDP header,這裏不再分析。咱來看一下它的數據部分:

210019a2ec07ea27c3624abe0037f510118932d4

可以看出來:

  •  0x2type字段,代表這是一個數據迴應包
  •  0x1是它的協議版本號
  •  0x00是它的擴展字段
  •  00代表該包沒有擴展信息
  •  0x19a2是該包的連接id,這是一個隨機數
  •  0xec07ea27是該包的發送時間
  •  0xc3624abe是這個包的發送方最近一次接收包到這次發生包之間的間隔,間隔這麼長,表示當前網絡環境不行,數據傳輸速度不是很快
  •  0x0037f510是發送方的窗口大小,也就是說當前發送方還可以接收3.5MB的數據
  •  0x1189是該數據包的序列包,也就意味着發送方在這個連接上已經發送了4489個包
  •  0x32d4是該發送方最近接受到的包序列號

BitTorrent數據包的特徵與識別

由於BitTorrent數據包是應用層協議,所以必須要通過DPI技術,才能識別這種協議的流量。識別這種流量有兩種方法:

一是檢測兩個peer之間的大流量連接。如果發現兩個ip之間出現大量異常udp數據包,可以採取丟包的方式,來限制傳輸速率。

另外一種方法,就是運用DPI技術,讀取UDP數據部分,如果發現大量的UDP包的負載前幾個字節是0x0100,則判斷爲BitTorrent流量,並採取相應的措施。

References

1. http://en.wikipedia.org/wiki/BitTorrent_client

2. http://en.wikipedia.org/wiki/BitTorrent

3. http://www.bittorrent.org/beps/bep_0000.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章