本篇學習筆記以HTTP、FTP、P2P敘述與網上下載文件有關的協議
需要掌握的要點:
- 下載一個文件可以使用 HTTP 或 FTP,這兩種都是集中下載的方式,而 P2P 則換了一種思路,采取非中心化下載的方式
- P2P 也是有兩種,一種是依賴於 tracker 的,也即元數據集中,文件數據分散;另一種是基於分布式的哈希算法,元數據和文件數據全部分散
HTTP與FTP
首先簡述HTTP下載和FTP下載的區別:
我們先要知道,使用Web瀏覽器時,這兩個協議之間的差異幾乎不會對使用的方便性及下載時間產生影響。不過,兩者卻擁有各自不同的結構。
HTTP下載
- HTTP是一種為了將位於全球各個地方的Web服務器中的內容發送給不特定多數用戶而制訂的協議。也就是說,可以把HTTP看作是旨在向不特定多數的用戶“發放”文件的協議。
- HTTP使用於從服務器讀取Web頁面內容。Web瀏覽器下載Web服務器中的HTML文件及圖像文件等,並臨時保存在個人電腦硬盤及內存中以供顯示。
- 使用HTTP下載軟件等內容時的不同之處只是在於是否以Web瀏覽器顯示的方式保存,還是以不顯示的方式保存而已。結構則完全相同。因此,只要指定文件,任何人都可以進行下載。
FTP下載
FTP即文件傳輸協議
FTP 采用兩個 TCP 連接來傳輸一個文件。
- 控制連接:服務器以被動的方式,打開眾所周知用於 FTP 的端口 21,客戶端則主動發起連接。該連接將命令從客戶端傳給服務器,並傳回服務器的應答。常用的命令有:list——獲取文件目錄;reter——取一個文件;store——存一個文件。
- 數據連接:每當一個文件在客戶端與服務器之間傳輸時,就創建一個數據連接。
另一方面,FTP是為了在特定主機之間“傳輸”文件而開發的協議。因此,在FTP通信的起始階段,必須運行通過用戶ID和密碼確認通信對方的認證程序,
FTP下載和HTTP下載的區別之一就在與此。
FTP 的兩種工作模式:
每傳輸一個文件,都要建立一個全新的數據連接。FTP 有兩種工作模式,分別是主動模式(PORT)和被動模式(PASV),這些都是站在 FTP 服務器的角度來說的。
P2P
無論是 HTTP 的方式,還是 FTP 的方式,都有一個比較大的缺點,就是難以解決單一服務器的帶寬壓力, 因為它們使用的都是傳統的客戶端服務器的方式。
后來,一種創新的、稱為 P2P 的方式流行起來。P2P就是peer-to-peer。資源開始並不集中地存儲在某些設備上,而是分散地存儲在多台設備上。這些設備我們姑且稱為 peer。
P2P定義
- Peer-to-peer 是一類允許一組用戶互相連接並直接從用戶硬盤上獲取文件的網絡
- Peer-to-peer網絡是一個運行於個人電腦上的應用,通過網絡在用戶間分享文件。P2P網絡通過連接個人電腦分享文件而不是通過中央服務器
- P2P是一種分布式網絡,網絡的參與者共享他們所擁有的一部分硬件資源(處理能力、存儲能力、網絡連接能力、打印機等),這些共享資源需要由網絡提供服務和內容,能被其它對等節點(peer)直接訪問而無需經過中間實體。在此網絡中的參與者既是資源(服務和內容)提供者(server),又是資源(服務和內容)獲取者(client)
P2P特點
- 無中央服務器,打破了C/S模式
- 用戶之間互聯並分享文件。
P2P分類
- 提供文件和其他內容共享的P2P網絡,如Napster、Gnutella、eDonkey、emule、BitTorrent等;
- 挖掘P2P對等計算能力和存儲共享能力,如SETI@home、Avaki、Popular Power等;
- 基於P2P方式的協同處理與服務共享平台,如JXTA、Magi、Groove、.NET My Service等;
- 即時通訊交流,包括ICQ、QICQ、Yahoo Messenger等;
- 安全的P2P通訊與信息共享,如Skype、Crowds、Onion Routing等。
BitTorrent
想要下載一個文件的時候,你只要得到那些已經存在了文件的 peer,並和這些 peer 之間,建立點對點的連接,而不需要到中心服務器上,就可以就近下載文件。
一旦下載了文件,你也就成為 peer 中的一員,你旁邊的那些機器,也可能會選擇從你這里下載文件,所以當你使用 P2P 軟件的時候,例如 BitTorrent,往往能夠看到,既有下載流量,也有上傳的流量,也即你自己也加入了這個 P2P 的網絡,自己從別人那里下載,同時也提供給其他人下載。
可以想象,這種方式,參與的人越多,下載速度越快,一切完美。
種子(.torrent)文件
但是有一個問題,當你想下載一個文件的時候,怎么知道哪些 peer 有這個文件呢? 這就用到種子啦,也即咱們比較熟悉的.torrent 文件。.torrent 文件由兩部分組成,分別是:announce(tracker URL)和文件信息。(tracker谷歌翻譯為跟蹤器)
文件信息里面有這些內容:
- info 區:這里指定的是該種子有幾個文件、文件有多長、目錄結構,以及目錄和文件的名字
- Name 字段:指定頂層目錄名字
- 每個段的大小:BitTorrent(簡稱 BT)協議把一個文件分成很多個小段,然后分段下載
- 段哈希值:將整個種子中,每個段的 SHA-1 哈希值拼在一起
工作過程:
- 下載時,BT 客戶端首先解析.torrent 文件,得到 tracker 地址,然后連接 tracker 服務器。
- tracker 服務器回應下載者的請求,將其他下載者(包括發布者)的 IP 提供給下載者。
- 下載者再連接其他下載者,根據.torrent 文件,兩者分別對方告知自己已經有的塊,然后交換對方沒有的數據。
此時不需要其他服務器參與,並分散了單個線路上的數據流量,因此減輕了服務器的負擔。
這個過程也可以看出,這種方式特別依賴 tracker。tracker 需要收集下載者信息的服務器,並將此信息提供給其他下載者,使下載者們相互連接起來,傳輸數據。
雖然下載的過程是非中心化的,但是加入這個 P2P 網絡的時候,都需要借助 tracker 中心服務器,這個服務器是用來登記有哪些用戶在請求哪些資源。
所以,這種工作方式有一個弊端,一旦 tracker 服務器出現故障或者線路遭到屏蔽,BT 工具就無法正常工作了。
去中心化網絡(DHT)
為了向徹底去中心化邁步前進,后來就有了一種叫作DHT(Distributed Hash Table)的去中心化網絡。
每個加入這個 DHT 網絡的人,都要負責存儲這個網絡里的資源信息和其他成員的聯系信息,相當於所有人一起構成了一個龐大的分布式存儲數據庫。
有一種著名的 DHT 協議,叫Kademlia 協議。這個和區塊鏈的概念一樣,很抽象。
任何一個 BitTorrent 啟動之后,它都有兩個角色。一個是peer,監聽一個 TCP 端口,用來上傳和下載文件,這個角色表明,我這里有某個文件。另一個角色DHT node,監聽一個 UDP 的端口,通過這個角色,這個節點加入了一個 DHT 的網絡。
在 DHT 網絡里面,每一個 DHT node 都有一個 ID。這個 ID 是一個很長的串。每個 DHT node 都有責任掌握一些知識,也就是文件索引,也即它應該知道某些文件是保存在哪些節點上。
它只需要有這些知識就可以了,而它自己本身不一定就是保存這個文件的節點。