網路中繼是一種傳輸協議(transport protocol),它通過第三方中繼對等節點實作兩個對等節點之間進行通訊,
在很多場景中,對等節點不能以穿透它們的NAT網路(traverse their NAT )來實作它們可以在公共網路上被訪問, 或者它們沒有共享它們的傳輸協議(transport protocols ),使得它們不能被直接通訊,
為了能夠使p2p架構面臨的連接障礙問題比如NAT得到處理,libp2p定義了一個叫做p2p-circuit的協議(defines a protocol called p2p-circuit),當一個對等節點不能夠在公共地址上進行監聽時,它可以撥號中繼對等節點,這個中繼對等節點可以保持長時間的連接活躍狀態,其他對等節點可以通過撥號p2p-circuit地址,間接的連接到它們的目的地址,
這個網路中繼協議是收到了 TURN的啟發,TURN是互動式連接建立( Interactive Connectivity Establishment)的NAT穿透技術集合的一部分,
注意:
中繼連接是端對端加密的,那也就意味著作為中繼的對等節點不能夠讀取或篡改經過它的資料,
不透明是中繼協議的一個重要方面,換句話說,源端節點和目的端節點都能知道它們之間的訊息是被中繼傳遞的,這個非常有用,因為目的端節點能夠知道建立連接使用的中繼地址并且使用該地址構建回傳路徑連接,用于發送訊息到源端地址,這也不是匿名的,所有參與方都是使用它們的節點ID來識別它們,包括中繼節點在內,
中繼節點地址
中繼是使用一個包含了對等節點ID的多地址來識別的,這個對等節點的訊息會被中繼傳輸,
讓我們舉個例子,我有一個節點ID是QmAlice的對等節點,我想把我的地址給我的朋友QmBob,但是我在一個NAT網路中,別人不能直接和我建立連接,
我能夠構建的最基本的p2p-circuit地址是:
/p2p-circuit/p2p/QmAlice
上面的這個地址非常有趣,因為這個地址不包括任何我們想構建的連接到QmAlice的地址和任何進行傳輸訊息的中繼節點地址,沒有這些地址資訊,一個對等節點唯一撥號我的機會是發現一個中繼節點并且這個節點是和我保持連接的,
一個比較好的節點地址類似/p2p/QmRelay/p2p-circuit/p2p/QmAlice,這個包含了指定的中繼節點ID,QmRelay,如果一個對等節點知道如何與QmRelay建立連接,它們就能夠連接到我,
一個好的節點地址也為中繼節點包含傳輸地址,讓我們舉個例子,我已經與指定的節點ID是QmRelay的中繼節點建立了一個連接,它們通過身份協議告訴我,它們是地址為7.7.7.7,埠為55555監聽上的連接,我可以依托于這個特定中繼節點傳輸構建一個可以聯系到我的路徑地址:
/ip4/7.7.7.7/tcp/55555/p2p/QmRelay/p2p-circuit/p2p/QmAlice
這個地址中/p2p-circuit之前的所有內容都是中繼節點的地址,它包括了傳輸地址和它們的對等節點ID QmRelay, /p2p-circuit/之后的內容是我的節點ID,QmAlice,
通過把這個詳細的中繼地址給我的朋友QmBob,他們就能夠快速的與我建立一個中繼的連接,從而不用到處去詢問到達QmAlice的中繼路徑,
當廣播你自己的地址,提供一個包含了中繼節點傳輸地址的中繼地址是最好的,如果這個中繼地址包含了許多傳輸地址,你可以為他們每個地址包含一個p2p-circuit,
自動中繼
中繼協議只有當節點能夠發現愿意成為中繼節點并且能夠與雙方節點建立連接的節點時才有效,
雖然一個可能的簡單方案是在你的應用程式中硬編碼添加一個已知的中繼節點串列,但是這添加了一個在你的應用架構中你可能想避免的中心集合點,如果這些引導節點變的不可用,它們這種引導節點串列也可能是潛在的失敗節點,
自動中繼是一個優點(當前已經在go-libp2p中實作),它使得對等節點能夠利用libp2p內容路由介面( content routing )嘗試發現中繼節點,
當自動中繼可用時,對等節點會嘗試發現一個或更多公共中繼節點并打開中繼連接,如果成功,這個節點就會利用libp2p的節點路由( peer routing)系統進行廣播中繼地址,
警告
自動中繼還正在積極開發中并且應該考慮到實驗性質,當前沒有保護措施用于避免惡意的或篡改用于廣播中繼服務和拒絕提供服務的中繼節點,
自動中繼如何作業
自動中繼服務負責:
- 發現周圍的中繼節點
- 在它們之間建立長連接
- 為我們的節點廣播有中繼能力的節點,通過代理路由使我們自己可路由,
當 AutoNAT service 服務檢測到我們在NAT網路中并且阻止連接我們的連入連接,自動中繼進入激活狀態,執行以下流程:
- 我們通過運行DHT模塊搜索/libp2p/relay命名空間來定位候選中繼節點,
- 我們隨機的選擇三個結果節點,并與它們建立長連接(/libp2p/circuit/relay/0.1.0協議),后續將支持延遲啟發式選擇功能,
- 我們可以利用/ip4/1.2.3.4/tcp/4001/p2p/QmRelay/p2p-circuit的格式形式來增強本地地址串列與需要的新的可中繼的多地址之間的聯系,
1.2.3.4是中繼節點的公共IP地址,4001是libp2p埠,QmRelay是中繼節點的節點ID,這個多地址的元素可以根據實際傳輸的情況進行改變, - 我們通過使用IdentifyPush協議向我們已經連接的對等節點廣播我們新的可以作為中繼節點的節點地址,
這最后一步是關鍵,因為它能夠是我們連接的對等節點知道我們已知的可作為中繼節點的地址更新,反過來,當其他節點向我們查詢的時候,回傳這些新學到的節點,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/248906.html
標籤:區塊鏈
