BitTorrent詳解

一、什麼是BitTorrent

一般來說,我們認爲BitTorrent是一個P2P下載軟件(點對點下載軟件),你在下載的同時,也在爲其他用戶提供該文件的上傳,因爲大家是“互相幫助”,所以不會隨着用戶數的增加產生服務器擁塞而降低下載速度。
但是嚴格的來說,BitTorrent是一種用來在網絡上傳輸文件的協議(Protocol),它本質上是分佈式系統的P2P(點對點)傳輸文件協議,用戶直接相連,然後互相發送和接收文件的各部分,BitTorrent仍然有一箇中心服務器(Tracker)(此處的服務器不是指實體的服務器,只是表示提供服務的服務者)來協調各個用戶之間的協作。Tracker服務器只是管理連接,對發佈的文件內容並不關心,也不傳輸文件內容,因此Tracker可以用很少的帶寬就可以支持大量的用戶。BitTorrent的關鍵思想是用戶在下載(入埠傳輸)時也應該上傳(出埠傳輸),因此網絡帶寬就能被充分的利用,因此參與下載的用戶數量越多,下載速度也越高。
現在 BitTorrent的DHT網絡(分佈式哈希表Distributed Hash Table)技術,對一個用戶來說,它獲得一個使用DHT網路的種子後,運行 BitTorrent客戶端進行下載後,BitTorrent客戶端就會在DHT網路中搜索。連入DHT網絡的用戶叫做節點(node),節點之間互相有路由記錄,因此只要和任何一個已經在DHT網絡中的節點連接上,客戶端就可以尋找到更多的節點,從而連入網絡。一般種子上都有默認節點,那麼可以幫助沒有連入網絡的用戶通過那些節點連入網絡,如果下載者已經連入DHT網絡了,種子裏填寫的節點就不需要了。因爲DHT網絡是分佈式存儲系統,所以連Tracker中心服務器都不需要了(雖然沒有連入DHT網絡的用戶需要找到第一個節點,之後才能連入DHT網絡,不過之後用戶就可以進行分佈式查詢了,而不需要向Tracker服務器不斷的查詢)。

二、BitTorrent與其它文件傳輸協議的比較 

最一般的文件傳輸協議是客戶端/服務器(C/S)模式,比如:HTTP和FTP等下載方式,它們一般都是首先將文件放到服務器上,然後再由服務器傳送到每位用戶的機器上,即用戶機只與服務器相連,客戶機之間並不通信。因此如果同一時刻下載的用戶數量太多,勢必影響到所有用戶的下載速度,如果某些用戶使用了多線程下載,那對帶寬的影響就更嚴重了,因此幾乎所有的下載服務器都有用戶數量和最高下載速度等方面的限制,且用戶越多,服務器上需要的帶寬就越大。很明顯,由於上述的原因,即使你使用的是寬帶網,通常也很難達到運營商許諾的最高下載速度,這裏面固然有網絡的原因,但與服務器的限制也不無關係。
另外一種比較流行的文件傳輸協議是基於點對點(P2P)網絡,比如Kazaa、eDonkey、 Gnutella和Direct Connect等,使用這些軟件網絡用戶可以直接連接到其他網絡用戶,而不需要連接到特定服務器,但由於用戶操作系統的限制,發佈者可能不能響應很多的用戶請求,發佈的內容也完全由用戶自己決定,可能會涉及到法律和道德問題。
BitTorrent服務是通過一種類似於傳銷的方式來實現文件共享的,用戶幫助服務器分發檔案,從而減小服務器的負擔。舉個例子來說,例如BT服務器將一個文件分成了N個部分,有甲、乙、丙、丁四位用戶同時下載,那麼BT客戶端並不會完全從服務器下載這個文件的所有部分,而是根據實際情況有選擇地從其他用戶的機器中下載已下載完成的部分。例如甲已經下載了第1部分,乙已經下載了第2部分,那麼丙就會從甲的機器中下載第1部分,從乙的機器中下載第2部分,當然甲、乙、丁三位用戶也在同時從丙的機器中下載相應的部分,這就大大減輕了BT服務器的負荷,也同時加快了丙的下載速度,也就是說每臺參加下載的計算機既從其他用戶的計算機上下載文件,同時自身也向其他用戶提供下載,因此參與下載的用戶數量越多,下載速度也越高。
當然,爲了實現上述原理的快速分發,用戶需要使用BT客戶端進行下載,此外還需要有輔助服務器幫助用戶互相連接,也就是Tracker。

三、BitTorrent的系統結構

1、WWW服務器(或者其它能讓最終用戶獲得種子文件的服務):提供上傳和下載Torrent種子文件的功能。
2、Tracker:Tracker 是指運行於服務器上的一個服務程序,也稱 Tracker服務器。這個程序能夠追蹤到底有多少人同時在下載或上傳同一個文件。客戶端連上Tracker服務器,就會獲得一個正在下載和上傳的用戶的信息列表(通常包括IP地址、端口、客戶端ID等信息),根據這些信息,BT客戶端會自動連上別的用戶進行下載和上傳。
3、最終用戶web瀏覽器(或者其它能讓最終用戶獲得種子文件的軟件):提供上傳和下載Torrent種子文件的功能。
4、最終用戶下載軟件:泛指指運行在用戶自己電腦上的支持BitTorrent協議的程序。
5、Seed(****info file) :Torrent種子文件,擴展名爲.torren,,在製作完torrent文件後,發佈者可以使用 BitTorrent下載客戶端,進行Seed他們將會被加進 Tracker服務器的列表,其他人就可以從他那裏下載文件了。其包含了一些 BT下載所必須的信息:資源的名稱,如果是資源是以目錄形式,還有目錄樹中每個文件的路徑信息和文件名;如果資源是單個文件,這個文件的大小信息;如果是以目錄形式,目錄樹中每個文件的大小;對資源實際文件按照固定大小進行分塊後每塊進行SHA1 hash運算得到的若干特徵值的集合;Torrent文件的創建時間、製作者填寫的註釋、以及製作者的信息等;至少一個Announce地址(除非有 DHT網絡),對應於Internet上部署的一個Tracker服務器。有這個文件,用戶纔可以下載別人發佈的東西。Torrent文件通常很小,大約幾十K、幾百K大小不等。

四、BitTorrent的基本工作原理與流程

1、首先三中的1—5的功能必須具備,實際當中說源文件發佈軟件與最終用戶下載軟件就是一個軟件(以下簡稱BT客戶端),發佈Torrent種子文件也是通過WWW方式,因爲WWW方式最爲普及,也便於查詢,下面的介紹也是以WWW爲標準。
2、現在想發佈資料件的用戶(上傳者)需要用BT客戶端製作Torrent種子文件,製作種子文件需要指定要發佈的文件或者文件夾、Tracker服務器地址(Announce URL)、是否啓用DHT網絡(什麼是DHT網絡將在後面說明)、發佈者信息等,Torrent種子文件製作軟件將要發佈的內容分成若干塊(每塊大小相同,一般爲256KB或者1MB),然後計算每塊的哈希值(BitTorrent是使用的SHA1哈希軟法),該哈希值是用來區分不同的分塊的,Torrent種子文件主要包括announce 記錄、文件信息、文件名、目錄名長度、最後是片段長度、片段的 Sha1 校驗碼等信息(見Torrent種子文件格式)。
3、現在上傳者就可以把Torrent種子文件上傳到到WWW服務器,實際上Tracker一般都是內嵌WWW服務器的,也就是上傳Torrent種子文件到Tracker服務器,現在BT客戶端就可以上傳資料了。
4、當其它下載用戶(BT客戶端)下載到Torrent種子文件後,BT客戶端就根據 Torrent種子文件中的Announce 記錄找到Tracker服務器地址,BT客戶端連接到Tracker服務器(Tracker服務器提供服務的方式大部分都是HTTP兼容的,但也有使用 UDP的),發送Torrent種子文件的哈希信息和其它一些信息(見BT客戶端請求格式),Tracker服務器查找該哈希信息,如果找不到就作出相應的處理,如返回錯誤信息或者斷開連接。
5、如果在步驟4找到該哈希信息,Tracker服務器就會反連(NatCheck)客戶的IP地址和端口這樣就可以區分內網用戶還是公網用戶(如果是內網用戶,它是連不通的,因爲它會連到Nat服務器或者路由器上,結果就是連不通),然後服務器返回現在正在下載這個文件的所有公網用戶的IP地址和端口列表,返回給BT客戶端(也可能是部分客戶列表),最後如果該用戶是公網用戶 Tracker服務器會把用戶提交的IP地址和端口保存下來,這樣其它人就可以找到該用戶。
6、上面說到Tracker服務器只會返回公網的IP地址,現在來解釋一下內網用戶如何上傳數據,因爲BT是一個主動連接的軟件(即使已經下載完了,也不也會主動連接他人)下面是一個仿真流程:
1)內網用戶開始做Seed
2)服務器收到請求,由於是第一個所以也沒有Peer(對端,只一個TCP連接的一方)返回
3)公網用戶提交請求,由於Seed是內網用戶所以也沒有Peer返回,等待下載,但服務器會把它的IP放到列表中
4)內網經過設定的時間間隔後,再向服務器放出請求,得到上面得公網IP
5)得到公網IP後,內網馬上進行連接
6)公網用戶建立連接,數據開始傳輸 (實際上現在是公網用戶做服務器,內網用戶做客戶端)
7)其它內網用戶去上面公網用戶下載數據
7、BT客戶端得到這些其他用戶IP後,就可以直接連接到這些IP和端口下載資料了。BT客戶端會到所有的用戶去尋找自己要下載的東西。BT客戶端每找到一個用戶就建立一個Socket來下載,所以下載的人越多,速度就越快。
BT 客戶端下載一個文件並不是從一個服務器下載,而是通過中心Tracker服務器找到其他用戶,然後從不同用戶下載文件的不同部分,也就是實現分佈式下載,不過有中心服務器(Tracker服務器)協調的分佈式下載使系統更有效率,可能Tracker服務器會成爲瓶頸,但是由於BT客戶端的查詢內容簡單並且不是連續的查詢Tracker服務器,這就相當於增加Tracker服務器的負載能力。

五、Torrent文件(****info file)格式

Torrent文件格式使用了bencoding的數據表達方法,支持四種數據格式:字符串、整數、列表、字典。一個Torrent文件就是一個經過編碼的bencoding字典。
Bencoding格式如下:
對於字符串,首先是一個字符串的長度,然後是冒號,後面跟着實際的字符串,例如:4:spam,就是“spam”。
整數編碼如下,以 ‘i’開始,然後10進制的整數值,最後以’e’結尾。例如,i3e表示3,I-3e表示-3。整數沒有大小限制。I-0e是無效的。除了 i0e外,所有以0起始的整數都無效。I0e當然表示0。
列表編碼如下,以’l’開始,接下來是列表值的編碼(也採用bencoded編碼),最後以’e’結束。例如:l4:spam4:eggse 表示 [‘spam’,‘eggs’]。
字典編碼如下,以’d’開始,接下來是可選的keys和它對應的值,最戶以’e’結束。例如:d3:cow3:moo4:spam4:eggse,表示{‘cow’:’moo’,’spam’:’eggs’},而 d4:spaml1:al:bee 表示 {‘spam’:[‘a’,’b’]}。鍵值必須是字符串,而且已經排序(並非是按照字母順序排序,而是根據原始的字符串進行排序)。
1、Torrent文件基本格式
l info
包含文件信息的一個字典。info有單文件和多文件兩種,詳細說明見下。
l announce
tracker服務器地址。
l announce-list
可選,包含其他可用tracker服務器地址的列表。
l creation date
可選,torrent文件創建時間,UNIX標準格式,表示自UTC1970年1月1日0時以來的秒數。
l comment
可選,torrent創建者寫的備註。
l created by
可選,創建torrent文件的程序名和版本。
除以上外,Torrent文件可能還包含encoding、nodes等內容,大概是由後續版本的BT協議規定的。nodes有可能跟DHT有關。
2、Info字典格式
1)Info字典有兩種格式,以下爲兩種共有的部分:
l piece length
每塊數據的長度。
l pieces
字符串格式,長度除以20即爲總塊數,每20字節又表示1塊數據的SHA1值。
l private
值爲1或0的整數,可選。看不太懂什麼意思,似乎是說如該值爲1,則只能從torrent文件中指定的tracker服務器找別的peer,不設或爲0則不限制。
2)只包含一個文件的Info字典:
l name
文件名。
l length
文件長度。
l md5sum
可選,32字節長的文件MD5值。
3)包含多個文件的Info字典:
l name
存放文件的目錄名。
l files
包含多個字典的列表,每個字典表示一個文件的信息。
files列表中的每個字典包含的內容:
l length
文件長度。
l path
包含一個或多個字符串的列表。0到-2個表示文件目錄,最後一個表示文件名。例如["dir1", "dir2", "file.ext"]表示文件保存在dir1/dir2子目錄下,文件名爲file.ext。

六、BT客戶端請求格式

Trakcer 通過HTTP的GET命令的參數來接收信息,而響應給對方(也就是下載者)的是經過bencoded 編碼的消息。注意,儘管當前的tracker的實現需要一個web服務器,它實際上可以運行的更輕便一些,例如,作爲apache的一個模塊;而且現在還有使用UDP協議的Tracker服務器。
發送給Tracker的GET請求,包含以下關鍵字:
Info_hash:
元文件中info部分的sha hash,20字節長。這個字符創幾乎肯定需要被轉義(譯註:在URL中,有些字符不能出現,必須通過unicode進行編碼)
Peer_id:
下載者的id,一個20字節長的字符串。每個下載者在開始一次新的下載之前,需要隨機創建這個id。這個字符串通常也需要被轉義。
IP:
一個可選的參數,給出了peer的ip地址(或者dns名稱?)。通常用在origin身上,如果它和tracker在同一個機器上。
Port:
peer所監聽的端口。下載者通常在在 6881 端口上監聽,如果該端口被佔用,那麼會一直嘗試到 6889,如果都被佔用,那麼就放棄監聽。
Uploaded:
已經上載的數據大小,十進制表示。
Downloaded:
已經下載的數據大小,十進制表示
Left:
該peer還有多少數據沒有下載完,十進制表示。注意,這個值不能根據文件長度和已下載數據大小計算出來,因爲很可能是斷點續傳,如果因爲檢查文件完整性失敗而必須重新下載的時候,這也提供了一個機會。
Event:
一個可選的關鍵字,值是started、compted或者stopped之一(也可以爲空,不做處理)。如果不出現該關鍵字,。在一次下載剛開始的時候,該值被設置爲started,在下載完成之後,設置爲completed。如果下載者停止了下載,那麼該值設置爲 stopped。
Tracker的響應是用bencoded編碼的字典。如果tracker的響應中有一個關鍵字failure reason,那麼它對應的是一個字符串,用來解釋查詢失敗的原因,其它關鍵字都不再需要了。否則,它必須有兩個關鍵字:Interval:下載者在兩次發送請求之間的時間間隔。Peers:一個字典的列表,每個字典包括以下關鍵字:Peer id,IP,Port,分別對應peer所選擇的id、IP地址或者dns名稱、端口號。

七、BitTorrent其它應用分佈式系統的相關技術

文件下載片斷選擇是爲了提高系統的總效率,而阻塞算法是爲了提高個人用戶的公平性和效率,作爲取自於用戶並用之於用戶的分佈式系統,整個系統的效率和個人用戶的公平性至關重要,BitTorrent的片斷下載策略保證了最大的下載效率和穩健的完整性,而阻塞算法鼓勵個人用戶上傳。BitTorrent的阻塞算法並不記錄歷史,也就是對用戶以前的上傳、下載行爲沒有記錄,有些最先版本的BitTorrent已經能對帳戶的上傳、下載信息做出統計,然後轉化爲積分,但積分還沒有和用戶的下載優先級綁定,而且積分也只是簡單的統計上傳流量,上傳的內容和上傳的目標用戶也沒有分析,簡單的積分策略並不能應對五花八門Spamming技術,積分算法應該是上傳和下載流量的比數,且積分增加速度隨着上傳的不同目標用戶和不同上傳內容數量的增加而增加。
1、下載文件片斷的選擇(Piece Selection)
選擇一個好的順序來下載片斷,對提高性能非常重要。一個差的片斷選擇算法可能導致所有的片斷都處於下載中,或者另一種情況,沒有任何片斷被上載給其它 peers。
1)嚴格的優先級(Strict Priority)
片斷選擇的第一個策略是:一旦請求了某個片斷的子片斷,那麼該片斷剩下的子片斷優先被請求。這樣,可以儘可能快的獲得一個完整的片斷。
2)最少的優先(Rarest First)
對一個下載者來說,在選擇下一個被下載的片斷時,通常選擇的是它的peers們所擁有的最少的那個片斷,也就是所謂的“最少優先”。這種技術,確保了每個下載者都擁有它的peers們最希望得到的那些片斷,從而一旦有需要,上載就可以開始。這也確保了那些越普通的片斷越放在最後下載,從而減少了這樣一種可能性,即某個peer當前正提供上載,而隨後卻沒有任何的被別人感興趣的片斷了。也就說說,每個peer都優先選擇整個系統中最少的那些片斷去下載,而那些在系統中相對較多的片斷,放在後面下載,這樣,整個系統就趨向於一種更優的狀態。如果不用這種算法,大家都去下載最多的那些片斷,那麼這些片斷就會在系統中分佈的越來越多,而那些在系統中相對較少的片斷仍然很少,最後,某些 peer 就不再擁有其它 peer 感興趣的片斷了,那麼系統的參與者越來越少,整個系統的性能就下降。
在BT系統中,充分考慮了經濟學的概念,處處從整個系統的性能出發,參與者越多,系統越優化。
信息理論顯示除非種子上傳了文件的所有片斷,否則沒有任何下載者可以完成所有文件的下載。如果在一個部署中,只有一個種子,而且種子的上載能力比它的大多數下載者都要差,那麼,不同的下載者從種子那裏下載不同的片斷,性能就會變得比較好,因爲,重複的下載浪費了種子獲取更多信息的機會。“最少優先”使得下載者只從種子處下載新的片斷(也就是整個系統中其它peer都沒有的片斷),因爲,下載者能夠看到其它peers那裏已經有了種子已經上傳的片斷。
在某些部署中,原始的種子由於某些原因最終關閉,只好由剩下的這些下載者們來負責上傳。這樣顯然會帶來一個風險:某些片斷任何一個下載者都不擁有。“最少優先”也很好的處理了這種情況。通過儘快的複製最少的片斷,減少了這種由於當前的peers停止上載後帶來的風險。
3)隨機的第一個片斷(Random First Piece)
“ 最少優先”的一個例外是在下載剛開始的時候。此時,下載者沒有任何片斷可供上傳,所以,需要儘快的獲取一個完整的片斷。而最少的片斷,通常只有某一個peer擁有,所以,它可能比多個peers都擁有的那些片斷下載的要慢。因此,第一個片斷是隨機選擇的,直到第一個片斷下載完成,才切換到“最少優先”的策略。
4)最後階段模式(Endgame Mode)
有時候,從一個速率很慢的peer那裏請求一個片斷。在下載的中間階段,這不是什麼問題,但是卻可能潛在的延遲下載的完成。爲了防止這種情況,在最後階段,peer向它的所有的peers們都發送某片斷的子片斷的請求,一旦某些子片斷到了,那麼就會向其它peer發送 cancel 消息,取消對這些子片斷的請求,以避免帶寬的浪費。實際上,用這種方法並沒有浪費多少帶寬,而文件的結束部分也一直下載的非常快。
2、阻塞算法(Choking Algorithms)
BT 並不集中分配資源。每個peer自己有責任來儘可能的提高它的下載速率。Peers從它可以連接的peers處下載文件,並根據對方提供的下載速率給予同等的上傳回報(你敬我一尺,我敬你一丈)。對於合作者,提供上傳服務,對於不合作的,就阻塞對方。所以說,阻塞是一種臨時的拒絕上傳策略,雖然上傳停止了,但是下載仍然繼續。在阻塞停止的時候,連接並不需要重新建立。
阻塞算法並不屬於BT對等協議(指peers 之間交互的協議)的技術部分,但是對提高性能是必要的。一個好的阻塞算法應該利用所有可用的資源,爲所有下載者提供一致可靠的下載速率,並適當懲罰那些只下載而不上傳的peers。
1)帕累託效率(Pareto Efficiency)
在經濟學裏,帕累託效率可以這樣來定義:一種狀態(資源配置、社會制度等)被稱爲帕累托最優狀態,如果不存在另外一種可選擇的狀態使得沒有任何人的處境變差而至少有一個人的處境變得更好。這意味着,當滿足給定的約束條件,一種資源配置的狀態已經使沒有人能夠按照自己的偏好在不損害別人的條件下變得更好,那麼就是達到了帕累托最優狀態。可以通俗地理解爲,如果處於這種狀態:除非損人,就不能利己,這就達到了帕累托最優。在計算機領域,尋求帕累託有效是一種本地優化算法BitTorrent的阻塞算法,用一種針鋒相對的方式來試圖達到帕累托最優。(原文不太好翻譯,我簡化了)。Peers對那些向他提供上傳服務的peers給予同樣的回報,目的是希望在任何時候都有若干個連接正在進行着雙向傳輸。
2)BitTorrent的阻塞算法
從技術層面上說,BT的每個peer一直與固定數量的其它 peers 保持疏通(通常是4個),所以問題就變成了哪些peers應該保持疏通?這種方法使得TCP的擁塞控制性能能夠可靠的飽和上傳容量。(也就是說,儘量讓整個系統的上傳能力達到最大)。
嚴格的根據當前的下載速率來決定哪些peers應該保持疏通。令人驚訝的是,計算當前下載速率是個大難題。當前的實現實質上是一個每隔20秒的輪詢。而原來的算法是對一個長時間的網絡傳輸進行總計,但這種方法很差勁,因爲由於資源可用或者不可用,帶寬會變化的很快。
爲了避免因爲頻繁的阻塞和疏通 peers造成的資源浪費,BT每隔10秒計算一次哪個peer需要被阻塞,然後將這種狀態保持到下一個10秒。10秒已經足夠使得TCP來調整它的傳輸性能到最大。
3)開放檢測(Optimistic Unchoking)
如果只是簡單的爲提供最好的下載速率的peers們提供上載,那麼就沒有辦法來發現那些空閒的連接是否比當前正使用的連接更好。爲了解決這個問題,在任何時候,每個peer都擁有一個稱爲“optimistic unchoking”的連接,這個連接總是保持疏通狀態,而不管它的下載速率是怎樣。每隔30秒,重新計算一次哪個連接應該是“optimistic unchoking”。30秒足以讓上傳能力達到最大,下載能力也相應的達到最大。這種和針鋒相對類似的思想非常的偉大。“optimistic unchoking”非常和諧的與“囚徒困境”合作。
4)反對歧視(Anti-snubbing)
某些情況下,一個peer可能被它所有的peers都阻塞了,這種情況下,它將會保持較低的下載速率直到通過 “optimistic unchoking”找到更好peers。爲了減輕這種問題,如果一段時間過後,從某個peer那裏一個片斷也沒有得到,那麼這個peer認爲自己被對方 “怠慢”了,於是不再爲對方提供上傳,除非對方是“optimistic unchoking”。這種情況頻繁發生,會導致多於一個的併發的“optimistic unchoking”。
5)僅僅上傳(Upload Only)
一旦某個peer完成了下載,它不能再通過下載速率(因爲下載速率已經爲0了)來決定爲哪些 peers 提供上載了。目前採用的解決辦法是,優先選擇那些從它這裏得到更好的上載速率的peers。這樣的理由是可以儘可能的利用上載帶寬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章