IPFS的DHT表有兩種:公共(Public)和本地(Local)。
當很多用戶使用公開共享的DHT表去發現和廣播內容時,它們中有一些是在被分割的網絡中運作(比如在本地網絡或孤立的VPN)的。
對這些用戶而言,如果DHL表中的非公開節點只是客戶模式就會很麻煩,因為這些節點無法被連接,用戶無法與它們通信。
在這種情況下,我們設計了另一種DHT表,這種DHT表包括了一些不在公開網絡(比如VPN、CJDNS、Yggdrasil)中的節點。
我們將這種DHT表稱為LAN DHT,而將公開網絡的DHT表稱為WAN DHT。這兩種DHT表使用不同命名的DHT協議(比如 WAN DHT為/ipfs/kad/1.0.0,LAN DHT為/ipfs/lan/kad/1.0.0)以防止兩種網絡混在一起。
但如果用戶不恰當地配置了他們的網絡,則他們使用的非公開網絡有可能混為一團。
WAN DHT和LAN DHT在實現細節上的不同主要表現在DHT表對對等節點接受標準的不同,即什麼節點能被納入路由表中,什麼不能。WAN DHT的標準是「節點看上去是在公開網絡中」,而LAN DHT的標準是「節點看上去不在公開網絡中」。
WAN DHT表中的節點可以根據它們的工作狀況從客戶模式切換為伺服器模式,但LAN DHT中的節點則永遠只能是伺服器模式(除非「dhtclient」選項被設置)。
路由表:
早前我們分享過:Kademlia網絡中的每個對等節點都維繫著與網絡中其它若干節點的連接。它們的工作方式如下:
1. 當我們連接一個對等節點時,要檢查這個節點是否符合條件被加入到我們的路由表中。
- 保證對等節點處於伺服器模式,並且廣播DHT協議的ID符合標準(比如對WAN DHT是/ipfs/kad/1.0.0,對LAN DHT是/ipfs/lan/kad/1.0.0)。
- 保證對點節點的IP位址是公共地址(比如公共DHT表中的每個成員至少有一個公共的IP位址而不是只有類似192.168.X.Y這樣的地址)。
2. 如果一個節點滿足條件可以被加進路由表,接下來就要決定該節點在Kademlia地址空間中應該放在哪個「桶」(「bucket」)裡(比如節點在2^7和2^8之間,其地址空間為2^256,則節點在路由表中就應該放在定義為256-8的桶裡)。
3. 將該節點放入路由表
- 如果路由表中節點應該被放置的「桶」沒有滿(即該「桶」中放入的節點少於20個)則將該節點放入此桶中。
- 如果該桶已經滿了則我們要檢查這些節點中是否有可被替換出來的。如果有,就將可替換的節點拿出來,把新節點加入。如果沒有,就放棄這個桶。
4. 如果我們向路由表中的節點發出諮詢請求但得不到回應,則把該節點從表中拿走。
- 注意:每次刷新後,我們都要遍歷整個路由表並向最近沒有通信過的節點發出諮詢請求以檢查它們是否仍然在線、可被連接。一旦發現某節點掉線不再可被連接,則把它從表中刪除。
此外,為了保證路由表的準確,我們會每隔一段時間刷新它。對路由表刷新頻率的計算基於一系列參數如「桶」的大小等。
我們可以增加刷新的頻率,但它有個下限。對IPFS而言,其下限頻率為每10分鐘刷新一次。
參考連結:https://blog.ipfs.io/2020-07-20-dht-deep-dive/
本文來源: 金色財經 / 作者:FIL社區