摘要:要完成這些,實(shí)現(xiàn)必須支持中繼,雖然它應(yīng)該是可選的,并且能夠被終端用戶關(guān)閉連接中繼應(yīng)該作為傳輸來(lái)實(shí)現(xiàn),以便對(duì)上層透明中繼的實(shí)現(xiàn),可參考啟用多種網(wǎng)絡(luò)拓?fù)洳煌南到y(tǒng)有不同的需求,進(jìn)而導(dǎo)致不同的拓?fù)浣Y(jié)構(gòu)。
目前進(jìn)度為80%, 持續(xù)更新...
1 介紹在開(kāi)發(fā)IPFS(星際文件系統(tǒng))的過(guò)程中,我們遇到了很多在異構(gòu)設(shè)備之上運(yùn)行分布式文件系統(tǒng)所帶來(lái)的若干挑戰(zhàn),這些設(shè)備具有不同的網(wǎng)絡(luò)設(shè)置和能力。在這個(gè)過(guò)程中,我們必須重新審視整個(gè)網(wǎng)絡(luò)堆棧和詳細(xì)的解決方案,以克服由多個(gè)網(wǎng)絡(luò)層級(jí)和多種協(xié)議設(shè)計(jì)所施加的障礙,而不打破兼容性或再造技術(shù)。
為了構(gòu)建這個(gè)庫(kù),我們專注于獨(dú)立解決問(wèn)題,創(chuàng)建具有復(fù)雜抽象的復(fù)雜的解決方案,當(dāng)把關(guān)注點(diǎn)進(jìn)行組合時(shí),可以為P2P對(duì)等應(yīng)用程序提供一個(gè)可靠的工作環(huán)境。
1.1 動(dòng)機(jī)
libp2p 是我們建立分布式系統(tǒng)的集體經(jīng)驗(yàn)的結(jié)果,因?yàn)樗鼘?duì)開(kāi)發(fā)者負(fù)責(zé),決定他們希望應(yīng)用程序如何與網(wǎng)絡(luò)中的其他人進(jìn)行交互,并支持配置和可擴(kuò)展性,而不是對(duì)網(wǎng)絡(luò)SETU做出假設(shè)。P.
本質(zhì)上,使用LIPP2P的對(duì)等體應(yīng)該能夠使用各種不同的傳輸來(lái)與另一個(gè)對(duì)等體通信,包括連接中繼,以及在不同的協(xié)議上進(jìn)行協(xié)商,按需協(xié)商。
1.2 目標(biāo)libp2p 規(guī)范及其實(shí)現(xiàn)的目標(biāo)是:
允許使用各種:
傳輸協(xié)議: TCP、UDP、SCTP、UDT、UTP、QIC、SSH等
認(rèn)證傳輸協(xié)議:TLS,DTLS,CurveCP,SSH等
高效使用套接字(連接重用)
使對(duì)等體之間的通信在一個(gè)套接字上復(fù)用(避免握手開(kāi)銷)
使用協(xié)商過(guò)程使多種協(xié)議和不同協(xié)議版本在對(duì)等體之間使用
向后兼容
能在現(xiàn)有系統(tǒng)中工作
利用當(dāng)前網(wǎng)絡(luò)技術(shù)的全部能力
有 NAT 穿透功能
允許中繼連接
啟用加密通道
有效利用底層傳輸(例如本地流復(fù)用、本地AUTH等)。
?本節(jié)向讀者介紹了網(wǎng)絡(luò)棧的可用協(xié)議和體系結(jié)構(gòu)。我們的目標(biāo)是提供推斷結(jié)論的基礎(chǔ),并理解為什么 libp2p 提出了這些需求和體系結(jié)構(gòu).
2.1 客戶端-服務(wù)器模型客戶端-服務(wù)器模型表明信道兩端的雙方具有不同的角色,它們支持不同的服務(wù)和/或具有不同的能力,或者換句話說(shuō),他們講不同的協(xié)議。
構(gòu)建客戶機(jī)-服務(wù)器應(yīng)用程序成為主流趨勢(shì)有以下幾個(gè)原因:
數(shù)據(jù)中心內(nèi)部的帶寬遠(yuǎn)遠(yuǎn)高于客戶端可以互相連接的帶寬。
數(shù)據(jù)中心資源相當(dāng)便宜,由于有效的使用和散裝備貨。
開(kāi)發(fā)人員和系統(tǒng)管理員更容易對(duì)應(yīng)用程序進(jìn)行細(xì)粒度的控制。
減少了要處理的異構(gòu)系統(tǒng)的數(shù)量(雖然這個(gè)數(shù)字仍然相當(dāng)可觀)。
像NAT這樣的系統(tǒng)使得客戶機(jī)很難彼此查找并進(jìn)行通信,迫使開(kāi)發(fā)者執(zhí)行非常聰明的hack來(lái)穿透這些障礙
Protocols started to be designed with the assumption that a developer will create a client-server application from the start.
我們甚至學(xué)會(huì)了如何使用Internet上的網(wǎng)關(guān)隱藏分布式系統(tǒng)的所有復(fù)雜性,使用協(xié)議來(lái)執(zhí)行點(diǎn)對(duì)點(diǎn)操作(如HTTP),使得應(yīng)用程序不透明地查看和理解每一次調(diào)用的服務(wù)調(diào)用級(jí)聯(lián).
libP2P提供了一種從客戶端-服務(wù)器偵聽(tīng)器向撥號(hào)器偵聽(tīng)器交互的方法,其中不隱含哪些實(shí)體、撥號(hào)器或偵聽(tīng)器具有哪些能力或能夠執(zhí)行哪些操作。現(xiàn)在在兩個(gè)應(yīng)用程序之間建立連接是一個(gè)需要解決的多層問(wèn)題,并且這些連接不應(yīng)該有目的偏向,而應(yīng)該支持多個(gè)其他協(xié)議來(lái)工作在已建立的連接之上。在客戶機(jī)-服務(wù)器模型中,發(fā)送來(lái)自客戶端的先前請(qǐng)求的服務(wù)器被稱為推送模型,它通常會(huì)增加更多的復(fù)雜性;相比之下,在撥號(hào)偵聽(tīng)器模型中,兩個(gè)實(shí)體可以獨(dú)立地執(zhí)行請(qǐng)求。
2.2 通過(guò)解決方案對(duì)網(wǎng)絡(luò)棧協(xié)議進(jìn)行分類在深入到LIPP2P協(xié)議之前,重要的是了解已經(jīng)廣泛使用和部署的協(xié)議的多樣性,這有助于維護(hù)今天的簡(jiǎn)單抽象。例如,當(dāng)我們考慮HTTP連接時(shí),人們可能天真地認(rèn)為HTTP/TCP/IP是涉及的主要協(xié)議,但實(shí)際上更多的協(xié)議參與進(jìn)來(lái),這取決于使用情況、涉及的網(wǎng)絡(luò)等。諸如DNS、DHCP、ARP、OSPF、以太網(wǎng)、802.11(Wi-Fi)等許多協(xié)議都涉及進(jìn)來(lái)。看看ISPs內(nèi)部網(wǎng)絡(luò),會(huì)發(fā)現(xiàn)更多的信息.
此外,值得注意的是,傳統(tǒng)的7層OSI模型表征不適合于 libp2p. 作為替代的是,我們基于它們的角色來(lái)分類協(xié)議,即它們解決的問(wèn)題。OSI模型的上層面向應(yīng)用之間的點(diǎn)對(duì)點(diǎn)鏈路,而 libp2p 協(xié)議在各種不同的安全模型下更傾向于具有不同功能,不同大小的網(wǎng)絡(luò)。不同的 libp2p 協(xié)議可以具有相同的角色(在OSI模型中,這將是“地址相同的層”),這意味著多個(gè)協(xié)議可以同時(shí)運(yùn)行,所有處理一個(gè)角色(而不是傳統(tǒng)的OSI堆疊中的每層協(xié)議)。例如,Bootstrap列表、mDNS、DHT發(fā)現(xiàn) 和 PEX 都是“對(duì)等發(fā)現(xiàn)”的形式,它們可以共存甚至協(xié)同。
2.2.1 構(gòu)建物理鏈接
Ethernet
Wi-Fi
Bluetooth
USB
2.2.2 尋址機(jī)器或進(jìn)程
IPv4
IPv6
Hidden addressing, like SDP
2.2.3 發(fā)現(xiàn)對(duì)等節(jié)點(diǎn)或服務(wù)?ARP
DHCP
DNS
Onion
2.2.4 通過(guò)網(wǎng)絡(luò)路由消息
RIP(1, 2)
OSPF
BZGP
PPP
Tor
I2P
cjdns??2.2.5 傳輸?TCP?UDP
UDT
QUIC
WebRTC data channel
2.2.6 應(yīng)用程序之間協(xié)商一致的通信語(yǔ)義
RMI
Remoting
RPC
HTTP
?雖然我們目前有一系列的協(xié)議可供我們的服務(wù)進(jìn)行通信,但解決方案的豐富性和多樣性也產(chǎn)生了自身的問(wèn)題。目前,應(yīng)用程序難以通過(guò)多種傳輸機(jī)制(例如,在瀏覽器應(yīng)用程序中缺少TCP/UDP棧)來(lái)支持和使用。
也沒(méi)有“存在性鏈接”,這意味著沒(méi)有一個(gè)對(duì)等體在多個(gè)傳輸中聲明自己的概念,因此其他對(duì)等體可以保證它總是相同的對(duì)等體。
?
3 需求和注意事項(xiàng) 3.1 Transport agnostic(不確定的傳輸機(jī)制)?libp2p 是不依賴具體傳輸機(jī)制的,所以它可以運(yùn)行在任何傳輸協(xié)議上。它甚至不依賴于IP,它可以運(yùn)行在NDN、XI和其他新的互聯(lián)網(wǎng)體系結(jié)構(gòu)之上.
為了支持不同類型的傳輸機(jī)制,libp2p 使用 multiaddr,一種自描述尋址格式。這使得 libp2p 能夠在系統(tǒng)中任意地處理地址,并且支持網(wǎng)絡(luò)層中的各種傳輸協(xié)議。libp2p 中地址的實(shí)際格式是
ipfs-addr,以IPFS節(jié)點(diǎn)ID結(jié)束的 multi-addr。例如,這些都是有效的 ipfs-addrs:
# IPFS over TCP over IPv6 (typical TCP) /ip6/fe80::8823:6dff:fee7:f172/tcp/4001/ipfs/QmYJyUMAcXEw1b5bFfbBbzYu5wyyjLMRHXGUkCXpag74Fu # IPFS over uTP over UDP over IPv4 (UDP-shimmed transport) /ip4/162.246.145.218/udp/4001/utp/ipfs/QmYJyUMAcXEw1b5bFfbBbzYu5wyyjLMRHXGUkCXpag74Fu # IPFS over IPv6 (unreliable) /ip6/fe80::8823:6dff:fee7:f172/ipfs/QmYJyUMAcXEw1b5bFfbBbzYu5wyyjLMRHXGUkCXpag74Fu # IPFS over TCP over IPv4 over TCP over IPv4 (proxy) /ip4/162.246.145.218/tcp/7650/ip4/192.168.0.1/tcp/4001/ipfs/QmYJyUMAcXEw1b5bFfbBbzYu5wyyjLMRHXGUkCXpag74Fu # IPFS over Ethernet (no IP) /ether/ac:fd:ec:0b:7c:fe/ipfs/QmYJyUMAcXEw1b5bFfbBbzYu5wyyjLMRHXGUkCXpag74Fu
注意:當(dāng)前,尚不存在不可靠的實(shí)現(xiàn)。定義和使用不可靠傳輸?shù)膮f(xié)議接口尚未定義。有關(guān)不可靠VS可靠傳輸?shù)母嘈畔?,?qǐng)參見(jiàn)此處。在WebRTC的上下文中,在 這里 輸入 CTRL+F搜索“可靠”。
3.2 多重多路復(fù)用(Multi-multiplexing)libp2p 協(xié)議是多個(gè)協(xié)議的集合。為了節(jié)省資源,并使連接更容易,libp2p 可以通過(guò)一個(gè)端口,如TCP或UDP端口,根據(jù)所使用的傳輸來(lái)執(zhí)行其所有操作。libp2p 可以通過(guò)點(diǎn)到點(diǎn)連接來(lái)復(fù)用它的許多協(xié)議。這種復(fù)用是用于可靠的流和不可靠的數(shù)據(jù)報(bào)。
libp2p 比較務(wù)實(shí)。它試圖在盡可能多的配置中使用,以模塊化和靈活的方式來(lái)適應(yīng)各種用例,并盡可能少地選擇。因此,libp2p 網(wǎng)絡(luò)層提供了我們松散地稱之為“多重多路復(fù)用”的內(nèi)容:
多個(gè)網(wǎng)絡(luò)接口的多路復(fù)用
多個(gè)傳輸協(xié)議的多路復(fù)用
多個(gè)對(duì)等連接的多路復(fù)用
可以復(fù)用多個(gè)客戶端協(xié)議
每個(gè)協(xié)議/連接可以多路復(fù)用多個(gè)流(SPDY、HTTP2、QIC、SSH)
流量控制(背壓,公平性)
用不同的臨時(shí)密鑰加密每個(gè)連接
舉個(gè)例子,假設(shè)一個(gè)IPFS節(jié)點(diǎn):
偵聽(tīng)特定的TCP/IP地址
偵聽(tīng)不同的TCP/IP地址
偵聽(tīng)特定的SCTP/UDP/IP地址
偵聽(tīng)特定的UDT/UDP/IP地址
具有與另一個(gè)節(jié)點(diǎn)X的多個(gè)連接
具有與另一個(gè)節(jié)點(diǎn)Y的多個(gè)連接
每個(gè)連接都有多個(gè)流打開(kāi)
和 X 節(jié)點(diǎn)之間通過(guò)HTTP2協(xié)議復(fù)用流
和 Y 節(jié)點(diǎn)之間通過(guò)SSH復(fù)用流
掛載在 libp2p 頂部的協(xié)議為 每個(gè)對(duì)等節(jié)點(diǎn)使用一個(gè)流
掛載在 libp2p 頂部的協(xié)議為 每個(gè)對(duì)等節(jié)點(diǎn)使用多個(gè)流
如果不提供這種級(jí)別的靈活性將不可能在各種平臺(tái)、場(chǎng)景或網(wǎng)絡(luò)配置中使用 libp2p。
所有實(shí)現(xiàn)都支持所有的選擇并不重要;關(guān)鍵的是,規(guī)范足夠靈活,允許實(shí)現(xiàn)精確地使用他們所需要的。這確保了復(fù)雜的用戶或應(yīng)用程序約束不排除 libp2p 作為選項(xiàng)。
在 libp2p 之上的通信可能是:?
加密的
簽名的(沒(méi)有加密, 防篡改)
clear(沒(méi)有加密,也沒(méi)有簽名)
我們同時(shí)作了安全和性能考慮. 加密通信在數(shù)據(jù)中心內(nèi)部高性能通信場(chǎng)景下不是很必要.
我們推薦:
默認(rèn)加密所有的通信
實(shí)現(xiàn)需要被審計(jì)
除非絕對(duì)必要,用戶通常只需要加密通信
Libp2p 采用類似TLS的加密套件.
Note: 我們不直接使用 TLS, 因?yàn)槲覀儾恍枰?CA 系統(tǒng)包. 大多數(shù) TLS 實(shí)現(xiàn)都非常龐大. Since libp2p model begins with keys, libp2p only needs to apply ciphers. 這只是整個(gè) TLS 標(biāo)準(zhǔn)中很小的一部分.
3.4 NAT穿透網(wǎng)絡(luò)地址轉(zhuǎn)換在英特網(wǎng)上無(wú)處不在. Not only are most consumer devices behind many layers of NAT,?but most data center nodes are often behind NAT for security or virtualization reasons.
As we move into containerized deployments, this is getting worse. IPFS的實(shí)現(xiàn) 需要 提供一個(gè)方法來(lái)穿透 NAT, 否則操作可能會(huì)受到影響. 即使要用真實(shí)IP地址運(yùn)行的節(jié)點(diǎn)也必須實(shí)現(xiàn)NAT穿越技術(shù),因?yàn)樗鼈兛赡苄枰⑴cNAT后面的對(duì)等體的連接.
Libp2p 采用了類 ICE 的協(xié)議完成了完整的 NAT 穿透. 他并不完全是 ICE, 因?yàn)?IPFS 網(wǎng)絡(luò)提供了通過(guò)IPFS協(xié)議中繼通信的可能性, 用于協(xié)調(diào)穿孔甚至中繼通信.
建議在實(shí)現(xiàn)中使用諸多可用的NAT穿透庫(kù)之一,例如 libnice、libwebrtc 或 natty. 總而言之,NAT穿透必須是可互操作的.
3.5 中繼(Relay)然而,對(duì)于對(duì)稱的NATS,容器和VM NAT,以及其他不可能繞過(guò)的NATS,libp2p 必須回退到中繼通信,以建立一個(gè)完整的連通圖。要完成這些,實(shí)現(xiàn)必須支持中繼,雖然它應(yīng)該是可選的,并且能夠被終端用戶關(guān)閉.
連接中繼應(yīng)該作為傳輸來(lái)實(shí)現(xiàn),以便對(duì)上層透明.
中繼的實(shí)現(xiàn),可參考 p2p-circuit transport.
不同的系統(tǒng)有不同的需求,進(jìn)而導(dǎo)致不同的拓?fù)浣Y(jié)構(gòu)。在P2P文獻(xiàn)中,我們可以發(fā)現(xiàn)這些拓?fù)浔涣信e為:非結(jié)構(gòu)化的、結(jié)構(gòu)化的、混合的和集中式的.
集中式拓?fù)涫窃赪eb應(yīng)用基礎(chǔ)設(shè)施中最常見(jiàn)的拓?fù)浣Y(jié)構(gòu),它要求給定的服務(wù)或服務(wù)群存在于已知的靜態(tài)地址,以便其他服務(wù)能夠訪問(wèn)它們。非結(jié)構(gòu)化網(wǎng)絡(luò)代表了一種P2P網(wǎng)絡(luò)類型,其中網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)是完全隨機(jī)的,或者至少是非確定性的,而結(jié)構(gòu)化網(wǎng)絡(luò)具有隱組織的方式?;旌暇W(wǎng)絡(luò)是前兩者的混合體.
考慮到這一點(diǎn),libp2p 必須準(zhǔn)備好執(zhí)行不同的路由機(jī)制和對(duì)等點(diǎn)發(fā)現(xiàn),以便構(gòu)建將使服務(wù)能夠傳播消息或找到彼此的路由表.
libp2p 還通過(guò)記錄解決了網(wǎng)絡(luò)內(nèi)部資源的可發(fā)現(xiàn)性問(wèn)題。記錄是一個(gè)數(shù)據(jù)單元,可以被數(shù)字簽名、時(shí)間戳和/或與其他方法一起使用,以使其具有短暫的有效性。這些記錄保存諸如網(wǎng)絡(luò)中存在的資源的位置或可用性等信息。這些資源可以是數(shù)據(jù)、存儲(chǔ)、CPU周期和其他類型的服務(wù)。
libp2p 不應(yīng)該限制資源的位置,而應(yīng)該提供在網(wǎng)絡(luò)中或旁路通道去方便查找資源的方式.
3.8 消息傳輸(Messaging)高效的消息傳遞協(xié)議提供以最小等待時(shí)間傳遞內(nèi)容的方法和/或支持用于分發(fā)的大型和復(fù)雜拓?fù)?。LIPP2P試圖結(jié)合多播和PUBSUB的發(fā)展來(lái)滿足這些需求.
3.9 命名(Naming)網(wǎng)絡(luò)的變化和應(yīng)用應(yīng)該讓使用者不感知具體的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),命名便解決了這個(gè)問(wèn)題.
4 架構(gòu)Libp2p 是遵循UNIX理念設(shè)計(jì)的, 它由很多易于創(chuàng)建和測(cè)試的小組件組成. 這些組件應(yīng)該便于替換,以適應(yīng)不同的技術(shù)或場(chǎng)景,并使其能夠隨著時(shí)間的推移而升級(jí).
雖然不同的對(duì)等體可以根據(jù)它們的能力來(lái)支持不同的協(xié)議,但是任何對(duì)等體都可以充當(dāng)撥號(hào)器和/或監(jiān)聽(tīng)器,用于連接其他節(jié)點(diǎn),一旦建立起的連接可以從兩端重新使用,從而消除客戶端和服務(wù)器之間的區(qū)別.
libp2p 接口在多個(gè)子系統(tǒng)上充當(dāng)薄的粘合劑,以便對(duì)等體能夠通信。只要它們尊重標(biāo)準(zhǔn)化的接口,這些子系統(tǒng)就可以建立在其他子系統(tǒng)的頂部。這些子系統(tǒng)適合的主要領(lǐng)域是:
點(diǎn)對(duì)點(diǎn)路由 - 機(jī)制來(lái)決定哪些節(jié)點(diǎn)用于路由特定消息。這種路由可以遞歸地、迭代地或甚至在廣播/組播模式下完成.
Swarm - 處理所有從LBP2P中打開(kāi)“流”部分的內(nèi)容,從協(xié)議復(fù)用、流復(fù)用、NAT穿越和連接中繼,同時(shí)支持多路傳輸.
存儲(chǔ)和分發(fā)記錄的系統(tǒng)。記錄是其他系統(tǒng)用于信令、建立鏈接、宣布對(duì)等或內(nèi)容等的小條目。它們?cè)诟鼜V泛的互聯(lián)網(wǎng)上與DNS有相似的作用.
發(fā)現(xiàn)-發(fā)現(xiàn)或識(shí)別網(wǎng)絡(luò)中的其他對(duì)等體.
這些子系統(tǒng)中的每一個(gè)都公開(kāi)了一個(gè)眾所周知的接口(見(jiàn)第6章),并且可以相互使用以實(shí)現(xiàn)其目標(biāo)。系統(tǒng)的全局概覽:
libp2p
Peer Routing
Swarm
Distributed Record Store
Discovery
4.1 Peer Routing
對(duì)等路由子系統(tǒng)公開(kāi)一個(gè)接口,以標(biāo)識(shí)消息在DHT中應(yīng)該路由到哪些對(duì)等點(diǎn)。它接收一個(gè)密鑰并且必須返回一個(gè)或多個(gè) PeerInfo 對(duì)象.
我們提出了兩個(gè)可能的對(duì)等路由子系統(tǒng)的例子,第一個(gè)基于 Kademlia DHT,第二個(gè)基于 mDNS. 然而,只要實(shí)現(xiàn)相同的期望和接口,就可以實(shí)現(xiàn)更多的對(duì)等路由機(jī)制.
kad-routing
mDNS-routing
Other-routing-mechanisms
Peer Routing
4.1.1 kad-routing
kad-routing 路由實(shí)現(xiàn)了 Kademlia 路由表,其中每個(gè)節(jié)點(diǎn)持有一組k桶,每個(gè)桶包含來(lái)自網(wǎng)絡(luò)中其他對(duì)等點(diǎn)的多個(gè) PeerInfo 對(duì)象.
4.1.2 mDNS-routing
mDNS路由 使用 mDNS 探針來(lái)識(shí)別局域網(wǎng)節(jié)點(diǎn)是否具有給定的密鑰,或者它們只是簡(jiǎn)單地存在.
4.2.1 Stream Muxer
流復(fù)用器必須實(shí)現(xiàn)接口流復(fù)用器提供的接口.
4.2.2 Protocol Muxer
協(xié)議復(fù)用是在應(yīng)用層級(jí)別處理的,而不是在端口級(jí)別(不同的服務(wù)/協(xié)議在不同端口監(jiān)聽(tīng))的常規(guī)方式. 這使得我們能夠過(guò)支持多個(gè)協(xié)議在同一個(gè)套接字中進(jìn)行加密,從而節(jié)省了為多個(gè)端口進(jìn)行NAT穿透的成本.
協(xié)議復(fù)用是通過(guò)多流協(xié)議來(lái)完成的, 該協(xié)議使用 multicodec 來(lái)協(xié)商不同類型的流(協(xié)議).
4.2.3 Transport?
4.2.4 Crypto
4.2.5 Identify
Identify is one of the protocols mounted on top of Swarm, our Connection handler. However, it follows and respects the same pattern as any other protocol when it comes to mounting it on top of Swarm. Identify enables us to trade listenAddrs and observedAddrs between peers, which is crucial for the working of IPFS. Since every socket open implements REUSEPORT, an observedAddr by another peer can enable a third peer to connect to us, since the port will be already open and redirect to us on a NAT.
4.2.6 回放(Replay)
See Circuit Relay.
4.3.1 Record
Follows IPRS spec.
4.3.2 abstract-record-store??4.3.3 kad-record-store
4.3.4 mDNS-record-store
4.3.5 s3-record-store
4.4 Discovery4.4.1 mDNS-discovery
mDNS-發(fā)現(xiàn) 是一種在局域網(wǎng)上使用 mDNS 的發(fā)現(xiàn)協(xié)議。它發(fā)射了mDNS信標(biāo)來(lái)查找是否有更多的對(duì)等體可用。局域網(wǎng)節(jié)點(diǎn)對(duì)于對(duì)等協(xié)議是非常有用的,因?yàn)樗鼈兊牡脱舆t鏈路.
mDNS-發(fā)現(xiàn)是一種獨(dú)立的協(xié)議,不依賴于任何其他的 libp2p 協(xié)議。在不依賴其他基礎(chǔ)設(shè)施的情況下,mDNS-發(fā)現(xiàn) 可以產(chǎn)生局域網(wǎng)中可用的對(duì)等點(diǎn). 這在內(nèi)聯(lián)網(wǎng)、與互聯(lián)網(wǎng)主干斷開(kāi)的網(wǎng)絡(luò)以及暫時(shí)失去鏈路的網(wǎng)絡(luò)中尤其有用.
mDNS-discovery 可以針對(duì)每個(gè)服務(wù)進(jìn)行配置(i.e. 即僅發(fā)現(xiàn)參與特定協(xié)議的對(duì)等體,如IPFS), 還有私有網(wǎng)絡(luò)(發(fā)現(xiàn)屬于專用網(wǎng)絡(luò)的對(duì)等體).
我們正在探索加密 mDNS-discovery beacons 的方式 (使得本地網(wǎng)絡(luò)中的其他節(jié)點(diǎn)無(wú)法識(shí)別正在使用的服務(wù)), though the nature of mDNS will always reveal local IP addresses.
隱私注意:mDNS 在局域網(wǎng)中進(jìn)行廣告,在同一本地網(wǎng)絡(luò)中向聽(tīng)眾顯示IP地址。不推薦使用隱私敏感的應(yīng)用程序或太公開(kāi)的路由協(xié)議.
4.4.2 random-walk
隨機(jī)游走是DHTS(具有路由表的其他協(xié)議)的發(fā)現(xiàn)協(xié)議。它進(jìn)行隨機(jī)DHT查詢,以便快速了解大量的對(duì)等體。這導(dǎo)致DHT(或其他協(xié)議)收斂得更快,而在初始階段需要承擔(dān)一定負(fù)載開(kāi)銷.
4.4.3 bootstrap-list
Bootstrap列表是一種發(fā)現(xiàn)協(xié)議,它使用本地存儲(chǔ)來(lái)緩存網(wǎng)絡(luò)中可用的高度穩(wěn)定的(和一些可信的)對(duì)等點(diǎn)的地址。這允許協(xié)議“找到網(wǎng)絡(luò)的其余部分”。這基本上與DNS自舉的方式相同(盡管注意到,通過(guò)設(shè)計(jì)改變DNS引導(dǎo)列表——“點(diǎn)域”地址——不容易做到).
該列表應(yīng)該存儲(chǔ)在長(zhǎng)期本地存儲(chǔ)中,無(wú)論這意味著本地節(jié)點(diǎn)(例如磁盤)。
協(xié)議可以將默認(rèn)列表硬編碼或采用標(biāo)準(zhǔn)代碼分發(fā)機(jī)制(如DNS)進(jìn)行傳送。
在大多數(shù)情況下(當(dāng)然在IPFS的情況下),引導(dǎo)列表應(yīng)該是用戶可配置的,因?yàn)橛脩艨赡芟M⒍鄮У木W(wǎng)絡(luò),(or place their reliance and trust in specific nodes)或者將它們的信任和信任放在特定的節(jié)點(diǎn)中.
4.5.1 PubSub
參考 https://github.com/libp2p/spe...
4.5.1.1 實(shí)現(xiàn)
PubSub 開(kāi)發(fā)正在進(jìn)行中, 用 floodsub 作為初始協(xié)議, 隨后是 gossipsub, 這是2018年5月發(fā)布的alpha版本.
Floodsub 的實(shí)現(xiàn)包括:
go-libp2p-floodsub: 參考 此篇 作為上下文. 還有 這篇 關(guān)于 gossipsub;
rust-libp2p-floodsub: @jamesray1 正基于 gossipsub 之上研究和開(kāi)發(fā). Js-libp2p-floodsub.
4.5.2 IPNS
5 Data structures網(wǎng)絡(luò)協(xié)議主要處理以下數(shù)據(jù)結(jié)構(gòu):
PrivateKey: 節(jié)點(diǎn)的私鑰
PublicKey: 節(jié)點(diǎn)的公鑰
PeerId: 節(jié)點(diǎn)公鑰的hash
PeerInfo: 包含節(jié)點(diǎn)的 PeerId, 及其已知的 multiaddr 對(duì)象.
Transport: 用于建立與其他對(duì)等體的連接. 參考?https://github.com/libp2p/int...
Connection: 節(jié)點(diǎn)之間的點(diǎn)對(duì)點(diǎn)連接. 必須實(shí)現(xiàn)?https://github.com/libp2p/int...
Muxed-Stream: 雙工通信信道.
Stream-Muxer: 流復(fù)用器. 必須實(shí)現(xiàn)?https://github.com/libp2p/int...
Record: IPLD(IPFS鏈接數(shù)據(jù)) 描述了實(shí)現(xiàn) IPRS 的對(duì)象.
multiaddr: 自描述的網(wǎng)絡(luò)地址. 參考 https://github.com/multiforma...
multicodec: 自描述的編碼類型. 參考 https://github.com/multiforma...
multihash: 自描述的hash. 參考?https://github.com/multiforma...
接口
=====
libp2p 是多個(gè)協(xié)議的集合,它們一起工作,提供一個(gè)可以與任何其他網(wǎng)絡(luò)可尋址進(jìn)程對(duì)話的公共實(shí)體接口。這是通過(guò)將現(xiàn)有的協(xié)議和實(shí)現(xiàn)擺在一組顯式接口中來(lái)實(shí)現(xiàn)的:對(duì)等路由、發(fā)現(xiàn)、Stream Muxing、傳輸、連接等。
6.1 libp2plibp2p, 作為頂級(jí)模塊,為其它接口提供 libp2p 實(shí)例, must offer an interface for dialing to a peer and plugging in all of the modules (e.g. which transports) we want to support. We present the libp2p interface and UX in section 6.6, after presenting every other module interface.
6.2 Peer RoutingA Peer Routing 模塊為 libp2p 提供節(jié)點(diǎn)查找其它節(jié)點(diǎn) PeerInfo 信息的方式, 以便連接節(jié)點(diǎn). 最簡(jiǎn)單的形式, Peer Routing 模塊需要一個(gè)接口,其接收一個(gè) "key", 并返回一個(gè) PeerInfo 的集合. 關(guān)于接口和測(cè)試可參考 https://github.com/libp2p/int...
6.3 SwarmCurrent interface available and updated at:
https://github.com/libp2p/js-...
?6.3.1 Transport
https://github.com/libp2p/int...
6.3.2 Connection
https://github.com/libp2p/int...
6.3.3 Stream Muxing
https://github.com/libp2p/int...
https://github.com/libp2p/int...
6.5 Peer DiscoveryA Peer Discovery module interface should return PeerInfo objects, as it finds new peers to be considered by our Peer Routing modules.
6.6 libp2p interface and UXlibp2p 實(shí)現(xiàn)應(yīng)該使它能夠以編程方式實(shí)例化,或者使用以前編譯過(guò)的庫(kù),并且已經(jīng)進(jìn)行了一些協(xié)議決策,以便用戶可以重用或擴(kuò)展.
程序化構(gòu)建一個(gè)LIPP2P實(shí)例?
用JavaScript實(shí)現(xiàn)的例子, 可以被映射到其他語(yǔ)言:
var Libp2p = require(‘libp2p’) var node = new Libp2p() // add swarm instance node.addSwarm(swarmInstance) // add one or more Peer Routing mechanisms node.addPeerRouting(peerRoutingInstance) // add a Distributed Record Store node.addDistributedRecordStore(distriburedRecordStoreInstance)
配置 libp2p 非常簡(jiǎn)單,因?yàn)榇蠖鄶?shù)配置來(lái)自于實(shí)例化多個(gè)模塊,一個(gè)接一個(gè).
撥號(hào)和偵聽(tīng)與對(duì)等體的連接
理想情況下,libp2p 使用自己的機(jī)制(Peer Routing and Record Store)找到撥號(hào)給給定對(duì)等點(diǎn)的方法.
node.dial(PeerInfo)
若要接收傳入連接,請(qǐng)指定要處理的一個(gè)或多個(gè)協(xié)議:
node.handleProtocol("", function (duplexStream) { })
查找對(duì)等節(jié)點(diǎn)
找到對(duì)等點(diǎn)是通過(guò)對(duì)等路由,所以接口是相同的.
存儲(chǔ)和檢索記錄
像查找對(duì)等體一樣,通過(guò)記錄存儲(chǔ)來(lái)完成記錄的存儲(chǔ)和檢索,所以接口是相同的。
Efforts like NDN and XIA are new architectures for the internet, which are closer to the model IPFS uses than what IP provides today. IPFS will be able to operate on top of these architectures trivially, as these are no assumptions made about the network stack in the protocol. Implementations will likely need to change, but changing implementations is vastly easier than changing protocols.
8 實(shí)現(xiàn)在實(shí)現(xiàn)不同的模塊和功能時(shí),libp2p2 的實(shí)現(xiàn)應(yīng)該(推薦)遵循一定級(jí)別的粒度,以便公共接口易于暴露、測(cè)試和檢查與其他實(shí)現(xiàn)的互操作性.
這是當(dāng)前 libp2p 存在的模塊列表:
libp2p(entry point)
Swarm
libp2p-swarm
libp2p-identify
libp2p-ping
Transports
Interface-transport
Interface-connection
libp2p-tcp
libp2p-udp
libp2p-udt
libp2p-utp
libp2p-webrtc
libp2p-cjdns
Stream Muxing
Interface-stream-muxer
libp2p-spdy
libp2p-multiplex
Crypto Channel
libp2p-tls
libp2p-secio
Peer Routing
libp2p-kad-routing
libp2p-mDNS-routing
Discovery
libp2p-mdns-discovery
libp2p-random-walk
libp2p-railing
Distributed Record Store
libp2p-record
interface-record-store
libp2p-distributed-record-store
libp2p-kad-record-store
Generic
PeerInfo
PeerId
multihash
multiaddr
multistream
multicodec
ipld
repo
當(dāng)前已知實(shí)現(xiàn)(WIP):
JavaScript - https://github.com/libp2p/js-...
Go - https://github.com/ipfs/go-li...
Python - https://github.com/candeira/p...
Rust - https://github.com/libp2p/rus...
8.1 集群(Swarm)8.1.1 Swarm Dialer
集群撥號(hào)器管理到目標(biāo)對(duì)等體的成功連接,給定一個(gè)地址流作為輸入,并且確保遵守速率限制等約定.
為此,我們?cè)O(shè)計(jì)了以下的撥號(hào)邏輯:
DialPeer(peerID) { if PeerIsBeingDialed(peerID) { waitForDialToComplete(peerID) return BestConnToPeer(peerID) } StartDial(peerID) waitForDialToComplete(peerID) return BestConnToPeer(peerID) } StartDial(peerID) { addrs = getAddressStream(peerID) addrs.onNewAddr(function(addr) { if rateLimitCanDial(peerID, addr) { doDialAsync(peerID, addr) } else { rateLimitScheduleDial(peerID, addr) } }) } // doDialAsync starts dialing to a specific address without blocking. // when the dial returns, it releases rate limit tokens, and if it // succeeded, will finalize the dial process. doDialAsync(peerID, addr) { go transportDial(addr, function(conn, err) { rateLimitReleaseTokens(peerID, addr) if err != null { // handle error } dialSuccess(conn) }) } // rateLimitReleaseTokens checks for any tokens the given dial // took, and then for each of them, checks if any other dial is waiting // for any of those tokens. If waiting dials are found, those dials are started // immediately. Otherwise, the tokens are released to their pools. rateLimitReleaseTokens(peerID, addr) { tokens = tokensForDial(peerID, addr) for token in tokens { dial = dialWaitingForToken(token) if dial != null { doDialAsync(dial.peer, dial.addr) } else { token.release() } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24146.html
摘要:我們將在這一章源碼倉(cāng)庫(kù)全解析第五章檢索服務(wù)礦工的配置操作中介紹與存儲(chǔ)市場(chǎng)并駕齊驅(qū)而又息息相關(guān)的檢索市場(chǎng),以及體系中另一重要角色檢索服務(wù)礦工的基本配置操作。 對(duì)不起,你們可能關(guān)注了一個(gè)愛(ài)拖更的公眾號(hào)... 不過(guò)不拖更,可能這篇也不會(huì)有這么多 猛料... 歡迎大家來(lái)到第五章,經(jīng)過(guò)前章 《【Filecoin源碼倉(cāng)庫(kù)全解析】第四章:存儲(chǔ)需求方(用戶)的配置操作》的內(nèi)容閱讀后,我們應(yīng)該對(duì)存儲(chǔ)需求...
摘要:基于版本基于版本。由于中英行文差異,完全的逐字逐句翻譯會(huì)很冗余啰嗦。譯者在翻譯中同時(shí)參考了谷歌百度有道翻譯的譯文以及編程思想第四版中文版的部分內(nèi)容對(duì)其翻譯死板,生造名詞,語(yǔ)言精煉度差問(wèn)題進(jìn)行規(guī)避和改正。 來(lái)源:LingCoder/OnJava8 主譯: LingCoder 參譯: LortSir 校對(duì):nickChenyx E-mail: 本書原作者為 [美] Bru...
摘要:概述經(jīng)過(guò)半年的搗鼓,終于將協(xié)議全篇翻譯完成?,F(xiàn)在將所有章節(jié)全部整理到一篇文章中,方便大家閱讀。如果大家想看具體的翻譯文檔,可以去我的中查看。大家有相關(guān)類型的需要,建議大家可以嘗試下。 概述 經(jīng)過(guò)半年的搗鼓,終于將 WebSocket 協(xié)議(RFC6455)全篇翻譯完成。現(xiàn)在將所有章節(jié)全部整理到一篇文章中,方便大家閱讀。如果大家想看具體的翻譯文檔,可以去我的GitHub中查看。 具體章節(jié)...
摘要:全稱,中文名星際文件系統(tǒng),是一個(gè)旨在創(chuàng)建持久且分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議。在網(wǎng)絡(luò)中的節(jié)點(diǎn)將構(gòu)成一個(gè)分布式文件系統(tǒng)。使用稱為去中心化命名系統(tǒng),每個(gè)文件都可以被協(xié)作命名為易讀的名字。三項(xiàng)目實(shí)踐利用構(gòu)建一個(gè)去中心化不可篡改的分布式系統(tǒng)。 作者簡(jiǎn)介:戴嘉樂(lè)( Mr.Maple ) | 前百度高級(jí)研發(fā)工程師 | IPFS應(yīng)用實(shí)踐者&布道師|個(gè)人網(wǎng)站:https://www.daijial...
摘要:前后經(jīng)過(guò)九個(gè)月,我翻譯的官方版本中文文檔可以發(fā)布第一個(gè)較為完整的版本了。這點(diǎn)原本是最重要的,但讓位于符合中文習(xí)慣,是因?yàn)槿绻g本有機(jī)翻痕跡,給人的品質(zhì)感和可信度就降低了更準(zhǔn)確和更優(yōu)雅的翻譯風(fēng)格。 showImg(/img/remote/1460000006773992); 前后經(jīng)過(guò)九個(gè)月,我翻譯的Spring MVC官方4.2.4版本中文文檔可以發(fā)布第一個(gè)較為完整的版本了。譯文上盡量做...
閱讀 2659·2021-11-11 16:55
閱讀 697·2021-09-04 16:40
閱讀 3093·2019-08-30 15:54
閱讀 2635·2019-08-30 15:54
閱讀 2424·2019-08-30 15:46
閱讀 418·2019-08-30 15:43
閱讀 3241·2019-08-30 11:11
閱讀 2995·2019-08-28 18:17