網絡中繼

 

  網絡中繼是一種傳輸協議(transport protocol),它經過第三方中繼對等節點實現兩個對等節點之間進行通信。html

  在不少場景中,對等節點不能以穿透它們的NAT網絡(traverse their NAT )來實現它們能夠在公共網絡上被訪問, 或者它們沒有共享它們的傳輸協議(transport protocols ),使得它們不能被直接通信。git

  爲了可以使p2p架構面臨的鏈接障礙問題好比NAT獲得處理,libp2p定義了一個叫作p2p-circuit的協議(defines a protocol called p2p-circuit)。當一個對等節點不可以在公共地址上進行監聽時,它能夠撥號中繼對等節點,這個中繼對等節點能夠保持長時間的鏈接活躍狀態。其餘對等節點能夠經過撥號p2p-circuit地址,間接的鏈接到它們的目的地址。github

  這個網絡中繼協議是收到了 TURN的啓發,TURN是交互式鏈接創建( Interactive Connectivity Establishment)的NAT穿透技術集合的一部分。網絡

  注意:架構

  中繼鏈接是端對端加密的,那也就意味着做爲中繼的對等節點不可以讀取或篡改通過它的數據。tcp

  不透明是中繼協議的一個重要方面。換句話說,源端節點和目的端節點都能知道它們之間的消息是被中繼傳遞的。這個很是有用,由於目的端節點可以知道創建鏈接使用的中繼地址而且使用該地址構建返回路徑鏈接,用於發送消息到源端地址。這也不是匿名的,全部參與方都是使用它們的節點ID來識別它們,包括中繼節點在內。ui

中繼節點地址

  中繼是使用一個包含了對等節點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/以後的內容是個人節點IDQmAlice。

  經過把這個詳細的中繼地址給個人朋友QmBob,他們就可以快速的與我創建一箇中繼的鏈接,從而不用處處去詢問到達QmAlice的中繼路徑。

  當廣播你本身的地址,提供一個包含了中繼節點傳輸地址的中繼地址是最好的。若是這個中繼地址包含了許多傳輸地址,你能夠爲他們每一個地址包含一個p2p-circuit。

自動中繼

  中繼協議只有當節點可以發現願意成爲中繼節點而且可以與雙方節點創建鏈接的節點時纔有效。

  雖然一個可能的簡單方案是在你的應用程序中硬編碼添加一個已知的中繼節點列表,可是這添加了一個在你的應用架構中你可能想避免的中心集合點。若是這些引導節點變的不可用,它們這種引導節點列表也多是潛在的失敗節點。

  自動中繼是一個優勢(當前已經在go-libp2p中實現),它使得對等節點可以利用libp2p內容路由接口( content routing )嘗試發現中繼節點。

  當自動中繼可用時,對等節點會嘗試發現一個或更多公共中繼節點並打開中繼鏈接。若是成功,這個節點就會利用libp2p的節點路由( peer routing)系統進行廣播中繼地址。

  警告

  自動中繼還正在積極開發中而且應該考慮到實驗性質。當前沒有保護措施用於避免惡意的或篡改用於廣播中繼服務和拒絕提供服務的中繼節點。

自動中繼如何工做

  自動中繼服務負責:

  1. 發現周圍的中繼節點
  2. 在它們之間創建長鏈接
  3. 爲咱們的節點廣播有中繼能力的節點,經過代理路由使咱們本身可路由。

  當 AutoNAT service 服務檢測到咱們在NAT網絡中而且阻止鏈接咱們的連入鏈接,自動中繼進入激活狀態,執行如下流程:

  1. 咱們經過運行DHT模塊搜索/libp2p/relay命名空間來定位候選中繼節點。
  2. 咱們隨機的選擇三個結果節點,並與它們創建長鏈接(/libp2p/circuit/relay/0.1.0協議)。後續將支持延遲啓發式選擇功能。
  3. 咱們能夠利用/ip4/1.2.3.4/tcp/4001/p2p/QmRelay/p2p-circuit的格式形式來加強本地地址列表與須要的新的可中繼的多地址之間的聯繫, 1.2.3.4是中繼節點的公共IP地址,4001是libp2p端口,QmRelay是中繼節點的節點ID。這個多地址的元素能夠根據實際傳輸的狀況進行改變。
  4. 咱們經過使用IdentifyPush協議向咱們已經鏈接的對等節點廣播咱們新的能夠做爲中繼節點的節點地址。

  這最後一步是關鍵,由於它可以是咱們鏈接的對等節點知道咱們已知的可做爲中繼節點的地址更新,反過來,當其餘節點向咱們查詢的時候,返回這些新學到的節點。

相關文章
相關標籤/搜索