30-28之 WebRTC 連線前傳 - 為什麼 P2P 連線很麻煩 ? ( NAT )

正文開始

在開始說明 WebRTC 如何建立 P2P 連線前,咱們要先理解一件事情,那就是 WebRTC 要使用非常多的 P2P 連線技術,那位啥它需要使用如此多的技術呢 ? 那就是本篇文章要探討的主題:

為什麼 P2P 連線很麻煩呢 ?

因為如果你理解了這個問題,你就會知道為什麼 WebRTC 要使用怎麼多的技術來進行 P2P 連線囉,這也是為什麼我們會先說明這篇文章。

本篇文章的問題,為什麼 P2P 的連線會很麻煩呢 ? 最主要的問題在於:

NAT 與防火牆的存在。

因此本篇文章將針對這兩個東西來理解

  • NAT 與防火牆是啥 ?
  • NAT 的運作原理。
  • 為什麼有了 NAT 後 P2P 會很麻煩 ?
  • NAT 的分類。

NAT 與防火牆是啥 ?

NAT

NAT (Network Address Translation) 中文就做網路位置轉換,它是用來將私網 IP 轉換成公網 IP 的技術。

為啥會有 NAT ?

先說說它的起源。

在咱們世界裡有個叫 IPV4 的地址規則,由於它數量稀少,不可能讓每一台電腦都有一個地址,因此就有了以下的解法如下圖,就是每個家庭或公司只有一組地址,然後公司內的電腦就使用這位置來上網。

其中常用的私有 IP 段為:

  • 10.0.0.0 ~ 10.255.255.255
  • 172.16.0.0 ~ 172.31.255.255
  • 192.168.0.0 ~ 192.168.255.255

這樣的確就可以解決 IPV4 位置不足的問題,那這裡問個問題。

那這樣私有 IP 要如何連到外面上網呢 ?

因為假設一台外網的 Server 收到一個從 192.168.0.1 來的請求,那他在回覆時要送給誰呢 ? 說不定在那台 Server 所在的網路中也有一個 192.168.0.1,那這樣回覆就會送錯人囉。

而這就是 NAT 最主要的功能,將內網的 IP 對應到外網的 IP。

防火牆

防火牆基本上所處的位置如下圖,它就是外網與內網的守門員,它最主要職則就是:

決定誰可以通過我 (防火牆)

兩者差異

基本上你會發現防火牆所在的位置與 NAT 所在的位置很相似,但是記好他們兩個的職則不太一樣:

  • 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

那這樣連線流程如下圖。

  1. A (192.168.1.1) 的封包抵達 NAT。
  2. NAT 將封包內的 source ip 修改成 310.110.1.1:9000 (根據對映表)。
  3. NAT 將 A 的封包(310.110.1.1:9000) 發送到 B (210.110.1.1)。
  4. B (210.110.1.1) 的回應抵達 NAT。
  5. NAT 將 B 發的封包根據對映表,來決定此幫包該發給誰。
  6. NAT 將 B 的封包發送到 A (192.168.1.1)。

為什麼有了 NAT 後 P2P 會很麻煩 ?

為什麼有了 NAT 後 P2P 連線會很麻煩 ?

最主要的原因在於:

NAT 不允許外網主機直接訪問內網

當然這不是完全不行,假設如果你要在內網中架台 Server 給外部使用,那的確可以特別設置讓外部的人可以連線進來。

但是正常來說大部份都是無法直接連進來的,如果可以就代表你公司內部的電腦被外人看光光,但是 P2P 連線就是需要雙方都可以主動建立連線,這也是為什麼要建立 P2P 連線會很麻煩的關係。

還有另一個原因在於,就算你知道了對方的 IP 與 Port 以後,你要進行連線還是一定要經過 NAT 這時如果你不在 NAT 的允許進來名單裡面,那你就一定進不來的。

NAT 的分類

NAT 事實上有分很多類型,如果要學習 NAT 穿洞技術,那第一個條件就是要先了解你要穿的洞是什麼類型,這樣才能做相對應對策略,其本上分為以下四種類型

Full Cone NAT

當內部主機(Aip, Aport)被 NAT 映射外部(Eip, Eport)。

  • 所有之後 A 出去的請求都會轉換成(Eip, Eport)
  • 所有外部主機發送(Eip, Eport)的都會轉換成(Aip, Aport)

Restricted Cone NAT

當內部主機(Aip, Aport)被 NAT 映射外部(Eip, Eport)。

  • 所有之後 A 出去的請求都會轉換成(Eip, Eport)
  • 所有外部主機發送(Eip, Eport)的都會轉換成(Aip, Aport)
  • 但可以設定限制的外部主機,也就是只有它發進來的才可以轉為(Aip, Aport)。

Port Restricted Cone NAT

當內部主機(Aip, Aport)被 NAT 映射外部(Eip, Eport)。

  • 所有之後 A 出去的請求都會轉換成(Eip, Eport)
  • 所有外部主機發送(Eip, Eport)的都會轉換成(Aip, Aport)
  • 但可以設定限制的外部主機與 Port,也就是只有它(ip 與 port)發進來的才可以轉為(Aip, Aport)。

Symmetric NAT ( 無法進行 P2P 串透 )

  • A 出去針對某個『特定』的位置的請求才會轉換成(Eip, Eport),不然 NAT 都會轉成不同的 Port。

這裡的意思是指,假設內網 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 這東東。

參考資料

comments powered by Disqus