理解網際網路協定

前面提到了一些 Router 連網所需的設定,有 PPPoE、DHCP 以及 Static 這幾種類型,如果成功連上網路後,都會被 ISP 派發到一組 IP 位置(IP Address),也就是你在網際網路中的地址。

但是,雖說你得到了一個 IP 位置,但並非其它人都可以透過這個 IP 位置來找到你,你拿到的很有可能是「虛擬」的 IP 位置;又或者你拿到的是「浮動」IP 位置,隔了一段時間還會變成其它的位置!

除了虛擬、浮動之外,提到 IP 位置當然還有固定的、不同版本的(IPv4、IPv6)。是否有點亂呢?我們接下來就從 IP 位置的基本原理和常見的應用及名稱聊起。

何謂 IP Address

TCP/IP 模型 來看,IP(Internet Protocol,網際網路協定)就是最早被定義及實做的兩個協定之一(另一個當然就是 TCP),而 IP 所規範的就是封包傳遞的細節。

要在網際網路中的兩個節點傳遞封包,就需要能夠「定位」到對方,也因此每個節點都需要一個位置,如同現實世界中的門牌一樣。這個位置在網際網路協定中就被稱為 IP Address。

現在最常見的 IP Address 是使用版本 4 的定義(IPv4, aka IP version 4),由 4 組數字所組成、用 . 分開,每個數字的 Range 都介於 0 - 255。我們先不談其它版本的 IP Address,從 IPv4 的位置聊起。

為何 IP Address 長成這樣?

常見 4 組數字組成的 IP 位置形式,其實是為了方便人類閱讀所轉換的。本質上,IP Address 是一個 32 bits(位元)的數字,也就是一個 32 位的「二進制數字」。

例如一個 IP 位置為 192.168.255.1 要表達成二進制,四組數字中的每一組都是 8 位的二進制數字,四組加起來總長度就是 32,表達成 11000000 10101000 11111111 00000001

IP Address 的進制轉換

詳細的二進制轉換在這裡就不多說了,拿 168 這個十進制的數字配合上圖來看,可以轉換成二進制的 10101000

而一個 8 位的二進制數字,最大值為全都是 1 的數字:11111111,等同於十進位的 255。這也就是為什麼每一組數字的 Range 都介於 0 - 255 的原因了。

浮動 IP、固定 IP、虛擬 IP,這麼多種 IP 都是什麼?

是否常常聽到這些在說 IP Address 的詞,如果你曾經被這些 IP 搞混,我們今天一次把他們弄清楚。

浮動 vs 固定 IP 位置

你有過在和 ISP 申請上網服務的時候,被詢問過是否需要固定 IP 位置嗎?通常都需要額外收費才能擁有固定的 IP 位置,然而一般上網需求的用戶根本不需要固定的 IP 位置,換句話說,不需要別人可以直接找到你。

前面提到,IP 位置就像是網際網路中的門牌位置,如果你需要在你的設備上架設網站等網路服務,需要別人能「定位」你,這時才會需要固定 IP 位置。

而反過來說,如果你不需要一個固定的 IP 位置,ISP 就會預設給你「浮動」IP 位置,意思是你也可以拿到一組門牌,但這組門牌號碼時不時是會變動的,ISP 可以依據他們的需要把這些門牌號碼移動來移動去的。

假如你有在這個 IP 位置下架設網站的需求,可能就有點麻煩了,會讓你的用戶時不時的換個 IP 位置取用你的服務;但若是你不需要,浮動的 IP 位置基本上不影響你的正常上網行為。

為什麼固定 IP 比較貴?

那為什麼 ISP 會需要在提供固定 IP 位置的情況下,收比較貴的費用呢?不都是提供門牌號碼,浮動 IP 似乎還要時不時的幫你換號碼,不是更麻煩嗎?

這就要提到 IPv4 的一個重大缺陷了:IP 位置總數量有限。根據經濟學的供需法則,如果需要 IP 位置的人多了,沒辦法想拿就能分配一個給你,價格就不會這麼便宜了。

在當初 IPv4 的位置長度(32 位元)被定義出來時,大家還沒有意識到 IP 位置居然會備用完,畢竟 32 位元的長度可以提供 2^32 個不同 IP 位置,也就是約莫 42 億個。

你可能會想說,一人發一個,全世界 70 億的人口都還沒辦法被完全分配到呢!但當時可是 1980 年代,個人電腦都還沒開始普及,誰會想到未來的世界人人都在用網路呢?

IP 位置就要用完了,那這可怎麼辦呢?每台連網設備不是都需要一個 IP 位置嗎?

虛擬 IP 位置

沒關係,為了避免 IP 位置耗盡的問題,IPv4 在規劃時有保留了一些 IP 位置是屬於 Private(私有)的,可以私下拿來使用,但不能作為上網時的 Public(公開)IP 位置。

這些私有的 IP 位置就被俗稱為虛擬 IP。以下三段 IP 位置都是私有 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

是否有過設定 Router 的經驗呢?常見的家用 Router,在區網的 IP 位置就是 192.168.1.1,這不就屬於上面私有 IP 位置的其中一段嗎?

因此當你興致勃勃的在電腦上架好了一個網站,想要給朋友試試看能否連線時,丟給他一個 192.168.xxx.xxx 的 IP 位置,除非他就在你的區域網路底下,否則是怎麼也連不到的!

網際網路無法直接 Access 區域網路內的 IP Address

那麼具體的區域網路是怎麼形成的,為何區網內可以互連呢?我們接下來就來看看「子網路遮罩」及「預設閘道」這些在設定 Router 時需要的知識。

何謂「子網路遮罩」,什麼又是「預設閘道」?

你是否有在電腦上做過網路設定呢?在常見網路問題 - 檢查 Router 設定中有簡單提到過 DHCP 和 Static(或 Manually,手動)兩種類型,都能取得到一組 IP 位置。在電腦上與在 Router 上情況一樣,取得到 IP 位置的方法大致也是這兩種。

差別是在 Static 下你需要填入自己這台電腦的 IP 位置、子網路遮罩,以及預設閘道,而 DHCP 會自動幫你填好。

在 Mac 上手動設定 IP Address

Subnet Mask 子網路遮罩

什麼是子網路遮罩,好奇怪的名字?子網路我可以理解,但為什麼是遮罩呢?這邊就來詳細聊聊。

首先,子網路故名思義就是某網路底下的部分網路,就有點像是台北市底下信義區這樣,而子網路遮罩的功能就是決定哪些 IP 位置是屬於同一個子網路用的,而在理解「遮罩」之前,我們有必要先講一講計算機中的某些運算。

AND 運算

我們普通世界常用的運算有加減乘除,在計算機的世界中雖然也有,但是並非基礎運算,也相較沒那麼容易直接實做出來。由於計算機處理的資料是二進制的,在硬體的設計上,最基本的運算用符合二進制的運算可以讓成本更低、速度更快。

例如一個輸入值從 0 變 1,或是從 1 變 0,就稱做 NOT 運算,這在計算機中所做的事就是把低電位(0)轉換成高電位(1)。

而把兩個輸入值做運算,例如 0 和 1 輸出成 0,1 和 1 輸出成 1,如下圖,就稱之為 AND 運算。

AND 運算

在計算機處理哪些 IP 位置屬於同一子網路時,用的就是這種運算。

回到子網路「遮罩」

那究竟要如何判斷子網路的 IP 位置呢?我們就用子網路遮罩,把給定的 IP 位置做上面提到的 AND 運算,再看得出來的結果,是否一樣就可以了。如果一樣,代表這些 IP 位置屬於同一個子網路,反之則屬於不同的子網路。

先看一下常見的子網路遮罩:255.255.255.0,長的很怪對吧?但轉換成二進制就比較好理解了,會變成:11111111 11111111 11111111 00000000,我們接下來試著用某些 IP 位置,對這個遮罩做做 AND 運算看看。

  • 192.168.1.1
  • 192.168.1.123
  • 192.168.2.1

首先先將其轉換成二進制的表示

二進制的 IP 位置轉換

然後將三個 IP 位置分別對子網路遮罩做 AND 運算

IP 位置與子網路遮罩 AND 運算

得到的結果為,前兩個 IP 位置都是同一個結果:192.168.1.0,第三個 IP 位置得到:192.168.2.0。也就是說前兩個 IP 位置屬於同一個子網路,而第三個則屬於其它子網路。

這樣做 AND 運算的過程,是否很像把一個 IP 位置丟到遮罩裡面呢?因為只要遮罩的數字是二進位的 1,結果就保持不變:如果是二進位的 0,就會被 AND 運算遮成 0。

Default Gateway 預設閘道

了解完稍微複雜些的子網路遮罩,最後來看看比較容易理解的設定:預設閘道。

預設閘道是由 Default Gateway 翻譯過來的,其實就是當你要連上網路時,封包要往哪裡丟的預設目的地而已。

而這個目的地通常就是 Router,所以像是我在 Mac 裡面做設定時,乾脆就把 Default Gateway 這個名稱拿掉,改成 Router。

小結:子網路

有了子網路遮罩及預設閘道,其實就可以表示成一個獨立的子網路囉。例如你的預設閘道是 192.168.1.1,而子網路遮罩是 255.255.255.0,這就意味著只要是 192.168.1 開頭的就屬於同一個子網路。

由於子網路遮罩都是在二進位都是由 1 開頭的,我們通常會計算前面總共有幾個 1,例如 255.255.255.0 在二進位有 24 個 1,配合上預設閘道是 192.168.1.1,我們就可以把這個子網路表示成 192.168.1.0/24

再舉一個例子,我們能否從子網路 10.1.0.0/16 判斷哪些 IP 位置在其之中呢?子網路遮罩前 16 個都是 1,就代表這個子網路的前 16 位都會是一樣的,換成十進位,就是 10.1 開頭的都屬於同一個子網路。

從 IPv4 到 IPv6,為何新技術遲遲不普及?淺談 NAT 及 IPv6

關於 Internet Protocol,我們最後來聊聊為了解決 IPv4 一些問題而提出的新版本 IPv6,以及為什麼早在上世紀末就規劃好解決方案,時至今日還是沒有廣泛的被使用?

首先來看看 IPv4 的主要問題:IP 位置數量不足。

IP 位置不足會影響什麼?

前面提到,由於 IPv4 在定義 Address 時只有使用 32 個位元,也就是總數為 42 億多的 IP 位置,在今天連網設備數量極多情況,根本沒辦法讓每個設備都被分配到一個實際的 Public IP Address。

有人可能會問,為何上網的設備都需要一個 IP 位置呢?這是因為當你取用網路服務時,實際上是在做封包交換,需要一個目的位置,當然也需要一個來源位置。

上網瀏覽時的訊息交換

例如我們在瀏覽網頁時,我們電腦的瀏覽器需要先送一段話給網站的伺服器,稱為 Request,其中會包含來源的 IP 位置。等網站伺服器收到這段 Request 後,就會把資料回傳給來源方,稱做 Response。

在 Request 及 Response 的訊息傳遞過程中,都會包含要送到哪個 IP 位置這個訊息,因此來源方需要提供一個可以到達的 IP 位置

為何特別標註可以到達的 IP 位置?因為 IPv4 的公開 IP 位置不足,所以很大一部份的連網設備,都會被 Router 分配一組私有(虛擬) IP 位置,而私有 IP 位置是無法在網際網路上被找到的,只有你所在的區域網路知道你在哪。

怎麼辦?這時有個叫做 NAT 的技術就被提出來了!

NAT 如何讓私有 IP 被定位?

NAT,是 Network Address Translation 的縮寫,中文翻譯成網路位置轉換。沒錯,就是轉換!把私有 IP 位置轉成公開 IP 位置,再轉回來不就得了?

基本的 NAT 就是這麼做的,由於網站伺服器無法定位私有 IP,在電腦送 Request 出去時,Router 就會把來源的 IP 位置改成自己的(Router 同時有兩個 IP 位置,區網內的私有 IP 位置,以及 ISP 指派的公開 IP 位置)。

NAT 改寫 IP 位置

在 Router 改寫來源 IP 位置時,也會在自己的記憶體內註記一下,把原本的私有 IP 位置 192.168.1.2 記錄下來,對應到從這個位置想要 Request 的目的 IP 位置 87.65.43.21

等到網站伺服器收到這個 Request,把資料回傳時,Router 一看這個來源網站伺服器為 87.65.43.21,剛好是我有記錄過的位置,就把這個 Response 丟回給有記錄的這個私有 IP 位置 192.168.1.2,大功告成!

也就是這樣技術的誕生,使得 IPv4 位置不夠的問題得到緩解。

被耽誤 30 年的 IPv6

雖說有這些技術讓 IP 位置不夠的問題有處理的方式,但終究不是最佳解。

透過 NAT 所轉送的封包會有一些限制,例如包了更多層的區域網路,一些需要頻繁交換封包的服務從外網進來就難以「穿透」達到真正的目的地,或變的更加複雜,並存在一些安全性的疑慮。

這時將協定更新成 IPv6 就顯的較為重要。和 IPv4 最大的不同就是地址的長度,從原先的 32 位元,一下變長了 4 倍達到 128 位元。也就是說,總 IP 位置的數量從原本的 42 億多一下增加到 2^128 (約為 10^38 這樣的數量級)這麼多,就算全世界每個人一天增加 10000 連網設備,到老也用不完的地步。

這麼長的 IP 位置,用十進位表示顯然也還是太長,因此最常見的表示方法就改為每 16 位元一組,每組 4 個 16 進制數字,並且中間用 : 隔開,例如 2001:0db8:86a3:08d3:1319:8a2e:0370:7344

縱使解決了大部分 IPv4 的弊端,但在 IPv4 已經普及而且不到很難用的情況下,IPv6 還是無法完全取代 IPv4,究其原因還是相容性的問題。當初設計時並沒有辦法直接讓 IPv6 的硬體設備支援 IPv4 的封包,導致要實做一些像是 Tunneling 的轉換機制,才能讓其相容。

也因此這讓網路設備開發商,亦或是 ISP 們比較沒有動力開發或使用 IPv6 的設備,也畢竟大多數的人用 IPv4 還是用的好好的,何必多花錢更新呢?

在去年底(2020)的 IPv6 流量已經佔全部流量的 30% 了,但過了 IPv6 已經提出的 30 多年後,還不知道何時能真正普及呢?

參考資料

  1. Wiki - IPv4
  2. Wiki - IPv4 位置枯竭
  3. 鳥哥的 Linux 私房菜 - TCP/IP 的網路層相關封包與資料
  4. Wiki - IPv6
  5. 鳥哥的 Linux 私房菜 - NAT
  6. Wiki - NAT
  7. TWNIC Blog - IPv6 何時才能全面普及?
  8. Wiki - ICANN