? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?去中心化技術(shù)與P2P框架的實現(xiàn)
關(guān)于去中心化的網(wǎng)絡(luò)架構(gòu), 也是服務(wù)器架構(gòu)范疇內(nèi)必不可少的一部分。 本章討論的內(nèi)容,不涉及任何軟件技術(shù)框架,也不涉及任何軟件代碼分析,注重把去中心化網(wǎng)絡(luò)的原理分析清楚, 最后通過 Linux 系統(tǒng)編程實現(xiàn)網(wǎng)絡(luò)穿透。 大家可以參照 github 代碼。為了使本章更加容易描述, 現(xiàn)對五個概念做一個不嚴謹?shù)姆菍W術(shù)的定義。
1> 客戶端: 用戶直接操作的終端軟件。
2> 節(jié)點: 對通信網(wǎng)絡(luò)中機器的簡稱,包括客戶端機器,服務(wù)器機器,路由器等等
3> P2P: 描述終端與終端直接通信的方式。
4> 網(wǎng)絡(luò)穿透: 實現(xiàn)終端與終端直接通信的一種技術(shù)方案。
5> 去中心化網(wǎng)絡(luò): 包含終端,服務(wù)器,以及之間通信方式,一起組成的通信網(wǎng)絡(luò)。
一、中心化網(wǎng)絡(luò)與去中心化
為了更好的理解去中心化網(wǎng)絡(luò),先來理解傳統(tǒng)的中心化網(wǎng)絡(luò)拓撲圖(圖 a) 。不論
常用的 B/S 還是 C/S,都是一種星型結(jié)構(gòu),而中心化節(jié)點正是服務(wù)器, 每一個客戶端只能與
服務(wù)器通信。如果客戶端與客戶端之間需要通信,必須要得通過服務(wù)器進行路由處理,才
能把數(shù)據(jù)路由到另一個客戶端。 在通信過程中,服務(wù)器與客戶端是充當著不同角色的,不
同功能的。 服務(wù)器是對所有客戶端提供服務(wù)的, 這樣的通信網(wǎng)絡(luò),被稱為中心化網(wǎng)絡(luò)。

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

二、網(wǎng)絡(luò)地址映射 NAT
在私網(wǎng)與外網(wǎng)通信的過程中, 私網(wǎng)與公網(wǎng)連接的邊沿節(jié)點被稱為路由器。 比如私網(wǎng)內(nèi)部
網(wǎng)絡(luò)為 192.168.1.0 的網(wǎng)絡(luò)。 路由器的公網(wǎng) IP 為 112.93.114.32, 服務(wù)器的公網(wǎng) IP 地址為
120.93.24.180。 服務(wù)器發(fā)送數(shù)據(jù)與路由器公網(wǎng) IP 時,能夠?qū)?shù)據(jù)映射到私網(wǎng)中的機器;私
網(wǎng)內(nèi)的機器發(fā)送數(shù)據(jù)給服務(wù)器,路由器也能夠映射為公網(wǎng) IP 地址的過程,成為網(wǎng)絡(luò)地址映
射。

NAT (Network Address Translation, 網(wǎng)絡(luò)地址映射)是將公網(wǎng)地址映射為私網(wǎng)地址。
而能夠進行映射的網(wǎng)絡(luò)裝置被稱為 NAT 路由器。
二(a)、NAT的原理
由于全球網(wǎng)絡(luò)通信機器增加, IPv4 地址緊缺, 所以提出了 NAT 的理論, 通過公網(wǎng) IP 地
址與端口映射到私網(wǎng)機器的 IP 地址與端口。 這樣就能通過少量的公有 IP 地址能夠代表較
多的私有 IP 地址,有助于減緩可用 IPv4 地址的耗盡。

私網(wǎng)內(nèi)機器上操作系統(tǒng)中的一個網(wǎng)絡(luò)進程, 與公網(wǎng)服務(wù)器 120.93.24.180 機器通信,
NAT 路由器為每一個網(wǎng)絡(luò)進程分配一個網(wǎng)絡(luò) IP 地址與端口,用于與公網(wǎng)服務(wù)器通信。 與此
同時,公網(wǎng)服務(wù)器與私網(wǎng)內(nèi)的網(wǎng)絡(luò)進程通信,也是通過 NAT 路由器分配的網(wǎng)絡(luò) IP 地址與端
口進入私網(wǎng)到達網(wǎng)絡(luò)進程。
二(b)、NAT的實現(xiàn)
NAT 的實現(xiàn)方案有三種, 靜態(tài)轉(zhuǎn)換,動態(tài)轉(zhuǎn)換,端口地址映射。
靜態(tài)轉(zhuǎn)換(Static NAT): 私網(wǎng) IP 地址轉(zhuǎn)換為公網(wǎng) IP 地址, 公網(wǎng) IP 與私網(wǎng) IP 地址通
過一對一的配置,配置后是不能更改的。通過靜態(tài)轉(zhuǎn)換, 實現(xiàn)對私網(wǎng)中的網(wǎng)絡(luò)進程進行訪問。
私網(wǎng)有多少私有地址需要與公網(wǎng)通信,需要配置與之對應的外網(wǎng) IP 地址,并不節(jié)省公網(wǎng) IP
地址,所以一般不用。

動態(tài)轉(zhuǎn)換(Dynamic NAT): 為私網(wǎng)分配多個公網(wǎng) IP 地址, 組成一個公網(wǎng) IP 地址池。私
網(wǎng)內(nèi)部地址需要轉(zhuǎn)換時, NAT 路由器從公網(wǎng) IP 地址池中取出一個 IP 地址,分配給私網(wǎng)機器
用于網(wǎng)絡(luò)通信。 當私網(wǎng)機器數(shù)據(jù)傳輸結(jié)束后, NAT 路由器收回公網(wǎng) IP 地址,返回 IP 地址池
中。 分配后的 IP 地址是不能再用于其他數(shù)據(jù)傳輸。 在公網(wǎng) IP 地址數(shù)量略少于私網(wǎng)機器數(shù)量
的時候,可以采用動態(tài)轉(zhuǎn)換。

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

三、NAT種類
從 NAT 的技術(shù)實現(xiàn)角度, 可以分為三種,靜態(tài)轉(zhuǎn)換(Static NAT),動態(tài)轉(zhuǎn)換(Dynamic
NAT), 端口地址映射(Port Address Translation, PAT)。
從 NAT 的功能, 可以分為四種: 完全錐型 NAT(Full Cone NAT), 對稱 NAT(Symmetric
NAT), IP 限制錐型 NAT(IP Restricted Cone NAT),端口限制錐形 NAT(Port Restricted
Cone NAT)。
三(a)、完全錐型NAT
完全錐型 NAT(Full Cone NAT),私網(wǎng)機器的網(wǎng)絡(luò)進程(iAddr:iPort)被 NAT 路由器
映射為公網(wǎng)地址( pAddr:pPort),后續(xù)該網(wǎng)絡(luò)進程的所有數(shù)據(jù)報文都被轉(zhuǎn)換為公網(wǎng)地址
(pAddr:pPort),公網(wǎng)任何一臺機器發(fā)送報文到(pAddr:pPort),會被轉(zhuǎn)發(fā)到私網(wǎng)機器的網(wǎng)
絡(luò)進程(iAddr:iPort)。如下圖所示:

三(b)、對稱NAT
對稱 NAT(Symmetric NAT), NAT 路由器會為私網(wǎng)機器的每一個網(wǎng)絡(luò)進程都會分配一個
地址與端口,從而把私網(wǎng)網(wǎng)絡(luò)進程(iAddr1:iPort1) 與公網(wǎng)地址(pAddr1:pPort1)。后續(xù)
NAT 路由器會把私網(wǎng)機器地址端口(iAddr1:iPort1)與公網(wǎng)地址端口(pAddr1:pPort1)完
全相同的報文看作一個連接。如下圖:

私網(wǎng)機器的網(wǎng)絡(luò)進程每與一臺公網(wǎng)機器通信, NAT 路由器都會重新分配一個地址端
口。 這樣使得每一個通信鏈路都是經(jīng)過 NAT 路由器不同的端口。 公網(wǎng)機器往私網(wǎng)發(fā)送報文
也是經(jīng)過不一樣的端口。
三(c)、IP限制錐型NAT
限制錐型 NAT(Restricted Cone NAT), 又名 IP 限制錐型 NAT。為了更好理解四種 NAT,
故本篇中一直稱為 IP 限制錐型 NAT。限制錐型 NAT,只允許映射關(guān)系的對應公網(wǎng) IP 地址機
器,傳輸數(shù)據(jù)到私網(wǎng)機器。其他的公網(wǎng) IP 地址機器發(fā)送數(shù)據(jù)給 NAT 路由器的公網(wǎng) IP 地址與
端口時, 則會被 NAT 路由器丟棄。如下圖:

私網(wǎng)機器網(wǎng)絡(luò)進程(192.168.1.3:2341)發(fā)送報文到公網(wǎng)地址(180.93.45.46:8080)的服
務(wù)器,在 NAT 路由器上產(chǎn)生了映射公網(wǎng)地址(112.93.114.33:34523)。 有以下兩種情形分開
討論
情形一: 私網(wǎng)機器網(wǎng)絡(luò)進程沒有發(fā)送報文給其他公網(wǎng)機器, NAT 路由器只允許公網(wǎng) IP
地址為 180.93.45.46 的機器數(shù)據(jù)進入,其他地址機器的數(shù)據(jù)報文則會被 NAT 路由器阻擋,
不允許進入內(nèi)網(wǎng)。
情形二: 私網(wǎng)機器網(wǎng)絡(luò)進程同時發(fā)送報文給另一臺公網(wǎng)機器,此時 NAT 路由器生成了
NAT 映射記錄,則另一臺公網(wǎng)機器發(fā)送報文與公網(wǎng)地址(112.93.114.33:34523), NAT 路由
器是允許報文進入私網(wǎng)。
先由私網(wǎng)機器發(fā)送報文到公網(wǎng)機器, 限制錐形 NAT 路由器方能允許公網(wǎng)機器報文進入
私網(wǎng)。
三(d)、端口限制型錐型NAT
端口限制錐形 NAT(Port Restricted Cone NAT), 在 IP 限制錐型 NAT 的基礎(chǔ)上,又添
加了一層端口限制。 限制了發(fā)送報文進入私網(wǎng)的 IP 地址與端口。 如圖 5-12 所示, 私網(wǎng)機器
(192.168.1.3:2341) 發(fā)送報文數(shù)據(jù)到公網(wǎng)機器(180.93.45.46:8080)的過程中,在 NAT 路
由器上產(chǎn)生了(112.93.114.33:34523) 記錄。 有以下兩種情形討論。
情形一: 私網(wǎng)機器網(wǎng)絡(luò)進程沒有發(fā)送報文給公網(wǎng)機器(180.93.45.46)其他端口, 則 NAT
路由器只允許公網(wǎng)地址(180.93.45.46:8080)的數(shù)據(jù)報文進入私網(wǎng)。
情形二: 私網(wǎng)機器網(wǎng)絡(luò)進程發(fā)送數(shù)據(jù)給公網(wǎng)機器(180.93.45.46)的其他端口, NAT 路由
器生成一條 NAT 記錄, 則允許該端口的數(shù)據(jù)報文到達網(wǎng)絡(luò)進程。

四、NAT鑒別方案
已經(jīng)了解了四種 NAT 的功能, 本小節(jié)介紹四種 NAT 之間的邏輯關(guān)系,并且用計算機邏輯
流程實現(xiàn)判斷 NAT 的方案。
完全錐型 NAT(Full Cone NAT),對稱 NAT(Symmetric NAT), IP 限制錐型 NAT(IP
Restricted Cone NAT),端口限制錐形 NAT(Port Restricted Cone NAT)。 這四種 NAT 的
邏輯關(guān)系, 可以將 NAT 劃分為一顆二叉樹, 如圖 5-13 所示。 NAT 分為兩種對稱 NAT 與錐型
NAT,錐型 NAT 分為兩種限制錐型 NAT 與完全錐型 NAT。限制錐型 NAT 分為兩種端口限制錐
型 NAT 與 IP 限制錐型 NAT。 葉子節(jié)點正好是劃分出來的四種 NAT, 同級節(jié)點互補,合為整
集。
判別網(wǎng)關(guān)是屬于哪種 NAT 的方案,就能參照下圖所示,按照二叉樹的層級逐層判斷,
從而確定網(wǎng)關(guān)的 NAT 類型。 三次判斷分別為對稱 NAT 與錐型 NAT,限制錐型 NAT 與完全錐型
NAT,端口限制錐型 NAT 與 IP 限制錐型 NAT。

四(a)、對稱NAT與錐型NAT
對稱 NAT 與錐型 NAT 的區(qū)別, 在于私網(wǎng)機器與不同的公網(wǎng)機器通信在 NAT 路由器上產(chǎn)
生映射表記錄的條數(shù)。 對稱 NAT 與 N 臺公網(wǎng)機器通信則生成 N 條記錄;而錐形 NAT 與 N 臺
公網(wǎng)機器通信則生成 1 條記錄。

判斷流程如下, 如圖 5-14 所示:
步驟 1: 私網(wǎng)機器( 192.168.1.3:2341) 發(fā)送報文到服務(wù)器 1( 180.93.45.46:8888) 的 NAT
路由器產(chǎn)生了對外公網(wǎng) IP( 112.93.114.33:23454),此時服務(wù)器 1 獲取客戶端 IP 地址即為
對外公網(wǎng) IP( 112.93.114.33:23454)
步驟 2: 私網(wǎng)機器( 192.168.1.3:2341)發(fā)送報文到服務(wù)器 2( 118.56.189.34:8888)。 服務(wù)
器 2 獲取客戶端 IP 地址( iAddr:iPort)
步驟 3: 服務(wù)器 1 獲取客戶端的 IP 地址,發(fā)送給服務(wù)器 2。 服務(wù)器 2 對比服務(wù)器 1 發(fā)過來的
地址與服務(wù)器 2 獲取的客戶端 IP 地址。 若兩個客戶端 IP 地址一致,則為錐型 NAT;若不一
致則為對稱 NAT。
四(b)、完全錐型NAT與限制錐型NAT
完全錐型 NAT 與限制錐形 NAT 的區(qū)別, 在于其他公網(wǎng)機器發(fā)送報文到 NAT 路由器對外
公網(wǎng) IP 地址能否到達私網(wǎng)機器, NAT 路由器的 NAT 類型是完全錐型 NAT 的話,私網(wǎng)機器能
夠收到報文數(shù)據(jù),限制錐形 NAT 則不能收到報文數(shù)據(jù)。

判斷流程如下, 如上圖 所示:
步驟 1: 私網(wǎng)機器網(wǎng)絡(luò)進程(192.168.1.3:2341)發(fā)送報文給服務(wù)器 1(180.93.45.46: 8888)。
服務(wù)器 1 獲取到客戶端 IP 地址(即 NAT 路由器對外公網(wǎng) IP 地址)。
步驟 2: 服務(wù)器 1 將獲取的客戶端 IP 地址發(fā)送給服務(wù)器 2。
步驟 3: 服務(wù)器 2 收到客戶端 IP 地址以后,發(fā)送報文給客戶端 IP 地址。 探測客戶端 IP 地
址能否收到報文數(shù)據(jù)。 若是完全錐型 NAT,則私網(wǎng)機器能夠收到報文;若是限制錐形 NAT,
則私網(wǎng)不能收到報文數(shù)據(jù)。
步驟 4: 私網(wǎng)機器網(wǎng)絡(luò)進程收到報文數(shù)據(jù), 繼續(xù)發(fā)送報文給服務(wù)器 1。服務(wù)器 1 收到了報文
數(shù)據(jù)。判斷結(jié)束。 服務(wù)器 1 收到報文數(shù)據(jù), 則為完全錐型 NAT;否則為限制錐型 NAT。
四(c)、IP限制型錐型NAT與端口限制型錐型NAT
IP 限制錐型 NAT 與端口限制錐型 NAT 的區(qū)別, 在于公網(wǎng)機器的其他端口發(fā)送報文數(shù)據(jù)
給私網(wǎng)機器網(wǎng)絡(luò)進程能否收到。 網(wǎng)絡(luò)進程能收到同一臺公網(wǎng)機器的其他端口發(fā)送的報文數(shù)據(jù)
則為 IP 限制錐型 NAT,否則為端口限制錐型 NAT。
判斷流程如下,如下圖所示:
步驟 1: 私網(wǎng)機器網(wǎng)絡(luò)進程(192.168.1.3:2341)發(fā)送報文給服務(wù)器(180.93.45.46: 8888)。
服務(wù)器獲取到客戶端 IP 地址。
步驟 2: 服務(wù)器從另一個端口(180.93.45.46:8888), 發(fā)送報文數(shù)據(jù)給客戶端 IP 地址。若私
網(wǎng)機器能夠收到報文則為 IP 限制錐型 NAT, 若不能則為端口限制錐型 NAT。
步驟 3: 私網(wǎng)機器網(wǎng)絡(luò)進程回發(fā)報文給服務(wù)器 8888 的端口, 收到報文數(shù)據(jù),判斷結(jié)束。 若
收到數(shù)據(jù)則為 IP 限制錐形 NAT,否則為端口限制錐型 NAT。

四(d)、STUN協(xié)議
STUN 最早是在 RFC3489 中定義, (Simple Traversal of UDP Through NATs) ,即用 UDP
簡單的穿透 NAT, 作為一個完整的 NAT 穿透解決方案。 在 RFC5389 中, 把 STUN 協(xié)議定義為
穿透 NAT 提供工具,而不是一個完整的解決方案。 STUN
(Session Traversal Utilities for
NAT, NAT 會話穿越應用程序)
是一種網(wǎng)絡(luò)輕量級協(xié)議,它允許私網(wǎng)應用程序發(fā)現(xiàn)它們與公共互聯(lián)網(wǎng)之間存在的 NAT 和防火墻及其他類型。 它也可以讓應用程序確定 NAT 分配給它們的公網(wǎng) IP 地址與端口, STUN 是一種 Client/Server 的協(xié)議,也是一種 Request/Response的協(xié)議, 默認端口3478。 本小節(jié)描述的 NAT 類型鑒別,是將 STUN 實現(xiàn)原理與細節(jié),分析與展示出來。
五、網(wǎng)絡(luò)穿透
網(wǎng)絡(luò)穿透,即 NAT 穿透, 能夠讓公網(wǎng)機器找到私網(wǎng)機器,并提高下載速度。 如圖 5-17
所示, 穿透圖中兩個網(wǎng)關(guān)路由器,從而報文數(shù)據(jù)能夠直接到達私網(wǎng)機器。 穿透的本質(zhì)是給一
個 NAT 路由器的公網(wǎng) IP 地址與端口發(fā)送報文數(shù)據(jù), 對應私網(wǎng)機器能夠收到報文數(shù)據(jù)。 比如
圖中 NAT1,私網(wǎng)機器(192.168.1.3:2341)發(fā)送報文到公網(wǎng)服務(wù)器(180.93.45.46:8888)
的過程中,在 NAT 路由器上產(chǎn)生了一條公網(wǎng)映射記錄(112.93.14.56:43891)。后續(xù)其他外
網(wǎng)機器(192.168.2.6:6583)發(fā)送報文數(shù)據(jù)給公網(wǎng)映射記錄(112.93.14.56:43891),使得
私網(wǎng)機器(192.168.1.3:2341)能夠收到該報文數(shù)據(jù)。

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

步驟 1: 私網(wǎng)機器 1(192.168.1.3:2341)發(fā)送報文給服務(wù)器(180.93.45.46:8888)。 服務(wù)
器獲取到私網(wǎng)機器 1 的公網(wǎng) IP 地址與端口(112.93.14.56:43891)。
步驟 2: 服務(wù)器收到信息后,通知私網(wǎng)機器 2(192.168.2.6:6583), 通知信息內(nèi)含私網(wǎng)機器
1 的公網(wǎng) IP 地址與端口(112.93.14.56:43891)。
步驟 3: 私網(wǎng)機器 2(192.168.2.6:6583)發(fā)送數(shù)據(jù)給私網(wǎng)機器 1 的公網(wǎng) IP 地址與端口
(112.93.14.56:43891),此時私網(wǎng)機器 1 就能收到私網(wǎng)機器 2 發(fā)送的報文數(shù)據(jù),并且能過
獲取私網(wǎng)機器 2 的公網(wǎng) IP 地址與端口(iAddr:iPort)。
步驟 4: 私網(wǎng)機器 1 回發(fā)報文信息給私網(wǎng)機器 2 的公網(wǎng) IP 地址與端口(iAddr:iPort),此
時私網(wǎng)機器 2 能夠收到報文數(shù)據(jù)。 穿透流程結(jié)束。
b.穿透限制錐型NAT
限制錐型 NAT 的特點是限制了其他公網(wǎng)機器報文數(shù)據(jù)傳輸。 如果在采用完全錐型 NAT 的
穿透步驟,就會在步驟 3 不能到達私網(wǎng)機器。 針對于兩端 NAT 都是限制錐形 NAT 的情況,穿
透流程如下圖所示。

步驟 1: 私網(wǎng)機器 1(192.168.1.3:2341) 發(fā)送報文給服務(wù)器(180.93.45.46:8888),服務(wù)
器獲取私網(wǎng)機器的公網(wǎng) IP 地址(112.93.14.56:43891)。
步驟 2: 服務(wù)器發(fā)送通知報文給私網(wǎng)機器 2(192.168.2.6:6583), 通知報文中內(nèi)含私網(wǎng)機器
1 的公網(wǎng) IP 地址(112.93.14.56:43891)。
步驟 3: 私網(wǎng)機器 2 發(fā)送報文數(shù)據(jù)到私網(wǎng)機器 1 的公網(wǎng) IP 地址(112.93.14.56:43891)。由
于 NAT1 是限制錐型 NAT, 此時私網(wǎng)機器 1 是不能收到報文數(shù)據(jù)的。
步驟 4: 私網(wǎng)機器 2 進行完步驟 3 以后,立即發(fā)送報文給服務(wù)器(180.93.45.46:8888),要
求私網(wǎng)機器 1 發(fā)送數(shù)據(jù)給私網(wǎng)機器 2 的公網(wǎng) IP 地址。
步驟 5: 服務(wù)器通知私網(wǎng)機器 1, 通知信息內(nèi)含公網(wǎng) IP 地址(180.20.198.42.9681)。
步驟 6: 私網(wǎng)機器 1 發(fā)送報文數(shù)據(jù)給私網(wǎng)機器 2 的公網(wǎng) IP 地址。由于步驟 3 發(fā)送報文給私
網(wǎng)機器 2 的公網(wǎng) IP 地址,此份報文會被 NAT2 的路由器認為是步驟 3 的回復。所以此步驟會
被允許通過。 此時已經(jīng)穿透了 NAT2。
步驟 7: 私網(wǎng)機器 2 回發(fā)報文給私網(wǎng)機器 1,此時穿透了 NAT1。穿透流程結(jié)束。
c.穿透對稱NAT
對稱 NAT 的特點是每一個不同公網(wǎng)機器的通信,都會被分配不同的映射端口通信。 若
參照限制錐型 NAT 的穿透流程,則在不能準確地知道步驟 3 所產(chǎn)生的公網(wǎng) IP 地址與端口。
穿透流程如下圖所示。 NAT1 為限制錐型 NAT, NAT2 為對稱 NAT。

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


Client 1:

Client 2:

穿透之后,關(guān)閉服務(wù)器,2個Client可以互相發(fā)送消息。
學習P2P的,gitbub上有實列。可以參考evilpan的大神的代碼學習:https://github.com/evilpan/P2P-Over-MiddleBoxes-Demo
blob:
?https://evilpan.com/2015/10/31/p2p-over-middle-box/