BitTorrent是去中心化系統(tǒng)中被使用最廣,規(guī)模最大的一個,據(jù)稱曾同時支撐過上億的節(jié)點,占據(jù)了整個互聯(lián)網(wǎng)一半以上的網(wǎng)絡(luò)流量。它通過P2P網(wǎng)絡(luò)大大提升了大文件傳輸?shù)男?,它的核心思想是:?dāng)一個文件被下載之后,同時也能上傳給其他有需要的節(jié)點。
一個節(jié)點可以同時從幾十個節(jié)點處下載文件,從而可以達到很高的下載速度,我在學(xué)校使用最快能達到10MB/s,我暫時還不知道有什么其他方法能實現(xiàn)同樣速度的遠程文件傳輸。
那節(jié)點之間是如何建立連接的呢?我的客戶端是如何知道在其他地方哪里有我需要的文件呢?
這里需要引入一個中間人——tracker server。
tracker server
雖然BitTorrent是去中心化協(xié)議,但它也有一個中心化服務(wù)器,那就是tracker server,它負責(zé)整個BitTorrent網(wǎng)絡(luò)的調(diào)度。當(dāng)一個BitTorrent客戶端被打開,首先就會和tracker server建立連接。tracker server會將這個客戶端的IP地址和可以提供的文件記錄下來,當(dāng)其他節(jié)點和trakcer server建立連接時,tracker server也會做同樣的事情。trakcer server記錄了所有在線節(jié)點的狀態(tài),這和它名字也很想相符。
In order to learn the Internet locations of peers which may be sharing pieces, the client connects to the trackers named in the torrent file, and/or achieves a similar result through the use of distributed hash tables.[1]
下載文件需要用到種子文件(torrent file),種子文件包含了tracker server的地址和關(guān)于所要下載的文件的一些信息(比如文件哈希值)??蛻舳舜蜷_種子文件后,會向tracker server詢問哪些在線的節(jié)點能提供這個文件。tracker server返回滿足條件的節(jié)點的地址。然后,客戶端和這些節(jié)點建立連接、請求文件。
因為文件很大,所以可以將文件拆散成很多個小文件塊,從不同節(jié)點處下載不同的文件塊,這些下載任務(wù)同時進行。所有文件塊都下載好后,再拼接成完整的文件。但是文件是按照什么順序拼接的呢?哈希樹再次發(fā)揮了重要作用。哈希樹記錄了這些文件塊的哈希值,文件按照哈希樹的結(jié)構(gòu)進行拼接的。同時哈希樹還能用來驗證文件的完整性。
IPv4地址的匱乏
客戶端在互聯(lián)網(wǎng)中通信,得有一個唯一的IP地址才行。為了實現(xiàn)IP地址在全球范圍的唯一性,IP先統(tǒng)一由 Internet Assigned Numbers Authority(IANA) 分配給各個網(wǎng)絡(luò)供應(yīng)商(ISP),然后再由ISP分配給各個終端。IPv4地址是32位的2進制,最多提供2的32次方 (4,294,967,296) 個地址,現(xiàn)如今電腦、手機、服務(wù)器、物聯(lián)網(wǎng)設(shè)備都需要IP地址,已經(jīng)不夠用了。
由于IPv4地址的匱乏,大多數(shù)人并沒有公網(wǎng)地址,網(wǎng)絡(luò)供應(yīng)商(ISP)只給終端分配局域網(wǎng)地址。
- 局域網(wǎng)地址只在局域網(wǎng)內(nèi)具備唯一性
- 公網(wǎng)地址在整個互聯(lián)網(wǎng)內(nèi)具備唯一性
局域網(wǎng)內(nèi)的多個終端共用一個公網(wǎng)地址,通過這種分層結(jié)構(gòu),以實現(xiàn)IPv4地址不夠的條件下,網(wǎng)絡(luò)的繼續(xù)運轉(zhuǎn)。
但這會給P2P網(wǎng)絡(luò)帶來麻煩,P2P網(wǎng)絡(luò)需要節(jié)點之間建立直接的連接,首先得知道對方的地址,如果這個地址是很多終端共用的,就沒法確定目標(biāo)。引入擁有公網(wǎng)地址的中間人可以解決這個問題,幫助節(jié)點之間建立連接,但如果中間人是中心化的,就會讓P2P網(wǎng)絡(luò)沒有完全的去中心化。這也是為何使用WebRTC協(xié)議進行P2P視頻聊天,雙方得先和中間人建立連接的緣故。不過BitTorrent本來就用到了中間人tracker server,所以并沒有妨礙。
NAT
NAT是network address translator的縮寫,表示“網(wǎng)絡(luò)地址轉(zhuǎn)換器”。NAT使得多個終端共用一個公網(wǎng)地址,同時保證內(nèi)網(wǎng)的終端可以和外網(wǎng)的終端正常建立連接。它的做法是創(chuàng)建一個“地址轉(zhuǎn)換表”,將內(nèi)網(wǎng)地址和端口號轉(zhuǎn)換成公網(wǎng)地址和另外一個端口號。
當(dāng)局域網(wǎng)內(nèi)的終端向局域網(wǎng)外的終端請求建立連接時,NAT會記錄下這個請求的內(nèi)網(wǎng)地址和端口號。并在將請求發(fā)往公共網(wǎng)絡(luò)之前,先將報文的source address改成路由器的公網(wǎng)地址。同時為了對局域網(wǎng)內(nèi)不同終端相同端口號的請求進行區(qū)分,NAT給每個連接一個唯一的端口號。比如局域網(wǎng)內(nèi)有多個終端同時使用瀏覽器上網(wǎng),而瀏覽器的端口都是相同的,如果不改端口號進行區(qū)分,當(dāng)獲取到外網(wǎng)返回的數(shù)據(jù)時,就無法判斷該把數(shù)據(jù)返回到哪個終端。這和TCP協(xié)議使用端口號的原因相同,TCP協(xié)議根據(jù)端口號判斷接收到的數(shù)據(jù)該分配到哪個process。
地址和端口號都發(fā)生了更改,外部網(wǎng)絡(luò)看到的就是這個更改后的地址和端口。這個地址和端口的對應(yīng)表被記錄在NAT服務(wù)器,老的記錄會定期被清除,當(dāng)新的請求過來時會重新建立轉(zhuǎn)換關(guān)系并記錄。但是在一定時間內(nèi),轉(zhuǎn)換關(guān)系是固定的,所以這個請求對外的地址和端口號也是固定的。
所以為了實現(xiàn)局域網(wǎng)內(nèi)的節(jié)點之間的連接,需要BitTorrent客戶端和tracker server建立連接->局域網(wǎng)的NAT增加轉(zhuǎn)換表->tracker server記錄下客戶端的公網(wǎng)地址和轉(zhuǎn)換后的端口號,并提供給需要下載文件的客戶端。由于NAT的轉(zhuǎn)換表并不持久,所以tracker server記錄的端口號也得定期確認和更新。
"阿喀琉斯之踵"
因為BitTorrent需要用到中心化的服務(wù)器tracker server,這成為它的致命弱點。瑞士的海盜灣 https://thepiratebay.org/ 之前是世界最大的BT站之一,多次因為版權(quán)原因被關(guān)閉,如今只能通過暗網(wǎng)訪問(中心地址被隱藏)。之前之所以能夠被關(guān)閉,就是因為BitTorrent協(xié)議允許多個中心,而并不是完全的去中心化。tracker server和BT站都是中心化的,目前在國內(nèi)BitTorrent只限于在高校內(nèi)被廣泛使用。
The website faced several shutdowns and domain seizures, switching to a series of new web addresses to continue operating.[2]
按理來說,可以使用分布式哈希表(DHT)記錄節(jié)點的狀態(tài),代替tracker server,從而實現(xiàn)完全的去中心化,但是我目前使用BitTorrent過程中還沒有見過使用DHT的種子,DHT在實際使用中可能還是有些問題的。不過因為DHT很有趣,實現(xiàn)非常巧妙,也是IPFS的重要內(nèi)容,下次詳細講述一下。
衰落
BitTorrent自從2002年被創(chuàng)造,一度非?;馃幔紦?jù)了互聯(lián)網(wǎng)的一大半流量,但之后又快速衰落。
現(xiàn)在中心化的視頻網(wǎng)站(比如Youtube)占據(jù)互聯(lián)網(wǎng)的大部分流量,替代了BitTorrent的位置。很大程度上是因為中心化視頻網(wǎng)站通過CDN、負載均衡等優(yōu)化手段,能夠承載很大的并發(fā)量?;A(chǔ)設(shè)施成本很大,但是只要有合適的商業(yè)模式能夠支撐這些成本就行。
Youtube在2005年創(chuàng)辦,然后迅速被Google收購,依托Google強大的基礎(chǔ)設(shè)施,將網(wǎng)絡(luò)延伸到全球各個角落。據(jù)統(tǒng)計,Youtube已經(jīng)成為全球第二大高頻的搜索途徑[3],它的每月搜索次數(shù)比 Bing 和 Yahoo 加起來都多。
中心化的視頻網(wǎng)站提供了方便的搜索和在線觀看,一旦網(wǎng)絡(luò)問題被解決,就可以實現(xiàn)很好的用戶體驗;而BitTorrent由于版權(quán)問題,資源無法太集中,發(fā)展的太大就會被控告,內(nèi)容只能分散在各個小型的BT站,給下載者尋找資源帶來麻煩,而且觀看之前得還先下載。
隨著網(wǎng)絡(luò)基礎(chǔ)設(shè)施的完善和優(yōu)化,中心化視頻網(wǎng)站的網(wǎng)速問題得到解決,可以實現(xiàn)流暢的在線觀看高清視頻,這時候BitTorrent就不剩下多少優(yōu)勢了,逐漸被邊緣化。