別再問我什么是 BT 種子 (ペーパークリップ視頻文案轉(zhuǎn)載備份)
以下為ペーパークリップ視頻文案全文。
如果你想要下載一集小視頻,你會怎么做?
最簡單的方法當然是找一個有資源的哥們——比如說每羊,讓他把這期視頻發(fā)給你。早期互聯(lián)網(wǎng),大家就是這么共享文件的,但是這樣也有很多問題。

比如下載的人一多,每個人分配到的帶寬就變小了,下載速度會變慢。更危險的是,這個視頻是盜版資源,你的哥們本來就不應該分享給你,如果每羊被抓了,大家也都別下載了。

針對這些問題,美國工程師 Bram Cohen 在 2001 年發(fā)布了 BitTorrent 協(xié)議,資源不再由一個人或一個中心服務(wù)器提供,而是所有人提供給所有人,下載的人越多,速度越快。這種模式也叫 peer-to-peer(用戶群對用戶群),也就是我們常說的 P2P 下載。

BitTorrent 的核心思想是把文件分成很多個小塊,讓下載者互相連接。
以這支 117.3 MB 的視頻為例,被分成了 895 個 128kB 的文件塊后,下載了第 306 塊的用戶 A 就可以和下載了第 11 塊的用戶 B 交換彼此下載好的部分。參與的人越多,互相交換的就越密集,下載的越快。

為了做到這一點,BitTorrent 協(xié)議需要資源共享者生成一個包含下載信息的種子文件,后綴是 .torrent,這就是我們常說的 BT 種子。
種子文件包含文件的名字、大小,分塊后每塊文件的大小、哈希值,以及 Tracker 服務(wù)器的地址。

Tracker 很重要,通過 Tracker 我們才能找到其他下載者的聯(lián)系方式。
當你用下載軟件打開種子,就會開始聯(lián)系種子文件里內(nèi)置的 Tracker 服務(wù)器,告訴 Tracker 我要下載這個文件,服務(wù)器會記錄下你的 IP,并把其他正在下載或下載完成的人的 IP 返回給你,這樣你們就可以愉快的組隊下載了。

當然,如果沒有找到正在下載的人,資源發(fā)布者也不在線,你就只能以 0kb/s 的速度等著了。
不難發(fā)現(xiàn),Tracker 服務(wù)器是 P2P 網(wǎng)絡(luò)的弱點,如果 Tracker 被關(guān)閉或封禁,你就無法找到同伴,也難以完成下載。

為了擺脫對 Tracker 服務(wù)器的依賴,今天最流行的下載方式是磁力鏈接(Magnet URI scheme),通常是一串這樣的神秘代碼:

前面都是標準格式,最重要的是這 40 個 16 進制的數(shù)字。任何文件丟進哈希算法都能得到一串這樣字符,40 位、16 進制、只屬于這個文件。你可以把它當成一個文件 ID,它能幫我們找到我們要下載的東西。
磁力鏈接的本質(zhì)是把所有人都變成一個小型 Tracker,每個人都拿著一份動態(tài)更新的地址和文件信息。我找與我連接的 10 個人,他們再各自找 10 個人,一傳十十傳百、千、萬,最后是我找到小明小明找老王老王找郭冬臨郭冬臨找到每羊,我和每羊就連上線了。

但這種所有人找所有人的方案其實不太行,不僅占用了大量的資源,效率也非常低,還有可能重復傳播,造成廣播災難。
這時,就需要補充一個關(guān)鍵信息——距離。
注意,這里的距離,不是空間上的距離,而是邏輯上的距離。

重點來了!接下來,我會詳細解釋磁力鏈接使用的 DHT 網(wǎng)絡(luò)的構(gòu)建過程,有一點點難,但是真的非常有意思。讓我們開始吧。
剛剛說了,每個磁力鏈接都有一串唯一的文件 ID,可以產(chǎn)生 2 的 (4*40) 即 2 的 160 次方種組合,用只有 0 和 1 的二進制表示就是 160 個 0 和 1。

而每個節(jié)點也有一串 160 位的 0 和 1,作為節(jié)點 ID。根據(jù)這 160 位數(shù),我們可以計算節(jié)點和節(jié)點之間,節(jié)點和資源之間的距離。

假設(shè)每羊發(fā)布了一個文件,就能計算他所知道的節(jié)點 ID 與這個文件 ID 的距離,讓算出來最距離最短的節(jié)點再計算它知道的節(jié)點和文件 ID 的距離,重復這個過程,就能找到與文件 ID 的距離最短的一批節(jié)點 ID,把每羊提供的下載信息存在這里。

這樣,下載者也只要找到和文件 ID 距離接近的節(jié)點 ID,就能建立連接,開始下載。

但這個距離到底是怎么算出來的呢?
這就是有趣的地方了,用異或算法來計算節(jié)點之間的邏輯距離,相同就是 0,不同就是 1。
為了方便你理解,我們簡化一下模型,把 160 位縮減到 4 位。假設(shè)你的節(jié)點 ID 是 0100,目標節(jié)點 ID 是 1111,那么你們之間的二進制距離就是 1011,換算成十進制就是 11。

有了距離,我們就可以在一個這樣的二叉樹里快速查找目標了。

所有可能的節(jié)點 ID 都在這棵二叉樹上。4 位數(shù)需要分叉 4 次,生成 2 的 4 次方即 16 條路徑,每條路徑的終點,就是一個節(jié)點 ID。
接下來,你作為 0100,就可以拆分這顆二叉樹了,從第一次分叉開始,把不包含你的那棵子樹拆分,然后在剩下的子樹的第二次分叉處再次拆分,直到只剩下你自己。
這樣,就拆分出了 4 個子樹。

我們在每個子樹里選 2 個點,就得到了 4 個 K 桶——K-bucket。
暫停下來想想你就會發(fā)現(xiàn),用異或算法計算 0 號 K 桶和你的距離是 0001,換算成十進制就是1,1 號 K 桶里 2 個點和你的距離是 2-3,以此類推,2 號 K 桶的距離區(qū)間是 4-7,3 號 K桶的距離區(qū)間是 8-15。

我們剛剛算過,你的節(jié)點 ID 0110 和目標 ID 1111 之間的二進制距離是 1011,換算成十進制是 11,也就是說,離 1111 最近的,肯定是 3 號 K 桶里的 2 個節(jié)點。
接下來,我們就可以聯(lián)系這兩個節(jié)點,讓他們幫我們找 1111。

以 1110 為例。1110 也能拆分出 4 棵子樹,得到 4 個 K 桶,計算 1110 和 1111 之間的距離,結(jié)果是 0001,換算成十進制是 1,也就是在 0 號 K 桶,1111 就在這里。

這種網(wǎng)絡(luò)結(jié)構(gòu)被稱為 DHT,分布式哈希表(Distributed Hash Table),一個高寬容度的去中心化網(wǎng)絡(luò)。只需要一串文件 ID和存儲在本地的 K 桶數(shù)據(jù),你就可以高效的找到要下載的文件。
而資源的發(fā)布者和傳播者也只需要分享 40 個數(shù)字就好,足夠簡單,方便和隱私。
在真實的 DHT 網(wǎng)絡(luò),每個 K 桶至少記錄了 8 個節(jié)點,任何一個節(jié)點下線,都不會影響整個網(wǎng)絡(luò)的運行。

作為文件和節(jié)點 ID ,2 的 160 次方也足夠大,大到全地球 70 億人每秒下載 10000 個種子,也足夠下載百萬億年直到宇宙終結(jié)。
文中圖片均來自該文稿對應視頻《別再問我什么是 BT 種子 | ペーパークリップ》
全文2400字感謝你的耐心閱讀。
為轉(zhuǎn)載內(nèi)容,如有侵權(quán),我會立即刪除。
