BitTorrent協議詳解
BitTrrent(簡稱BT)是壹種文件分發協議,通過URL識別內容,與網絡無縫集成。它在HTTP平臺上的優勢在於,壹個文件的下載者在下載的同時互相上傳數據,這樣文件源就可以在有限的負載增加的情況下支持大量下載者同時下載。
BT文件分發需要以下實體:
普通的網絡服務器
靜態元信息文件
BT追蹤器
“原始”下載器
網絡終端瀏覽器
網絡終端下載程序
假設在理想情況下,壹個文件有多個下載程序。
設置BT服務器的步驟如下:
1.開始運行Tracker(已經運行的跳過這壹步);
2.開始運行普通的網絡服務器端程序,比如Apache,已經運行的跳過這壹步;
3.將。網絡服務器上帶有mime type application/x-BitTorrent的torrent文件(如果關聯,請跳過此步驟);
4.創建元信息文件(。torrent文件)以及要發布的完整文件和Tracker的URL
5.將元信息文件放在網絡服務器上;
6.發布元信息文件的鏈接。torrent文件);
7.原下載器提供完整文件(原件)。
通過BT下載的步驟如下:
1.安裝BT客戶端程序(已經安裝的跳過這壹步);
2.上網;
3.單擊鏈接到。種子文件;
4.選擇本地存儲路徑,選擇要下載的文件(對於有選擇下載功能的BT客戶端用戶);
5.等待下載完成;
6.用戶退出下載(下載器之前沒有停止上傳)。
連接狀態如下:
網站正常提供靜態文件連接,在客戶端啟動BT程序;
Tracker即時接收下載者的所有信息,並給每個下載者壹個隨機的對等點列表。通過HTTP或HTTPS協議實現;
下載器每隔壹段時間連接Tracher壹次,告知其進度,並與那些直接連接的同行上傳下載數據。這些連接遵循BitTorrent對等協議,並通過TCP協議進行通信。
原下載器只上傳不下載。他擁有整個文件,因此有必要將文件的所有部分傳輸到網絡。在壹些熱門下載中,原下載器往往可以在短時間內退出上傳,其他已經下載完整文件的下載器會繼續提供上傳。
元信息文件和跟蹤器的響應信息都以簡單、高效和可擴展的格式傳輸(Bencoding)。b編碼信息嵌套在包含字符串和整數數據的字典和列表中(就像Python中壹樣)。可擴展性意味著可以通過減少字典忽略的鍵值來添加新特性。
b編碼規則如下:
字符串表示為十進制數,給定的字符串長度後跟壹個冒號。
比如4:spam相當於‘spam’。
整數數據用前面加‘I’,後面加‘e’來表示,中間加壹個小數,比如i3e相當於3,i-3e是-3。整數數據沒有長度限制。I-0e無效。所有以' i0 '開頭的都是無效的,除了i0e代表0。
列表用“l”編碼,後跟它包含的項目(已編碼),最後用“e”編碼,例如L4: spam4: eggs等於['spam ',' eggs']。
字典編碼為“d ”,後跟壹個可選鍵值及其對應的值列表,並在末尾添加壹個“e”。
比如d3:cow3:moo4:spam4:eggse相當於{'cow': 'moo ',' spam': 'eggs'}
D4:spaml1:a1:bee相當於{'spam': ['a ',' b']}
鍵值必須是經過處理的字符串(用原始字符串編碼,不與數字和字母混合)。
元信息文件是壹個字典,包含由B編碼的以下鍵值:
公告(聲明)
追蹤者的網址。
信息(信息)
該鍵值對應於包含以下鍵值的字典:
鍵值名稱對應於壹個字符串,該字符串表示默認下載文件或保存為目錄的名稱。這純粹是建議。
鍵值塊長度對應於文件被劃分成的塊的字節數。為了傳輸,文件被分成大小相等的塊,只是最後壹個塊通常較小。壹般來說,塊長是2的重量,大部分都假設塊長是256K(2是18次方)。
鍵值塊對應於長度為20的倍數的字符串。它可以被細分為多個字符串,每20個字節為壹段,分別對應於索引中的塊的SHA1校驗碼(hash)。
還有鍵值length和files,不能同時出現或者兩者都出現。當length出現時,表示這個元信息文件只是單個文件下載,否則表示是多文件目錄結構下載。
在單個文件的情況下,長度對應於文件長度的字節數。
多文件情況視為將多個單個文件按照文件列表的順序下載到壹個大文件中,鍵值files對應文件列表,文件列表是字典的列表,其中每個字典包含以下鍵值:
長度(長度)
文件長度的字節數。
路徑(路徑)
包含字符串的列表,字符串是子目錄名,最後壹項的字符串是文件名。
長度為零的長度形式是錯誤的。)
在單個文件的情況下,鍵值名是文件名;在多個文件的情況下,它成為目錄名。
追蹤者問題是雙向的。Tracker通過HTTP GET參數獲取信息,然後返回壹個B編碼的信息。雖然Tracker需要在服務器端執行,但是運行起來很流暢,就像Apache的壹個模塊。
Tracker的GET請求類似於壹個鍵值:
信息散列
20字節的SHA1驗證碼來自於B編碼元信息文件中的info值,B編碼元信息文件是元信息文件的壹個分支。該值會自動轉換。
對等標識
20字節長的字符串是每個用戶開始下載時隨機生成的ID。該值也會自動轉換。
互聯網協議(Internet Protocol的縮寫)
壹個可選參數給出了對等體所在的IP(或DNS主機名),它通常由Tracker所在的同壹臺機器上的原始下載器獲得,以便分發文件。
港口
至於監聽端口,官方默認是從端口6881開始。如果端口被占用,則依次推回壹個端口,找到壹個空閑端口,直到端口6889。
上傳
目前總上傳量編碼為十進制ASCII碼。
下載
目前總下載量編碼為十進制ASCII碼。
左邊的
未下載的字節數,編碼為十進制ASCII碼。這個數字不是用文件的長度和下載的次數來計算的,因為文件可能正在繼續,有些下載的數據無法通過完整性檢查,必須重新下載。
事件
這是壹個可選的鍵值,選項有啟動、完成或停止(或者空,相當於沒有運行)。如果它沒有運行,該語句將定期發出。下載開始時發出started值,下載完成時發出completed值。當文件完成時,它將再次啟動,並且沒有完成的問題。下載器停止下載時,會發出stopped。
Tracker的回應也是B碼字典。如果Tracker響應中有壹個鍵值失敗原因,會說明壹個人可以讀取的字符串信息對應的挑戰失敗的原因,不需要其他鍵值。否則,響應必須有兩個關鍵值:interval(間隔)對應於下載器發出常規請求的間隔秒數;對等體,對等體選擇的ID、IP地址或DNS主機名的字符串和端口號。請記住,如果對等點有事件或想要更多的對等點,它們不會在預定的時間間隔發送請求。
如果您想要擴展元信息文件或跟蹤器查詢,請與布拉姆·科恩協調,以確保所有擴展都是兼容的。
BitTorrent對等協議通過TCP協議運行。它可以順利運行,無需調整任何插座選項。
對等體之間連接是對稱的。從兩個方向發出的信息要協調,數據可以流入任何壹方。
對等協議是指壹個對等體從零開始下載,每次獲得元信息文件索引中描述的壹個塊並且驗證碼壹致,就向所有對等體聲明已經獲得。
連接的兩個終端有兩個狀態指示,是否阻塞,是否關註,是否阻塞是壹個通知,表示數據在解除阻塞之前不會發送出去。堵的原因和技術問題後面會講到。
數據傳輸發生在壹方關註另壹方,而另壹方沒有被屏蔽的情況下。註意狀態必須是壹致的——如果壹個未阻塞的對等體沒有其他人需要的數據,其他人就會失去對他的註意,而註意那些阻塞的對等體。完全實現這個條件需要非常小心,但是它確實讓下載者知道在擁塞消失後哪個對等體可以立即開始下載。
連接將逐漸斷開不感興趣和被阻止的對等體。
數據傳輸時,下載器要排隊很多請求,以獲得更高的TCP傳輸效率(這叫做“管理請求”)。另壹方面,不能寫入TCP緩沖區的請求應該立即放入內存,而不是應用程序級的網絡緩沖區。壹旦發生阻塞,所有這些請求都會被丟棄。
對等連接協議包括壹個握手,然後是壹個具有相同大小和確定性的恒定信息流。握手以字符19(十進制)開始,後跟字符串“BitTorrentprotocol”。初始字符的長度是固定的,我希望其他新協議也能做到這壹點,以區分它們。
之後,所有發送到協議中的整數都被編碼為壹個4字節的大停止符。
在現有的應用中,標題數據後面是8個字節,全部保留為0。如果您想通過更改這8個保留字節來擴展協議,請與布拉姆·科恩協調,以確保所有擴展都兼容。
然後是SHA1驗證碼(與info_hash向Tracker聲明的值相同,但這裏是原始值,有引用)在元信息文件中的B編碼info值中有20個字節長。如果值不同,則連接斷開。有壹個例外,下載者想用壹個端口下載多個連接,他們會先從接入連接得到壹個驗證碼,然後和列表進行比對,如果有相同的就回復。
驗證碼之後是20字節的對等體id,它包含在跟蹤器響應的對等體列表中,並在對跟蹤器的請求中報告。如果接收者的對等id不符合發送者的期望,則連接被斷開。
握手結束。隨後是固定長度的交互式信息流。零長度信息用於保持連接,被忽略。這種信息壹般2分鐘發壹次,但是等待數據的時候很容易超時。
所有非持久連接都由信息開頭的字節指定類型,可能的值如下:
0-阻塞
1-無障礙
2-關註
3-註意力不集中
4-是
5位組
6-請求
7街區
8-取消
對於“屏蔽”、“通暢”、“關註”、“不關註”等信息沒有負載。
“比特組”信息僅作為報頭信息發送。它加載壹個位組,下載器的索引設置為1,其他設置為0。沒有任何數據就開始下載的下載器跳過了“位組”信息。第壹個字節的高位對應索引0-7,依此類推,第二個字節對應8-15,依此類推。尾部的剩余位設置為0。
“已有”信息帶有壹個數字,即剛剛下載並檢查了驗證碼的索引的數量。
“請求”類信息包括索引、開始和長度。後兩個是字節偏移量。長度的權重壹般為2,除非被文件末尾截斷。當前功率壹般為15的2次方,功率長度大於2的17的連接關閉。
“取消”類的信息負載與“請求”類的信息負載相同。它通常在下載接近完成的“最後階段”發出。當下載幾乎完成時,剩余的塊傾向於從同壹個線程下載,這將非常慢。為了確保剩余塊被快速下載,壹旦還沒有決定向誰發送剩余塊的下載請求,則向從另壹方下載數據的所有連接器發送所有剩余塊的請求。為了避免低效率,每當壹個塊開始下載時,壹個取消消息被發送到其他對等體。
“塊”類信息包含索引、開始和塊。記住,它與“請求”信息有關。當傳輸速度較慢或“阻塞”和“暢通”信息以高頻率交替發出或兩者同時出現時,可能會被加載到不必要的塊中。
下載器下載塊的順序是隨機的,以便適當地防止下載器具有與其他對等體相同的塊子集或超集。
堵塞的原因有很多。TCP協議在向多個連接即時發送信息的過程中,信息擁塞控制非常差。同時,阻塞的存在使得下載者可以使用針鋒相對的算法來保證穩定的下載速率。
下面介紹的阻塞算法是目前的基本配置。重要的是,所有新算法不僅要在包含所有擴展算法的網絡中運行良好,而且要在主要包含這個基本算法的網絡中運行良好。
優秀的阻塞算法有許多標準。它必須阻塞壹定數量的同時上傳才能獲得良好的TCP性能,避免頻繁阻塞和平滑交替,這就是所謂的“纖維化”。它應該用數據交換來回報它對等方。最後,它應該偶爾嘗試與未使用的對等體連接,以找到比現有連接更好的連接,這稱為嘗試解除阻塞。
當前的阻止算法通過每10秒改變阻止列表來避免纖維化。疏通四個關註自己並能從他們那裏獲得最高下載率的同行,上傳交換數據。上傳率高但不關註下載者的對等點被解封。壹旦這些對等點開始被關註,那些上傳率最低的就會被屏蔽。如果下載者有壹個完整的文件,他使用自己的上傳速率而不是下載速率來決定誰解除連接。
在嘗試解封中,任何時候都有壹個對等體被解封,而不考慮他的上傳速率(如果他被關註,他將成為提供下載的四個對等體之壹)。這種試探性疏通的對等,每30秒輪換壹次。為了給他們壹個上傳整個塊的機會,新的連接將以三倍於循環中的嘗試次數開始。