在開始說明 WebRTC 如何建立 P2P 連線前,咱們要先理解一件事情,那就是 WebRTC 要使用非常多的 P2P 連線技術,那位啥它需要使用如此多的技術呢 ? 那就是本篇文章要探討的主題:
為什麼 P2P 連線很麻煩呢 ?
因為如果你理解了這個問題,你就會知道為什麼 WebRTC 要使用怎麼多的技術來進行 P2P 連線囉,這也是為什麼我們會先說明這篇文章。
本篇文章的問題,為什麼 P2P 的連線會很麻煩呢 ? 最主要的問題在於:
NAT 與防火牆的存在。
因此本篇文章將針對這兩個東西來理解
NAT (Network Address Translation) 中文就做網路位置轉換,它是用來將私網 IP 轉換成公網 IP 的技術。
先說說它的起源。
在咱們世界裡有個叫 IPV4 的地址規則,由於它數量稀少,不可能讓每一台電腦都有一個地址,因此就有了以下的解法如下圖,就是每個家庭或公司只有一組地址,然後公司內的電腦就使用這位置來上網。
其中常用的私有 IP 段為:
這樣的確就可以解決 IPV4 位置不足的問題,那這裡問個問題。
因為假設一台外網的 Server 收到一個從 192.168.0.1 來的請求,那他在回覆時要送給誰呢 ? 說不定在那台 Server 所在的網路中也有一個 192.168.0.1,那這樣回覆就會送錯人囉。
而這就是 NAT 最主要的功能,將內網的 IP 對應到外網的 IP。
防火牆基本上所處的位置如下圖,它就是外網與內網的守門員,它最主要職則就是:
決定誰可以通過我 (防火牆)
基本上你會發現防火牆所在的位置與 NAT 所在的位置很相似,但是記好他們兩個的職則不太一樣:
不過現在很多情況下 NAT 事實上會包含了一些防火牆在做的事情,所以接下來我們就專心的來研究 NAT。
接下來這章節我們來詳細的理解一下 NAT 的實際運作原理。
假設:
A 在馬克公司內,想連到外部網站 B
A 的 IP:192.168.1.1
B 的 IP : 210.110.1.1
馬克公司 IP:310.110.1.1
NAT 對映表
內網 IP | 外網 IP |
---|---|
192.168.1.1 | 310.110.1.1:9000 |
192.168.1.2 | 310.110.1.1:9001 |
192.168.1.3 | 310.110.1.1:9002 |
那這樣連線流程如下圖。
為什麼有了 NAT 後 P2P 連線會很麻煩 ?
最主要的原因在於:
NAT 不允許外網主機直接訪問內網
當然這不是完全不行,假設如果你要在內網中架台 Server 給外部使用,那的確可以特別設置讓外部的人可以連線進來。
但是正常來說大部份都是無法直接連進來的,如果可以就代表你公司內部的電腦被外人看光光,但是 P2P 連線就是需要雙方都可以主動建立連線,這也是為什麼要建立 P2P 連線會很麻煩的關係。
還有另一個原因在於,就算你知道了對方的 IP 與 Port 以後,你要進行連線還是一定要經過 NAT 這時如果你不在 NAT 的允許進來名單裡面,那你就一定進不來的。
NAT 事實上有分很多類型,如果要學習 NAT 穿洞技術,那第一個條件就是要先了解你要穿的洞是什麼類型,這樣才能做相對應對策略,其本上分為以下四種類型
當內部主機(Aip, Aport)被 NAT 映射外部(Eip, Eport)。
當內部主機(Aip, Aport)被 NAT 映射外部(Eip, Eport)。
當內部主機(Aip, Aport)被 NAT 映射外部(Eip, Eport)。
這裡的意思是指,假設內網 A 傳給封包給外網 B,那 NAT 會分配 Port 50000。而如果 A 要傳給 C 那 NAT 會分配 Port 50001。
這種類型的 NAT 是無法實現 P2P 的,最主要的問題就在於它的 Port 會變。
在 Mobile 端如果使用 Wifi 來上網的大部份都是屬於前三種類型的,所以可以實現 P2P 穿透,而使用 3G 或 4G 的就是屬於 Symmetric NAT,所以它無法進行 P2P 穿透。(這未來會開篇文章來探討)
本篇文章中,咱們理解了為什麼要建立 P2P 連線很麻煩的原因,最主要就是 NAT 的問題,因此我們下一文章就要來說明 WebRTC 是如何來穿透 NAT 這東東。