本篇學習筆記以HTTP、FTP、P2P敘述與網上下載文件有關的協議node
須要掌握的要點:算法
首先簡述HTTP下載和FTP下載的區別:數據庫
咱們先要知道,使用Web瀏覽器時,這兩個協議之間的差別幾乎不會對使用的方便性及下載時間產生影響。不過,二者卻擁有各自不一樣的結構。瀏覽器
FTP即文件傳輸協議安全
FTP 採用兩個 TCP 鏈接來傳輸一個文件。服務器
另外一方面,FTP是爲了在特定主機之間「傳輸」文件而開發的協議。所以,在FTP通訊的起始階段,必須運行經過用戶ID和密碼確認通訊對方的認證程序,網絡
FTP下載和HTTP下載的區別之一就在與此。app
FTP 的兩種工做模式:分佈式
每傳輸一個文件,都要創建一個全新的數據鏈接。FTP 有兩種工做模式,分別是主動模式(PORT)和被動模式(PASV),這些都是站在 FTP 服務器的角度來講的。工具
不管是 HTTP 的方式,仍是 FTP 的方式,都有一個比較大的缺點,就是難以解決單一服務器的帶寬壓力, 由於它們使用的都是傳統的客戶端服務器的方式。
後來,一種創新的、稱爲 P2P 的方式流行起來。P2P就是peer-to-peer。資源開始並不集中地存儲在某些設備上,而是分散地存儲在多臺設備上。這些設備咱們姑且稱爲 peer。
想要下載一個文件的時候,你只要獲得那些已經存在了文件的 peer,並和這些 peer 之間,創建點對點的鏈接,而不須要到中心服務器上,就能夠就近下載文件。
一旦下載了文件,你也就成爲 peer 中的一員,你旁邊的那些機器,也可能會選擇從你這裏下載文件,因此當你使用 P2P 軟件的時候,例如 BitTorrent,每每可以看到,既有下載流量,也有上傳的流量,也即你本身也加入了這個 P2P 的網絡,本身從別人那裏下載,同時也提供給其餘人下載。
能夠想象,這種方式,參與的人越多,下載速度越快,一切完美。
可是有一個問題,當你想下載一個文件的時候,怎麼知道哪些 peer 有這個文件呢? 這就用到種子啦,也即我們比較熟悉的.torrent 文件。.torrent 文件由兩部分組成,分別是:announce(tracker URL)和文件信息。(tracker谷歌翻譯爲跟蹤器)
文件信息裏面有這些內容:
工做過程:
此時不須要其餘服務器參與,並分散了單個線路上的數據流量,所以減輕了服務器的負擔。
這個過程也能夠看出,這種方式特別依賴 tracker。tracker 須要收集下載者信息的服務器,並將此信息提供給其餘下載者,使下載者們相互鏈接起來,傳輸數據。
雖然下載的過程是非中心化的,可是加入這個 P2P 網絡的時候,都須要藉助 tracker 中心服務器,這個服務器是用來登記有哪些用戶在請求哪些資源。
因此,這種工做方式有一個弊端,一旦 tracker 服務器出現故障或者線路遭到屏蔽,BT 工具就沒法正常工做了。
爲了向完全去中心化邁步前進,後來就有了一種叫做DHT(Distributed Hash Table)的去中心化網絡。
每一個加入這個 DHT 網絡的人,都要負責存儲這個網絡裏的資源信息和其餘成員的聯繫信息,至關於全部人一塊兒構成了一個龐大的分佈式存儲數據庫。
有一種著名的 DHT 協議,叫Kademlia 協議。這個和區塊鏈的概念同樣,很抽象。
任何一個 BitTorrent 啓動以後,它都有兩個角色。一個是peer,監聽一個 TCP 端口,用來上傳和下載文件,這個角色代表,我這裏有某個文件。另外一個角色DHT node,監聽一個 UDP 的端口,經過這個角色,這個節點加入了一個 DHT 的網絡。
在 DHT 網絡裏面,每個 DHT node 都有一個 ID。這個 ID 是一個很長的串。每一個 DHT node 都有責任掌握一些知識,也就是文件索引,也即它應該知道某些文件是保存在哪些節點上。
它只須要有這些知識就能夠了,而它本身自己不必定就是保存這個文件的節點。