計算機網絡--詳解P2P對等網絡(一)—BitTorrent協議

注:本篇文章內容借鑑自:淺入淺出BitTorrent協議,其中加入了博主的部分原創,感謝,侵刪~

對等網絡的概念

以下定義主要摘抄自維基百科與中科院計算技術研究所:

對等式網絡(peer-to-peer,簡稱P2P),又稱點對點技術,是無中心服務器、依靠用戶羣(peers)交換信息的互聯網體系。它的作用在於,網絡的參與者共享他們所擁有的一部分硬件資源(處理能力、存儲能力、網絡連接能力、打印機等),這些共享資源通過網絡提供服務和內容,能被其它對等節點(Peer)直接訪問而無需經過中間實體,減低以往網路傳輸中的節點,以降低資料遺失的風險。與有中心服務器的中央網絡系統不同,對等網絡中的每個用戶端既是資源(服務和內容)提供者(Server),又是資源獲取者(Client),任何一個節點無法直接找到其他節點,必須依靠其用戶羣進行信息交流。


對等網絡的模型

P2P網絡的簡易模型圖如下:

此處輸入圖片的描述

如圖,我們可以總結出P2P網絡的一些特徵:

  1. 非中心化:P2P是全分佈式系統,網絡中的資源和服務分散在所有的節點上,信息的傳輸和服務的實現都直接在節點之間進行,可以無需中間環節和服務器介入。
  2. 可擴展性:用戶可以隨時加入該網絡,系統的資源和服務能力隨之同步擴充。理論上其可擴展性幾乎可以認爲是無限的。
  3. 健壯性:因爲服務是分散在各個節點之間的,部分節點或網絡遭到破壞對其他部分的影響很小,故P2P具有耐攻擊、高容錯的特點。P2P網絡一般在部分結點失效時能夠自動調整整體拓撲,保持其它結點的連通性。P2P網絡通常都是以自組織的方式建立起來的,並允許結點自由地加入和離開。
  4. 高性價比:P2P架構可以有效地利用互聯網中散佈的大量普通結點,將計算任務或存儲資料分佈到所有結點上。利用其中閒置的計算能力或存儲空間,達到高性能計算和海量存儲的目的。
  5. 隱私保護:在P2P網絡中,由於信息的傳輸分散在各節點之間進行而無需經過某個集中環節,用戶的隱私信息被竊聽和泄漏的可能性大大縮小。
  6. 負載均衡:由於每個節點既是服務器又是客戶端,減少了傳統C/S模型中對服務器計算能力、存儲的要求,同時因爲資源分佈在多個節點,更好的實現了整個網絡的負載均衡。

BitTorrent協議

BitTorrent協議,簡稱BT協議,是一種互聯網上新興的P2P傳輸協議(即BT是一種特殊的P2P)。

出現的歷史原因

隨着全球接入互聯網人數的增長,對互聯網應用的服務端要求越來越高,吞吐量和併發量逐步加大。像國外的Google、Amazon,國內的阿里、百度等大型互聯網企業十分關注如何使用集羣、負載均衡等技術來提高網站的併發和吞吐量。但對於保存大文件給用戶下載的中小型網站,在互聯網爆發式增長下,用戶數量越來越多,傳輸的文件越來越大,使用一臺或幾臺服務器和傳統的FTP、HTTP協議難以滿足用戶對下載速度的需求(受限於龐大的用戶請求量、硬盤讀取速度、帶寬等)。BitTorrent協議解決了這些問題。

BT下載流程

無論是BT還是PT,還是FTP,都是一種下載方式,或者學術點的講法,叫文件傳輸。

BT下載通過一個P2P下載軟件(點對點下載軟件)來實現,克服了傳統下載方式的侷限性,具有下載的人越多,文件下載速度就越快的特點。其好處是不需要資源發佈者擁有高性能服務器就能迅速有效地把發佈的資源傳向其他的BT客戶軟件使用者,而且大多數的BT軟件都是免費的。

BT下載架構模型圖:

此處輸入圖片的描述

現在,我們已經清楚了BT下載的架構模型,對於BT下載流程的討論,我們跟隨BT協議所引出的三個問題來進行:

  1. 一個對等用戶如何找到具有自己想下載內容的其他對等用戶?
  2. 對等用戶們如何複製內容以便爲大家提供高速下載?
  3. 對等用戶們如何相互鼓勵上傳內容給他人同時爲自己下載內容?

1. B encode

在解決這三個問題之前,先簡單介紹下B encode,因爲在BitTorrent協議中的數據幾乎都是用B encode進行編碼的。它是一種作用類似於XML和JSON的數據組織格式,可以表達字符串、整數兩種基本類型,列表、字典兩種數據結構,它的語法規則十分簡單。

  • 字節串按如下方式編碼:

<以十進制ASCII編碼的串長度>:<串數據>
例:“4:spam”表示字節串“spam”

  • 整數按如下方式編碼:

i<以十進制ASCII編碼的整數>e
例:“i3e”表示整數“3”

  • 列表按如下方式編碼:

l<內容>e
開始的“l”與結尾的“e”分別是開始和結束分隔符。lists可以包含任何B編碼的類型,包括整數、串、dictionaries和其他的lists。
例:l4:spam4:eggse 表示含有兩個串的lists:[“spam”、“eggs”]

  • 字典按如下方式編碼:

d<內容>e
開始的“d”與結尾的“e”分別是開始和結束分隔符。注意鍵(key)必須被B編碼爲串。值可以是任何B編碼的類型,包括整數、串、lists和其他的dictionaries。鍵(key)必須是串,並且以排序的順序出現(以原始串排列,而不是以字母數字順序)。
例:d3:cow3:moo4:spam4:eggse表示dictionary { “cow” => “moo”, “spam” => “eggs” }

2. torrent文件與tracker服務器

現在,我們考慮上述中的第一個問題:一個對等用戶如何找到具有自己想下載內容的其他對等用戶?

在P2P網絡系統的最初階段,並不是所有的用戶都擁有所有的內容,首先需要一個內容的發佈者。作爲內容的發佈者,BitTorrent可以爲每個發佈者(內容提供商)創建一個內容描述文件,即.torrent文件,也就是我們平常所說的種子文件

種子文件是一種指定格式的文件,包含了兩類關鍵信息,一類信息是tracker服務器的URL,一類信息是一個大小相等的塊的清單。tracker服務器可以將用戶引導至種子文件的內容,也就是將用戶引導至擁有當前用戶所需下載內容的其他對等節點處,塊清單則組成了內容。

關於種子文件具體的組成結構,它使用B encode表示,整個是一個字典數據結構,它有多個key值,包括一些是可選的,這裏介紹最關鍵的上述兩類信息的鍵值對:

  • info:存儲資源文件的元信息
    • piece length
    • pieces
    • name/path
  • announce:描述tracker服務器的URL

info:info鍵對應的值又是一個字典結構,BT協議將一個文件分成若干塊,便於客戶端從各個主機下載各個塊。其中的piece length鍵值對錶示一個塊的長度,通暢情況下是2的n次方,根據文件大小有所權衡,通長越大的文件piece length越大以減少piece的數量,降低piece數量一方面降低了種子文件保存塊信息數目的大小,一方面也減少了下載時需要對塊做的確認操作,加快下載速度。目前塊的大小通常是256KB,512KB或者1MB。

pieces:表示每個塊的正確性驗證信息,每一塊均對應一個唯一的SHA1散列值。該鍵對應的值是所有塊的SHA1散列值(每個塊所對應的散列值大小爲20字節)連接而成的字符串。

name/path:表示具體文件的信息。因爲BitTorrent協議允許將數個文件和文件夾作爲一個BT下載進行發佈,因此下載方可以根據需要勾選某一些下載文件。注意,這裏將數個文件也砍成一個數據流,因此一個piece如果在文件邊界上,可能包含不同文件的信息。

announce:保存的是tracker服務器的URL,在一些擴展協議中,announce可以保存多個tracker服務器作爲備選。

生成好種子文件之後,爲了下載由種子文件所描述的內容,一個對等用戶首先需要和此種子文件取得聯繫。這個種子文件通常被放在服務器上,可以通過HTTP或者FTP協議供用戶下載這個種子文件。相比於直接將整個資源文件提供給用戶下載,只傳輸一個種子文件大大降低了服務器的負荷。

在取得種子文件後,我們可以通過BitTorrent協議提供的一些工具(BitTorrent軟件客戶端)來打開這個種子文件,客戶端會根據種子文件的name/path元信息告訴我們這個種子文件可以下載到(假設)一個.mkv文件,一個字幕文件,在這個階段我可以進行一些勾選,選擇下載某些而不是全部的資源。

資源選擇確定後,客戶端就開始了下載。客戶端的第一步任務根據種子文件上的tracker服務器的URL使用HTTP進行GET請求——tracker服務器維護着一個正在主動上傳和下載該內容的所有其他對等用戶列表,我們將這一組對等用戶稱爲用戶羣,對等用戶可以隨時離開羣(以及返回),只要他們及時向tracker服務器進行報告即可——這個請求包含了很多參數,這裏只介紹從客戶端發送到tracker的請求中最關鍵的幾個參數。

  • info_hash
  • peer_id
  • ip
  • port

info_hash:種子文件中info鍵所對應的值的SHA1散列,可以被tracker服務器用來索引唯一的對應資源。

peer_id:20Byte的串,沒有任何要求,被tracker服務器用於記錄客戶端的名字。

ip:可以從HTTP GET請求中直接獲取,放在參數中可以解決使用代理進行HTTP GET的情況,tracker服務器可以記錄客戶端的IP地址。

port:客戶端監聽的端口號,用於接收Response。一般情況下爲BitTorrent協議保留的端口號:6881-6889,tracker服務器會記錄下端口號用於通知其他客戶端。

在tracker服務器收到客戶端的HTTP GET請求後,會返回B encode形式的text/plain文本,同樣是一個字典數據結構,其中最關鍵的一個鍵值對是peers,它的值是個字典列表結構,列表中的每一項都是如下的字典結構:

  • peers
    • peer_id
    • ip
    • port

這些信息在每個客戶端連接tracker服務器的時候都發送過,並且被Tracker服務器保存了下來。新來的客戶端自然要獲取到這些下載中或者已下載完的客戶端的ip,port等信息,有了這些信息,客戶端就不需要像FTP或者HTTP協議一樣持續找服務器獲取資源,可以從這些其他客戶端上請求獲取資源。

3. peer to peer

如上所述,如果對第一個問題進行簡單的總結,那麼自己想要下載的內容就交由種子文件進行確定,而如何尋找擁有這些資源的其他對等用戶,則需要tracker服務器的幫助。

那麼,我們現在思考第二個問題:對等用戶們如何複製內容以便爲大家提供高速下載?

客戶端從tracker服務器獲取到若干其他下載者(peer)的ip和port信息,會進行請求並維持跟每一個peer的連接狀態。一個客戶端和每一個peer的狀態主要有下列狀態信息:

  • choke:遠程客戶端拒絕響應本客戶端的任何請求。
  • interested:遠程客戶端對本客戶端的數據感興趣,當本客戶端unchoked遠程客戶端後,遠程客戶端會請求數據。

所以應該有4個參數,分別表示本客戶端對遠程客戶端是否choke,是否interested,遠程客戶端對本客戶端是否choke,是否interested。當一個客戶端對一個遠程peer感興趣並且那個遠程peer沒有choke這個客戶端,那麼這個客戶端就可以從遠程peer下載塊(block)。當一個客戶端沒有choke一個peer,並且那個peer對這個客戶端感興趣時,這個客戶端就會上傳塊(block)。

補充一點:由於內容發佈者本來就擁有所有的塊,因此在生成種子文件的時候,內容發佈者首先會根據種子文件將內容重新下載一遍,在這個過程中就會聯繫tracker服務器,然後將自己的信息記錄在其所維護的用戶列表上。

其實上述所講的概念已經解答了第二個問題,每一個對等節點在參與一個用戶羣期間,都可同時從其他對等節點處下載缺少的塊,並給其他對等節點上傳本身擁有並且他們所需要的塊。如果每個對等節點都這樣做,那麼經過短暫的一段時間後,所有的塊都將成爲廣泛可用——加入用戶羣的用戶越多,塊被交易的越頻繁,下載速度越快。

對第二個問題的答案進行一個簡單的總結:對等用戶們通過在下載塊的同時也會上傳塊,從而爲大家提供高速下載。

我們再進行一些補充,上面也提到了,在交易塊的過程中,端與端之間會進行通信:

首先會發送握手報文,告訴遠程客戶端本客戶端的一些信息,包括info_hash和peer_id。

接下來的所有報文有如下幾種類型:

  • keep-alive:告訴遠程客戶端這個通信還在維持,否則超過2分鐘沒有任何報文遠程客戶端會將通信關閉
  • choke
  • unchoke
  • interested
  • not interested
  • bitfield:告訴對方我已經有的piece
  • have:告訴對方某個piece已經成功下載並且通過hash校驗
  • request:請求某個塊(block)
    • index: 整數,指定從零開始的piece索引
    • begin: 整數,指定piece中從零開始的字節偏移
    • length: 整數,指定請求的長度
  • piece:返回請求的塊(block)的數據,是真正的資源信息
    • index: 整數,指定從零開始的piece索引
    • begin: 整數,指定piece中從零開始的字節偏移
    • block: 數據塊

經過這些報文在本地客戶端和若干個遠程客戶端之間的來回傳遞,就能夠獲取到資源文件。

4. PT下載

在解決了前兩個問題之後,我們來考慮第三個問題:對等用戶們如何相互鼓勵上傳內容給他人同時爲自己下載內容?

我們也可以看到,在P2P網絡中,起初必須有一個內容的提供者,並且在健康的P2P網絡中,每個peer都應當同時扮演客戶端與服務器兩個角色,那些只想從系統中獲取資源而沒有實物貢獻的節點我們稱之爲“搭便車”或“吸血鬼”,如果這樣的用戶太多,那系統將無法正常工作。

PT全稱Private Tracker,與BT最大的不同點分別爲可進行私密範圍下載,及可統計每個用戶的上傳及下載量。從技術上可以簡單的看作有一個tracker服務器會對用戶的下載上傳進行統計,分享率不夠就禁止用戶下載,在一定程度上可以防止只下載而不上傳的用戶存在。關於PT下載更詳細的內容,博主不在這裏進行討論,有興趣的同學可以自行查閱相關資料。


一個有趣的小問題

迅雷作爲國內首屈一指的BT下載工具,爲什麼有時在下載接近完成的最後,一些數據總是傳輸的非常慢呢?

基於現實情況分析,有些人下載完成後關掉下載任務,提供較少量數據給其他用戶,爲儘量避免這種行爲,在非官方BitTorrent協議中存在超級種子的算法。這種算法允許文件發佈者分幾步發佈文件,發佈者不需要一次提供文件所有內容,而是慢慢開放下載內容的比例,延長下載時間。此時,速度快的人由於未下載完必須提供給他人數據,速度慢的人有更多機會得到數據。由此往往造成用戶卡在任務的99%,下載1G的任務要上傳3G之多的數據。


總結

  1. 熟悉P2P網絡的特點及優勢;
  2. 熟悉BitTorrent協議的基本內容;
  3. 熟悉BT下載的過程(種子文件以及tracker服務器);
  4. 掌握諸如用戶羣吸血鬼等名詞含義;
  5. 瞭解種子文件的組成格式——B編碼;
  6. 瞭解peer與peer之間的通信報文格式;
  7. 能獨立回答出關於BitTorrent協議的三個問題。

參考閱讀

計算機網絡(第五版) — Andrew S. TanenBaum/David J. Wetherall

淺入淺出BitTorrent協議

P2P(對等網絡)、PT下載與BT下載

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