去中心化技術分享與 P2P 框架的實現

本文 談談去中心化技術分享與 P2P 框架的實現,文尾有彩蛋。

去中心化技術分享與 P2P 框架的實現

關於去中心化的網絡架構,也是服務器架構範疇內必不可少的一部分。本章討論的內容,不涉及任何軟件技術框架,也不涉及任何軟件代碼分析,注重把去中心化網絡的原理分析清楚,最後通過 Linux 系統編程實現網絡穿透。

去中心化技術分享與 P2P 框架的實現

為了使本章更加容易描述,現對五個概念做一個不嚴謹的非學術的定義。

  • 1> 客戶端:用戶直接操作的終端軟件。
  • 2> 節點:對通信網絡中機器的簡稱,包括客戶端機器,服務器機器,路由器等等
  • 3> P2P:描述終端與終端直接通信的方式。
  • 4> 網絡穿透:實現終端與終端直接通信的一種技術方案。
  • 5> 去中心化網絡:包含終端,服務器,以及之間通信方式,一起組成的通信網絡。

5.1 中心化網絡與去中心化

為了更好的理解去中心化網絡,先來理解傳統的中心化網絡拓撲圖(圖 5-1)。不論常用的 B/S 還是 C/S,都是一種星型結構,而中心化節點正是服務器,每一個客戶端只能與服務器通信。如果客戶端與客戶端之間需要通信,必須要得通過服務器進行路由處理,才能把數據路由到另一個客戶端。在通信過程中,服務器與客戶端是充當著不同角色的,不同功能的。服務器是對所有客戶端提供服務的,這樣的通信網絡,被稱為中心化網絡。

去中心化技術分享與 P2P 框架的實現

在去中心化網絡中,每個客戶端都是平等的,沒有客戶端與服務器之分,客戶端之間互相提供服務,不存在“特殊”身份。客戶端之間交互連接,每個客戶端同時也對外提供服務,同時也使用其他客戶端的提供的服務。在此種情形下,再被稱為客戶端不太妥了。所以此時的客戶端被稱為節點。這樣沒有中心服務器的網絡,被稱為去中心化網絡。不僅僅解除了中心化服務器絕對控制的風險,也提高了網絡傳輸效率,也去除了中心化服務器數據路由的壓力。

去中心化技術分享與 P2P 框架的實現

5.2 網絡地址映射 NAT

在私網與外網通信的過程中,私網與公網連接的邊沿節點被稱為路由器。比如私網內部網絡為 192.168.1.0 的網絡。路由器的公網 IP 為 112.93.114.32,服務器的公網 IP 地址為120.93.24.180。服務器發送數據與路由器公網 IP 時,能夠將數據映射到私網中的機器;私網內的機器發送數據給服務器,路由器也能夠映射為公網 IP 地址的過程,成為網絡地址映射。

去中心化技術分享與 P2P 框架的實現

NAT (Network Address Translation,網絡地址映射)是將公網地址映射為私網地址。而能夠進行映射的網絡裝置被稱為 NAT 路由器。

5.2.1 NAT 的原理

由於全球網絡通信機器增加,IPv4 地址緊缺,所以提出了 NAT 的理論,通過公網 IP 地址與端口映射到私網機器的 IP 地址與端口。這樣就能通過少量的公有 IP 地址能夠代表較多的私有 IP 地址,有助於減緩可用 IPv4 地址的耗盡。

去中心化技術分享與 P2P 框架的實現

私網內機器上操作系統中的一個網絡進程,與公網服務器 120.93.24.180 機器通信,NAT 路由器為每一個網絡進程分配一個網絡 IP 地址與端口,用於與公網服務器通信。與此同時,公網服務器與私網內的網絡進程通信,也是通過 NAT 路由器分配的網絡 IP 地址與端口進入私網到達網絡進程。

5.2.2 NAT 的實現

NAT 的實現方案有三種,靜態轉換,動態轉換,端口地址映射。

靜態轉換(Static NAT):私網 IP 地址轉換為公網 IP 地址,公網 IP 與私網 IP 地址通過一對一的配置,配置後是不能更改的。通過靜態轉換,實現對私網中的網絡進程進行訪問。私網有多少私有地址需要與公網通信,需要配置與之對應的外網 IP 地址,並不節省公網 IP地址,所以一般不用。

去中心化技術分享與 P2P 框架的實現

動態轉換(Dynamic NAT):為私網分配多個公網 IP 地址,組成一個公網 IP 地址池。私網內部地址需要轉換時,NAT 路由器從公網 IP 地址池中取出一個 IP 地址,分配給私網機器用於網絡通信。當私網機器數據傳輸結束後,NAT 路由器收回公網 IP 地址,返回 IP 地址池中。分配後的 IP 地址是不能再用於其他數據傳輸。在公網 IP 地址數量略少於私網機器數量的時候,可以採用動態轉換。

去中心化技術分享與 P2P 框架的實現

端口地址映射(Port Address Translation, PAT):改變私網內機器發送到公網數據包的源端口並進行端口轉換 (如圖 5-6。私網內部的所有主機均可共享一個公網 IP 地址,實現對公網的訪問,從而能夠最大限度的節省 IP 地址資源。同時,有隱藏私網中的所有主機,有效避免其他公網機器的攻擊。目前 NAT 路由器應用最廣的就是端口地址映射。

去中心化技術分享與 P2P 框架的實現

5.2.3 NAT 的應用

NAT 在互聯網中被廣泛應用,小到家庭網關,大到企業廣域網出口甚至到運營商業務網絡出口,其實 NAT 在用戶身邊隨處可見。一個用戶連接到公網進行上網,本地私有網絡機器經過多層 NAT,而用戶對此一無所知。

去中心化技術分享與 P2P 框架的實現

私網內有兩臺機器(如圖 5-8)192.168.1.23 和 192.168.1.24 與公網通信,機器上的網絡進程分別是 QQ/微信與頭條/抖音。在數據傳輸的過程中,NAT 路由器會為每一個網絡進程分配相應端口與公網通信。

5.3 NAT 種類

從 NAT 的技術實現角度,可以分為三種,靜態轉換(Static NAT),動態轉換(DynamicNAT),端口地址映射(Port Address Translation,PAT)。從 NAT 的功能,可以分為四種:完全錐型 NAT(Full Cone NAT),對稱 NAT(SymmetricNAT),IP 限制錐型 NAT(IP Restricted Cone NAT),端口限制錐形 NAT(Port RestrictedCone NAT)。

5.3.1 完全錐型 NAT

完全錐型 NAT(Full Cone NAT),私網機器的網絡進程(iAddr:iPort)被 NAT 路由器映射為公網地址(pAddr:pPort),後續該網絡進程的所有數據報文都被轉換為公網地址(pAddr:pPort),公網任何一臺機器發送報文到(pAddr:pPort),會被轉發到私網機器的網

絡進程(iAddr:iPort)。如圖 5-10 所示。


去中心化技術分享與 P2P 框架的實現


5.3.2 對稱 NAT

對稱 NAT(Symmetric NAT),NAT 路由器會為私網機器的每一個網絡進程都會分配一個地址與端口,從而把私網網絡進程(iAddr1:iPort1)與公網地址(pAddr1:pPort1)。後續NAT 路由器會把私網機器地址端口(iAddr1:iPort1)與公網地址端口(pAddr1:pPort1)完全相同的報文看作一個連接。如圖 5-11 所示。

去中心化技術分享與 P2P 框架的實現

私網機器的網絡進程每與一臺公網機器通信,NAT 路由器都會重新分配一個地址端口。這樣使得每一個通信鏈路都是經過 NAT 路由器不同的端口。公網機器往私網發送報文也是經過不一樣的端口。

5.3.3 IP 限制錐形 NAT

限制錐型 NAT(Restricted Cone NAT),又名 IP 限制錐型 NAT。為了更好理解四種 NAT,故本篇中一直稱為 IP 限制錐型 NAT。限制錐型 NAT,只允許映射關係的對應公網 IP 地址機器,傳輸數據到私網機器。其他的公網 IP 地址機器發送數據給 NAT 路由器的公網 IP 地址與端口時,則會被 NAT 路由器丟棄。

去中心化技術分享與 P2P 框架的實現

私網機器網絡進程(192.168.1.3:2341)發送報文到公網地址(180.93.45.46:8080)的服務器,在 NAT 路由器上產生了映射公網地址(112.93.114.33:34523)。有以下兩種情形分開討論

情形一:私網機器網絡進程沒有發送報文給其他公網機器,NAT 路由器只允許公網 IP地址為 180.93.45.46 的機器數據進入,其他地址機器的數據報文則會被 NAT 路由器阻擋,不允許進入內網。

情形二:私網機器網絡進程同時發送報文給另一臺公網機器,此時 NAT 路由器生成了NAT 映射記錄,則另一臺公網機器發送報文與公網地址(112.93.114.33:34523),NAT 路由器是允許報文進入私網。先由私網機器發送報文到公網機器,限制錐形 NAT 路由器方能允許公網機器報文進入私網。

5.3.4 端口限制錐形 NAT

端口限制錐形 NAT(Port Restricted Cone NAT),在 IP 限制錐型 NAT 的基礎上,又添加了一層端口限制。限制了發送報文進入私網的 IP 地址與端口。如圖 5-12 所示,私網機器(192.168.1.3:2341)發送報文數據到公網機器(180.93.45.46:8080)的過程中,在 NAT 路由器上產生了(112.93.114.33:34523)記錄。

有以下兩種情形討論。

情形一:私網機器網絡進程沒有發送報文給公網機器(180.93.45.46)其他端口,則 NAT路由器只允許公網地址(180.93.45.46:8080)的數據報文進入私網。

情形二:私網機器網絡進程發送數據給公網機器(180.93.45.46)的其他端口,NAT 路由器生成一條 NAT 記錄,則允許該端口的數據報文到達網絡進程。

去中心化技術分享與 P2P 框架的實現

5.4 NAT 鑑別方案

已經瞭解了四種 NAT 的功能,本小節介紹四種 NAT 之間的邏輯關係,並且用計算機邏輯流程實現判斷 NAT 的方案。

完全錐型 NAT(Full Cone NAT),對稱 NAT(Symmetric NAT),IP 限制錐型 NAT(IPRestricted Cone NAT),端口限制錐形 NAT(Port Restricted Cone NAT)。這四種 NAT 的邏輯關係,可以將 NAT 劃分為一顆二叉樹,如圖 5-13 所示。NAT 分為兩種對稱 NAT 與錐型NAT,錐型 NAT 分為兩種限制錐型 NAT 與完全錐型 NAT。限制錐型 NAT 分為兩種端口限制錐型 NAT 與 IP 限制錐型 NAT。葉子節點正好是劃分出來的四種 NAT,同級節點互補,合為整集。

判別網關是屬於哪種 NAT 的方案,就能參照圖 5-13 所示,按照二叉樹的層級逐層判斷,從而確定網關的 NAT 類型。三次判斷分別為對稱 NAT 與錐型 NAT,限制錐型 NAT 與完全錐型NAT,端口限制錐型 NAT 與 IP 限制錐型 NAT。

去中心化技術分享與 P2P 框架的實現


5.4.1 對稱 NAT 與錐型 NAT

對稱 NAT 與錐型 NAT 的區別,在於私網機器與不同的公網機器通信在 NAT 路由器上產生映射表記錄的條數。對稱 NAT 與 N 臺公網機器通信則生成 N 條記錄;而錐形 NAT 與 N 臺公網機器通信則生成 1 條記錄。

去中心化技術分享與 P2P 框架的實現

判斷流程如下,如圖 5-14 所示:

  • 步驟 1:私網機器(192.168.1.3:2341)發送報文到服務器 1(180.93.45.46:8888)的 NAT路由器產生了對外公網 IP(112.93.114.33:23454),此時服務器 1 獲取客戶端 IP 地址即為對外公網 IP(112.93.114.33:23454)
  • 步驟 2:私網機器(192.168.1.3:2341)發送報文到服務器 2(118.56.189.34:8888)。服務器 2 獲取客戶端 IP 地址(iAddr:iPort)
  • 步驟 3:服務器 1 獲取客戶端的 IP 地址,發送給服務器 2。服務器 2 對比服務器 1 發過來的地址與服務器 2 獲取的客戶端 IP 地址。若兩個客戶端 IP 地址一致,則為錐型 NAT;若不一致則為對稱 NAT。

5.4.2 完全錐形 NAT 與限制錐形 NAT

完全錐型 NAT 與限制錐形 NAT 的區別,在於其他公網機器發送報文到 NAT 路由器對外公網 IP 地址能否到達私網機器,NAT 路由器的 NAT 類型是完全錐型 NAT 的話,私網機器能夠收到報文數據,限制錐形 NAT 則不能收到報文數據。

去中心化技術分享與 P2P 框架的實現

判斷流程如下,如圖 5-15 所示:

  • 步驟 1:私網機器網絡進程(192.168.1.3:2341)發送報文給服務器 1(180.93.45.46:8888)。服務器 1 獲取到客戶端 IP 地址(即 NAT 路由器對外公網 IP 地址)。
  • 步驟 2:服務器 1 將獲取的客戶端 IP 地址發送給服務器 2。
  • 步驟 3:服務器 2 收到客戶端 IP 地址以後,發送報文給客戶端 IP 地址。探測客戶端 IP 地址能否收到報文數據。若是完全錐型 NAT,則私網機器能夠收到報文;若是限制錐形 NAT,則私網不能收到報文數據。
  • 步驟 4:私網機器網絡進程收到報文數據,繼續發送報文給服務器 1。服務器 1 收到了報文數據。判斷結束。服務器 1 收到報文數據,則為完全錐型 NAT;否則為限制錐型 NAT。

5.4.3 IP 限制錐形 NAT 與端口限制錐形 NAT

IP 限制錐型 NAT 與端口限制錐型 NAT 的區別,在於公網機器的其他端口發送報文數據給私網機器網絡進程能否收到。網絡進程能收到同一臺公網機器的其他端口發送的報文數據則為 IP 限制錐型 NAT,否則為端口限制錐型 NAT。

判斷流程如下,如圖 5-15 所示:

  • 步驟 1: 私網機器網絡進程(192.168.1.3:2341)發送報文給服務器(180.93.45.46:8888)。服務器獲取到客戶端 IP 地址。
  • 步驟 2:服務器從另一個端口(180.93.45.46:8888),發送報文數據給客戶端 IP 地址。若私網機器能夠收到報文則為 IP 限制錐型 NAT,若不能則為端口限制錐型 NAT。
  • 步驟 3:私網機器網絡進程回發報文給服務器 8888 的端口,收到報文數據,判斷結束。若收到數據則為 IP 限制錐形 NAT,否則為端口限制錐型 NAT。
去中心化技術分享與 P2P 框架的實現

5.4.4 STUN 協議

STUN 最早是在 RFC3489 中定義,(Simple Traversal of UDP Through NATs),即用 UDP簡單的穿透 NAT,作為一個完整的 NAT 穿透解決方案。在 RFC5389 中,把 STUN 協議定義為穿透 NAT 提供工具,而不是一個完整的解決方案。STUN(Session Traversal Utilities forNAT,NAT 會話穿越應用程序)是一種網絡輕量級協議,它允許私網應用程序發現它們與公共互聯網之間存在的 NAT 和防火牆及其他類型。它也可以讓應用程序確定 NAT 分配給它們的公網 IP 地址與端口,STUN 是一種 Client/Server 的協議,也是一種 Request/Response的協議,默認端口 3478。本小節描述的 NAT 類型鑑別,是將 STUN 實現原理與細節,分析與展示出來。

5.5 網絡穿透

網絡穿透,即 NAT 穿透,能夠讓公網機器找到私網機器,並提高下載速度。如圖 5-17所示,穿透圖中兩個網關路由器,從而報文數據能夠直接到達私網機器。穿透的本質是給一個 NAT 路由器的公網 IP 地址與端口發送報文數據,對應私網機器能夠收到報文數據。比如圖中 NAT1,私網機器(192.168.1.3:2341)發送報文到公網服務器(180.93.45.46:8888)的過程中,在 NAT 路由器上產生了一條公網映射記錄(112.93.14.56:43891)。後續其他外網機器(192.168.2.6:6583)發送報文數據給公網映射記錄(112.93.14.56:43891),使得私網機器(192.168.1.3:2341)能夠收到該報文數據。

去中心化技術分享與 P2P 框架的實現

5.5.1 穿透完全錐形 NAT

穿透過程中,兩端私網機器都是在 NAT 路由器之下的。兩端 NAT 只要有一方為完全錐型NAT 的時候,是可以穿透的。穿透邏輯如圖 5-18 所示。比如 NAT1 為完全錐形 NAT,NAT2 為任意 NAT。

去中心化技術分享與 P2P 框架的實現


  • 步驟 1:私網機器 1(192.168.1.3:2341)發送報文給服務器(180.93.45.46:8888)。服務器獲取到私網機器 1 的公網 IP 地址與端口(112.93.14.56:43891)。
  • 步驟 2:服務器收到信息後,通知私網機器 2(192.168.2.6:6583),通知信息內含私網機器1 的公網 IP 地址與端口(112.93.14.56:43891)。
  • 步驟 3:私網機器 2(192.168.2.6:6583)發送數據給私網機器 1 的公網 IP 地址與端口(112.93.14.56:43891),此時私網機器 1 就能收到私網機器 2 發送的報文數據,並且能過獲取私網機器 2 的公網 IP 地址與端口(iAddr:iPort)。
  • 步驟 4:私網機器 1 回發報文信息給私網機器 2 的公網 IP 地址與端口(iAddr:iPort),此時私網機器 2 能夠收到報文數據。穿透流程結束。

5.5.2 穿透限制錐形 NAT

限制錐型 NAT 的特點是限制了其他公網機器報文數據傳輸。如果在採用完全錐型 NAT 的穿透步驟,就會在步驟 3 不能到達私網機器。針對於兩端 NAT 都是限制錐形 NAT 的情況,穿透流程如圖 5-19 所示。

去中心化技術分享與 P2P 框架的實現


  • 步驟 1:私網機器 1(192.168.1.3:2341)發送報文給服務器(180.93.45.46:8888),服務器獲取私網機器的公網 IP 地址(112.93.14.56:43891)。
  • 步驟 2:服務器發送通知報文給私網機器 2(192.168.2.6:6583),通知報文中內含私網機器1 的公網 IP 地址(112.93.14.56:43891)。
  • 步驟 3:私網機器 2 發送報文數據到私網機器 1 的公網 IP 地址(112.93.14.56:43891)。由於 NAT1 是限制錐型 NAT,此時私網機器 1 是不能收到報文數據的。
  • 步驟 4:私網機器 2 進行完步驟 3 以後,立即發送報文給服務器(180.93.45.46:8888),要求私網機器 1 發送數據給私網機器 2 的公網 IP 地址。
  • 步驟 5:服務器通知私網機器 1,通知信息內含公網 IP 地址(180.20.198.42.9681)。
  • 步驟 6:私網機器 1 發送報文數據給私網機器 2 的公網 IP 地址。由於步驟 3 發送報文給私網機器 2 的公網 IP 地址,此份報文會被 NAT2 的路由器認為是步驟 3 的回覆。所以此步驟會被允許通過。此時已經穿透了 NAT2。
  • 步驟 7:私網機器 2 回發報文給私網機器 1,此時穿透了 NAT1。穿透流程結束。

5.5.3 穿透對稱 NAT

對稱 NAT 的特點是每一個不同公網機器的通信,都會被分配不同的映射端口通信。若參照限制錐型 NAT 的穿透流程,則在不能準確地知道步驟 3 所產生的公網 IP 地址與端口。穿透流程如圖 5-20 所示。NAT1 為限制錐型 NAT,NAT2 為對稱 NAT。

去中心化技術分享與 P2P 框架的實現


  • 步驟 1:私網機器 1(192.168.1.3:2341)發送報文數據給服務器(180.93.45.46:8888),請求與私網機器 2 進行透傳。
  • 步驟 2:服務器(180.93.45.46:8888)發送通知信息給私網機器 2。通知信息內含私網機器1 的公網 IP 地址(112.93.14.56:43891)。
  • 步驟 3:私網機器 2 收到通知信息,發送報文數據給私網機器 1 的公網 IP 地址。此時由於NAT1 為限制錐形 NAT,數據是不被允許進入私網的。同時由於 NAT2 為對稱 NAT,所以會在此次報文發送過程中,會被產生新的映射記錄,分配公網地址與端口(iAddr:iPort)。
  • 步驟 4:私網機器 2 進行完步驟 3 以後,發送報文信息給服務器的另一個端口 8889,此步驟也會在路由器上產生一條新的映射記錄,分配公網地址與端口(mAddr:mPort)。服務器同時也獲取到新的公網地址與端口(mAddr:mPort)。
  • 步驟 5:服務器(180.93.45.46:8889)發送通知信息給私網機器 1。通知信息內含步驟 4 產生的新記錄公網地址與端口(mAddr:mPort)。此時根據 iPort 與 mPort 產生的相隔時間很短,可以來判斷 iPort 的值,即需要穿透的端口。為了判斷的根據準確,可以在產生 mPort之前也加上一次新記錄,即再步驟 3 以前讓 NAT 路由器產生一條記錄,這樣準確度會大大穿透的概率。
  • 步驟 6:根據 mPort 的值,來猜測 iPort 的值,發送報文信息給私網機器 2 的公網地址與端口(mAddr:mPort)。準確的 mPort 值,則能夠穿透 NAT2。
  • 步驟 7:收到穿透報文信息後,回覆報文信息。流程完畢。

希望本文技術點,對你有幫助。

關注+回覆:1 領取相關教程

去中心化技術分享與 P2P 框架的實現

小編專注於C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK等等多個知識點高級技術分享


分享到:


相關文章: