【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More

Hello Guys, I’m LukeTseng. 歡迎你也感謝你點入本篇文章,本系列主要讀本為《Computer Networking: A Top-Down Approach, 8th Edition》,就是計算機網路的聖經,會製作該系列也主要因為修課上會用到。若你喜歡本系列或本文,不妨動動你的手指,為這篇文章按下一顆愛心吧,或是追蹤我的個人公開頁也 Ok。


4.3.1 IPv4 Datagram Format(Ipv4 資料包格式)

IPv4 Datagram 是什麼?

在 Internet 的網路層中,封包稱為 datagram,IPv4 datagram 可以想成「網路層寄送資料的包裹」,裡面分成兩大部分:

  • Header(標頭):給路由器與目的主機看的控制資訊。
  • Data / Payload(資料負載,或稱酬載):真正要送的資料,通常是 TCP 或 UDP segment。

書中的 Figure 4.17(如下圖)畫出 IPv4 datagram 的格式,IPv4 標頭不是固定完全一樣長,因為可能含有 Options,但大多數情況沒有 Options,

所以常見 IPv4 header 是 20 bytes

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - 4.3.1 IPv4 Datagram Format(Ipv4 資料包格式)

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 361, Figure 4.17)

接著來依照欄位順序,一步步拆解 IPv4 標頭的組成:

  • Version Number(版本號):
    • Version 欄位用來告訴路由器:「這個封包是用哪一個 IP 版本格式寫的?」
    • IPv4 和 IPv6 的封包格式不同,所以路由器必須先看版本欄位,才能知道接下來的 bits 應該怎麼解讀,不同 IP 版本會有不同的 datagram 格式。
  • Header Length(標頭長度):
    • 因為 IPv4 header 可能含有 Options,所以 header 長度不一定固定。
    • Header Length 欄位的作用就是告訴接收端從哪開始才是真正的 payload。
    • 大多數 IPv4 datagram 沒有 Options,因此通常 IPv4 header 長度是 20 bytes。
  • Type of Service, TOS(服務型態):
    • TOS 用來區分不同類型的 datagram,例如:
      • 即時語音、視訊通話等比較重視低延遲。
      • FTP 檔案傳輸比較重視資料完整傳完。
      • 一般 Email 通常不需要即時性。
    • TOS 可讓即時資料和非即時資料被區分,而實際提供什麼服務等級,則由路由器或網路管理者設定。
    • 另外 TOS 中有兩個 bits 可用於 Explicit Congestion Notification, ECN。
  • Datagram Length(資料包總長度):
    • 這個欄位表示整個 IPv4 datagram 的長度,也就是 Header Length + Data Length。
    • 由於該欄位為 16 bits,因此理論最大值為 65,535 個 byte,但很少有 datagram 大於 1,500 個 byte,因為這樣可以放入最大 Ethernet frame 的 payload 中。
  • Identifier、Flags、Fragmentation Offset(識別碼、旗標、分段偏移量):這三個欄位都與 IP fragmentation,IP 分段 有關。
    • 當 IPv4 datagram 太大,無法通過某些連結時,則可能被切成數個較小的 datagram,這些小片段會各自被轉送,到目的地主機後再重新組合。
    • 這些欄位就是用來支援 fragmentation(分段)與 reassembly(重組)的部分。
    • 三個欄位大致分工如下:
欄位功能
Identifier標記這些 fragments 原本屬於同一個 datagram
Flags控制是否可分段、是否還有後續 fragment
Fragmentation Offset說明這個 fragment 在原始資料中的位置

註:IPv6 不允許像 IPv4 這樣由中間路由器進行 fragmentation。

  • Time-to-Live, TTL(存活時間):TTL 的目的是為了限制封包最多能經過多少個 router。
    • 每經過一台 router,TTL 會減 1。
    • 若 TTL 變成 0,router 必須丟棄該 datagram,這可避免封包因為 routing loop 而永遠在網路中繞圈,即永無止盡的傳送封包。
  • Upper-layer Protocol(上層協定):Protocol 欄位用來告訴目的主機 IP datagram 的 payload 應該交給哪一個上層協定處理。
    • 通常只有當 IP Datagram 到最終目的地才會用到這個欄位。
    • 常見值:
      • Protocol Number 6 -> TCP
      • Protocol Number 17 -> UDP
    • Protocol 欄位是連接 network layer 與 transport layer 的關鍵,就像 transport layer 的 port number 是連接 transport layer 與 application layer 的關鍵。
    • 也就是說:
      • IP header 的 Protocol:決定交給 TCP 還是 UDP。
      • TCP/UDP header 的 Port Number:決定交給哪個應用程式,例如瀏覽器、遊戲、DNS client
  • Header Checksum(標頭檢查和):Header Checksum 用來檢查 IPv4 header 在傳輸過程中是否發生 bit error。
    • checksum 是把 header 中每 2 bytes 視為一個數字,使用 1’s complement arithmetic 加總,最後將結果的 1’s complement 存進 checksum 欄位。
    • router 收到 datagram 後會重新計算 checksum,若與 header 內的 checksum 不一致,通常會丟棄該 datagram。
    • 重要觀念:每經過一台 router,TTL 會改變,所以 IPv4 header checksum 也必須重新計算,這會增加 router 的處理成本。
    • 為什麼 IP 層和 TCP/UDP 層都要做 checksum?書中給出三個原因:
      1. IP checksum 只檢查 IP header
      2. TCP/UDP checksum 檢查的是整個 TCP/UDP segment
      3. TCP/UDP 不一定永遠跑在 IP 上,IP 也不一定只承載 TCP/UDP
  • Source IP Address 與 Destination IP Address:這兩個欄位都各是 32 bits。
    • Source IP Address:來源主機的 IP
    • Destination IP Address:最終目的地主機的 IP
    • 當來源主機建立 datagram 時,會把自己的 IP 填入 Source IP Address,並把最終目的地 IP 填入 Destination IP Address。
    • 另外,目的 IP 常常是透過 DNS lookup 得到的。
  • Options(選項欄位):Options 讓 IPv4 header 可以擴充功能,但它很少被使用。
    • 原因是 Options 會造成兩個問題:
      1. Header 長度變成可變,router 不能直接假設 payload 從固定位置開始。
      2. 有些 datagram 需要處理 options,有些不用,導致 router 處理時間不穩定。
    • 這對高效能 router 和 host 來說是重要負擔,因此 IPv6 的標準 header 不再直接包含 IPv4 這種 Options 欄位。
  • Data / Payload(資料酬載):最後是 Data 欄位,也就是 datagram 真正要傳送的內容。
    • 大多數情況下,Data 會放 TCP segment 跟 UDP segment;但也可能放其他資料,例如 ICMP message。
    • 若 IPv4 datagram 沒有 Options,IP header 是 20 bytes;如果 payload 是 TCP segment,TCP header 通常也是 20 bytes,所以總 header overhead 是 20 + 20 = 40 bytes。
    • 即一個承載 TCP 的 IPv4 datagram,至少會有 40 bytes 的標頭開銷。

所有欄位總覽

欄位長度功能
Version4 bits表示 IP 版本,例如 IPv4
Header Length4 bits告訴接收端 header 多長、payload 從哪裡開始
Type of Service, TOS8 bits用來區分不同服務需求的封包
Datagram Length16 bits整個 IP datagram 的長度,包含 header + data
Identifier16 bits與 fragmentation 有關
Flags3 bits與 fragmentation 有關
Fragmentation Offset13 bits表示 fragment 在原始 datagram 中的位置
Time-to-Live, TTL8 bits防止封包在網路中永無止盡的傳送
Protocol8 bits指出 payload 要交給 TCP、UDP 或其他協定
Header Checksum16 bits檢查 IPv4 header 是否出錯
Source IP Address32 bits來源 IP
Destination IP Address32 bits目的 IP
Options可變長度額外功能,現在很少用
Data / Payload可變長度真正要傳送的資料

4.3.2 IPv4 Addressing(Ipv4 定址)

IPv4 位址如何分配?子網路(Subnet)如何形成?路由器如何利用位址做轉送?主機又如何取得 IP 位址?

這些都是該節所要探討的問題。

IP 位址是給介面,不是給整台機器

在網路中,主機或路由器是透過 interface(介面)連到網路的。

裝置interface 數量
一般主機,例如筆電通常 1 個或多個,例如 Wi-Fi、乙太網路
路由器通常很多個,因為它要連接多條不同網路

嚴格來說,IP address 是綁在 interface 上,而非綁在整台 host 或 router 上。

IPv4 位址長度是 32 bits,所以理論上共有 2322^{32} 個可能位址,大約是 43 億個。

IPv4 位址通常寫成 dotted-decimal notation(附點十進位表示法),例如:193.32.216.9193.32.216.9

也就是把 32 bits 分成 4 組,每組 8 bits,再轉成十進位。

Subnet:具有相同前綴的一群 interface

Subnet(子網路)可理解成一群不需要經過路由器,就能彼此直接連通的 interface。

例如書中的例子:223.1.1.0/24223.1.1.0/24

其中 /24/24 表示:前 24 bits 是 subnet 部分,也就是網路前綴,剩下 8 bits 給該子網路內的主機或路由器介面使用。

因此 223.1.1.0/24223.1.1.0/24 就代表該 subnet 裡面的位址通常長得像 223.1.1.xxx223.1.1.xxx 這樣,像是 223.1.1.1223.1.1.1223.1.1.2223.1.1.2 等等。

如何簡單理解 subnet?把 subnet 想成一棟宿舍,住在同一棟宿舍的人,房號前面都一樣,例如 A 棟,只有最後的房號不同。

例如下圖的介面位址與子網路範例圖:一台路由器有三個介面(可以看到三個橢圓形)被用來連接七台 hosts。

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - Subnet:具有相同前綴的一群 interface

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 365, Figure 4.18)

而下圖說明上圖 4.18 所呈現的三個 IP subnet。

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - Subnet:具有相同前綴的一群 interface

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 366, Figure 4.19)

如何判斷一個網路有幾個 subnet?

要定義子網路,請將各個介面與其 host / router 分離,建立多塊孤立的網路,其中,介面為這些孤立網路的終點終端。這些孤立網路每個都是所謂的子網路。

也就是說:

  • 一群主機接到同一個路由器 interface,可以形成一個 subnet。
  • 兩台路由器之間的 point-to-point link,也是一個 subnet。
  • subnet 不一定要有很多主機;兩個 router interfaces 之間也可以是一個 subnet。

因此請不要誤以為 subnet 一定就是很多電腦連在一起,只要是同一段 IP 網路、同一個前綴,而且彼此直接相連,就可以視為 subnet。

若將上述的:「要定義子網路,請將各個介面與其 host / router 分離,建立多塊孤立的網路,其中,介面為這些孤立網路的終點終端。這些孤立網路每個都是所謂的子網路。」,應用在下圖中的互連系統上,就可得出 6 個孤立網路或 subnet。

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - 如何判斷一個網路有幾個 subnet?

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 367, Figure 4.20)

至於哪六個?我幫你框起來:

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - 如何判斷一個網路有幾個 subnet?

CIDR:現代 IPv4 位址分配方式

CIDR 的全名是 Classless Interdomain Routing(無分級跨網域繞送)。

CIDR 的格式是 a.b.c.d/xa.b.c.d/x 的位址,其中:

  • a.b.c.da.b.c.d 是 IP 位址前綴。
  • /x/x 表示前面 xx 個 bits 是網路前綴。
  • 剩下的 32x32−x bits 用來區分該組織內部的主機或子網路。

例如 200.23.16.0/20200.23.16.0/20 ,代表前 20 bits 是共同前綴。

CIDR 的用途是讓路由器不用記住每一台主機,只需要記住一段 IP prefix 即可,這樣可以大幅縮小 forwarding table(轉送表)的大小。

Classful addressing(分級定址法)

在 CIDR 出現以前,IPv4 使用 classful addressing(分級定址法),主要分成:

類別網路部分長度常見表示問題
Class A8 bits/8太大
Class B16 bits/16對中型組織常常太浪費
Class C24 bits/24只能容納約 254 台主機,常常太小

例如 Class C:282=2542^8 - 2 = 254 ,可用主機數只有 254 台,對很多公司來說是不夠的,但是 Class B:2162=655342^{16} - 2= 65534,這個數字又太大,假設一間公司只有 2000 台主機,卻拿到一整個 Class B,就會浪費超過 6 萬個位址。

因此 CIDR 的彈性分配方式,解決了 classful addressing 太僵硬的問題。

Address aggregation:把多個網路合併公告

Address aggregation(位址聚集),也叫:

  • route aggregation
  • route summarization

Address aggregation 的意思是 ISP 可以用一個較大的 prefix,代表底下許多小網路。

例如 ISP 擁有 200.23.16.0/20200.23.16.0/20,它可以把這段切給多個組織,例如:

  • 200.23.16.0/23200.23.16.0/23
  • 200.23.18.0/23200.23.18.0/23
  • 200.23.20.0/23200.23.20.0/23

對外部 Internet 來說,不需要知道每個組織的細節,只要知道目的地落在 200.23.16.0/20200.23.16.0/20 的封包,都送給這個 ISP 即可。

這就是階層式定址的好處,外部路由器的 forwarding table 會變小,Internet 才能擴展到巨大規模。

Broadcast address:255.255.255.255

IPv4 的 broadcast address(廣播位址):255.255.255.255255.255.255.255

當主機把 datagram 的目的地設為這個位址時,訊息會送到同一個 subnet 內的所有主機,路由器理論上可以轉發到鄰近 subnet,但通常不會這樣做。

綜觀:取得位址區塊

機構(例如一所大學或企業)若要讓內部的設備連上網路,首先需要向其 ISP 取得一段連續的 IP 位址區塊。

ISP 本身會將其擁有的大型位址區塊(例如 200.23.16.0/20200.23.16.0/20)再切割成更小的子區塊(例如 /23/23),平均分配給底下的不同機構。

ISP 的位址又是哪來的呢?答案是 ICANN(Internet Corporation for Assigned Names and Numbers,網路名稱與數位地址分配機構)。

ICANN 負責管理全球 IP 位址空間,並將位址分配給各個區域網際網路註冊管理機構(Regional Internet Registries, RIRs),再由它們發放給各國的 ISP。

微觀:主機位址的動態分配(DHCP)

在主機上的位址也可手動配置,但通常透過 DHCP(Dynamic Host Configuration Protocol,動態主機配置協定)來完成。

DHCP 不僅能為你分配一個暫時的 IP 位址(這稱為位址的租約, Lease),還會一併告訴你子網路遮罩、第一跳路由器(預設閘道器)的位址,以及本地 DNS 伺服器的位址。

由於 DHCP 能將主機連上的網路的網路相關工作做自動化,因此也被稱為隨插隨用協定(plug-and-play protocol) 或 zeroconf 定址自動化技術(zero-configuration)。

DHCP 是一種 Client-Server 的協定,其運作過程可以 refine 為四個步驟(常被業界簡稱為 DORA 流程),由於剛連上線的電腦(Client)什麼都不知道(沒有 IP,也不知道 DHCP 伺服器在哪),因此它必須大量依賴廣播(Broadcast)來尋找援助。

:::info
DORA:

  1. Discover(探索):客戶端剛加入網路,尚未取得 IP 位址,因此使用廣播方式尋找可用的 DHCP 伺服器。
  2. Offer(提供):DHCP 伺服器收到 Discover 後,回傳 DHCPOFFER,提供可用的 IP 位址、子網路遮罩、租約時間等設定。
  3. Request(請求):客戶端從一個或多個 Offer 中選擇一個,然後發送 DHCPREQUEST,表示它要使用該 DHCP 伺服器提供的設定。
  4. Acknowledge(確認):DHCP 伺服器回傳 DHCPACK,確認該 IP 位址與相關設定正式租用給 client。client 收到 ACK 後,才算完成 DHCP 互動,並可在租約期限內使用該 IP 位址。
    :::

白話版:

步驟(DORA)訊息名稱sender → receiver說明
1. DiscoverDHCPDISCOVER新主機 → 廣播(255.255.255.255「有人在嗎?我需要一個 IP!」
主機將來源 IP 設為 0.0.0.0,並將此訊息封裝於 UDP 區段(目的地埠號 67,來源埠號 68)中廣播出去。
2. OfferDHCPOFFER伺服器 → 廣播(255.255.255.255「我在這!這個 IP(例如 223.1.2.4)跟你借 3600 秒如何?」
伺服器收到請求後,廣播回應包含提議的 IP 位址、網路遮罩、租約時間等參數。
3. RequestDHCPREQUEST新主機 → 廣播(255.255.255.255「太好了,我決定接受你提議的 IP!」
主機可能收到多個伺服器的 Offer,它會選擇其中一個,並再一次廣播告知所有伺服器它的選擇。
4. ACKDHCPACK伺服器 → 廣播(255.255.255.255「成交!這 IP 是你的了。」
伺服器確認該參數配置,主機收到後即可正式使用該 IP 位址。

儘管稱 DHCP 為網路設定協定,但它其實是封裝在傳輸層的 UDP 協定中運作的,可把它想像成是一支特殊的網路應用程式:

  • 客戶端綁定:UDP Port 68
  • 伺服器端綁定:UDP Port 67

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - 微觀:主機位址的動態分配(DHCP)

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 373, Figure 4.24)

註:上圖的 yiaddr 意思為「你的網際網路位址」,全名 Your IP address,代表將要指派給薪到來的客戶端的位址。

DHCP 的限制與挑戰

雖然 DHCP 實現了隨插隨用,但在行動性(Mobility)上存在一個致命缺陷。

因為 DHCP 發放的 IP 位址是綁定在特定的子網路上,當一台行動裝置(例如手機)移動到另一個子網路時,它必須向新的 DHCP 伺服器重新申請一個新的 IP 位址。

這種 IP 位址的改變,會導致依賴原 IP 位址建立的 TCP 連線(TCP Connections)瞬間斷線,為了解決這個問題,後來才發展出了如行動 IP(Mobile IP)與 4G/5G 蜂巢式網路的換手(Handover)機制。

4.3.3 Network Address Translation (NAT)

網路位址轉譯(Network Address Translation, NAT)是一種讓私有網路內的眾多設備,能夠透過共享單一(或少數幾個)外部公開 IP 位址來連接網際網路的技術。

為什麼需要 NAT?因為 IPv4 位址只有 32 bits,理論上約有 43 億個位址,但實際可用數量更少。因為隨著小型辦公室與家庭辦公室(SOHO, Small Office / Home Office)網路的普及,每個家庭的手機、平板、電腦、印表機、遊戲機、智慧電視等裝置大量增加,如果每個裝置都要一個全球唯一的公開 IP,IPv4 位址會很快不夠用。

所以就需要 NAT 來處理位址分配的問題,讓內部很多台裝置使用私人 IP,但對外只共用一個公開 IP。

例如家裡可能有這些 IP:

裝置私人 IP
電腦10.0.0.1
手機10.0.0.2
平板10.0.0.3
印表機10.0.0.4

但對外連到 Internet 時,這些裝置可能全部都看起來像是同一個公開 IP,例如:138.76.29.7

還有一個問題:對外連線都共用同個 IP 位址,當遠端伺服器把資料回傳時,NAT 路由器怎麼知道這個資料包是要交給家裡的哪一台手機還是筆電呢?答案是靠 Port Number。

:::info

名稱意思
私人 IP不能直接在 Internet 上被路由的 IP 位址,例如 192.168.1.5
私有網路使用私人 IP 所組成的內部網路,例如家中 Wi-Fi 裡的手機、電腦、印表機
:::

NAT 實際如何轉換?

下圖 4.25 顯示具備 NAT 功能的路由器的運作。

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - NAT 實際如何轉換?

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 375, Figure 4.25)

NAT 路由器有兩側:

介面說明
LAN side內部網路,使用私人 IP10.0.0.0/24
WAN side對外網路,使用公開 IP138.76.29.7

如圖 4.25,所有從家庭網路(位於右側)出去的封包,Source IP 都會被改成 NAT router 的公開 IP 138.76.29.7,而所有從外部進來的封包,目的 IP 也必須是 138.76.29.7

對 Internet 而言,NAT router 會讓整個網路看起來只有單一一台設備,僅有一個公開 IP。


那 NAT 如何做轉換?

例如內部主機是 10.0.0.1,現在要連到外部的 Web Server 128.119.40.186:80

原先的封包可能是:

1
2
Source:      10.0.0.1:3345
Destination: 128.119.40.186:80

若該封包如果直接送到 Internet 會有問題,因為 10.0.0.1 是私人 IP,外部網路不知道怎麼回來,因此 NAT router 會把來源改掉,改成下面那樣:

1
2
Source:      138.76.29.7:5001
Destination: 128.119.40.186:80

同時 NAT router 會在自己的 NAT translation table(NAT 轉譯表)裡做紀錄:

WAN sideLAN side
138.76.29.7:500110.0.0.1:3345

該表的意思是之後如果外部伺服器回傳封包到 138.76.29.7:5001,NAT router 就知道要把它轉回給內部的 10.0.0.1:3345

該例子即上圖 4.25,說明 NAT 如何透過 IP + port number 建立對應關係。

:::info
NAT translation table(NAT 轉譯表):NAT 路由器內部維護的資料結構,用來記錄「內部私有 IP 與埠號」和「外部公開 IP 與埠號」之間的雙向對應關係。
:::

回程封包如何處理?

外部 Web server 回傳時,封包可能長這樣:

1
2
Source:      128.119.40.186:80
Destination: 138.76.29.7:5001

NAT router 收到後,查 NAT translation table 會發現 138.76.29.7:5001 對應到 10.0.0.1:3345

所以它會把目的地改回這樣子:

1
2
Source:      128.119.40.186:80
Destination: 10.0.0.1:3345

然後再把封包送回內部主機 10.0.0.1

NAT 的優點

優點說明
節省 IPv4 位址多台內部裝置共用一個公開 IP
內部 IP 可自由管理家裡可以自行使用 192.168.x.x10.x.x.x
更換 ISP 較方便內部 IP 不一定要跟著公開 IP 改
隱藏內部網路結構外部通常看不到家中每台設備的私人 IP
搭配 DHCP 很方便家用路由器通常同時提供 NAT 與 DHCP

NAT router 的公開 IP 通常可以由 ISP 的 DHCP server 分配,而 NAT router 也可以在內部執行 DHCP server,替家中設備分配私人 IP。

NAT 面臨的爭議與批評

雖然 NAT 相當實用且被廣泛部署,但在網路架構純粹主義者(Architectural Purists)的眼中,卻有著不少爭議:

  1. 埠號的濫用:埠號原本的設計是用來定址主機內部的 Process,而不是用來 addressing 不同的主機,會對在家庭網路內運作的伺服器或 P2P 協定造成嚴重的連線障礙。
  2. 破壞分層原則:路由器理應是網路層(Layer 3)的設備,應該只處理到網路層的封包,但 NAT 卻會去修改傳輸層(Layer 4)的埠號,違反了分層架構的設計原則。
  3. 破壞端到端原則(End-to-End Principle):網路設計的初衷是讓端點主機直接且透明地相互溝通,中間節點不應去修改 IP 位址與埠號,NAT 的介入讓網路不再是單純的傳輸通道。

小結:NAT 整體的運作機制

  1. 內部發起連線:假設內部主機 10.0.0.1 想要向遠端 Web 伺服器 128.119.40.186:80 發送 HTTP 請求,主機作業系統隨機分配了一個來源埠號 3345
  2. NAT 攔截與轉換:當資料包來到 NAT 路由器時,路由器會將來源 IP 替換為自己的公開 IP(例如 138.76.29.7),並分配一個新的來源埠號(例如 5001),路由器接著將這個對應關係記錄在 NAT 轉換表中。
  3. 伺服器回應:Web 伺服器收到請求後,對它來說,請求就是來自 138.76.29.7 埠號 5001,因此它會將回應發送至這個目的地。
  4. NAT 反向轉換:NAT 路由器收到回應後,查詢 NAT 轉換表,發現目的地埠號 5001 對應的是內部主機 10.0.0.1 的埠號 3345,於是將目的地位址與埠號改寫,並把資料包轉送給內部主機。

4.3.4 IPv6

該節主要在回答三件事:

  1. 為什麼需要 IPv6?
  2. IPv6 封包格式與 IPv4 有何不同?
  3. IPv4 網際網路如何逐步過渡到 IPv6?

為什麼需要 IPv6?

IPv6 出現的主要原因是 IPv4 的 32-bit 位址空間不夠用了。

IPv4 位址長度是 32 bits,所以理論上最多約有 2324.3×1092^{32} \approx 4.3 \times 10^9 個位址可用。

也就是大約 43 億個 IP 位址,在早期看起來很多,但隨著電腦、手機、伺服器、物聯網裝置、子網路快速增加,IPv4 位址逐漸耗盡。

因此,IETF 在 1990 年代初期開始設計 IPv4 的後繼協定,也就是 IPv6。而書中提到 IANA 在 2011 年已經把最後一批未分配的 IPv4 位址區塊分配給區域註冊機構。

IPv6 的三大主要改變

1. 位址從 32 bits 擴大到 128 bits(以及擴充的定址能力)

IPv6 最明顯的改變是 IP 位址長度從 IPv4 的 32 bits 增加到 128 bits。

IPv6 可提供的位址數量是 21282^{128} ,這是一個極大的數字,遠遠超過 IPv4 的 43 億個位址。因此,IPv6 的設計目標之一就是讓網際網路不再輕易遇到位址耗盡問題。

IPv6 除了支援原本的 unicast(單播)與 multicast(多播)外,也新增了 anycast address(隨播位址)。

位址類型說明
Unicast一對一傳送,傳給某一個特定主機
Multicast一對多傳送,傳給一群主機
Anycast傳給一群主機中的「其中一個」,通常是最近或最適合的一個

當我們連到某個大型網站時,不一定連到世界上唯一一台伺服器,而是連到離我們比較近、回應比較快的鏡像伺服器,這就是 anycast。

2. 精簡後的 40-byte 標頭

IPv4 的標頭長度是可變的,通常是 20 bytes,但如果有 options,會變得更長;而 IPv6 則改成固定 40 bytes 的標頭。

這樣設計的好處是 router 在處理 IPv6 封包時,不需要一直判斷標頭到底多長,因此處理速度更快。

IPv6 移除了或改變了 IPv4 中一些會拖慢路由器處理速度的欄位,例如:

  • fragmentation / reassembly
  • header checksum
  • options

這些改動的目標很明確,就是為了要讓路由器轉送封包更快、更簡單。

3. 資料流標籤(Flow Label)

IPv6 新增了 Flow Label 欄位,用來標記某些屬於同一個 flow 的封包。

書中提到,flow 的定義其實比較彈性,可以理解成一連串具有相同需求、希望被網路特別處理的封包。

例如:

  • 即時語音通話 VoIP
  • 視訊會議
  • 串流影音
  • 付費高優先權使用者的封包。

這些封包可能需要較低延遲、較穩定的傳輸品質,因此 IPv6 預先設計了 Flow Label,讓未來網路可以更容易區分不同流量。

這就像一般郵件可以慢慢送,但急件、醫療物資、冷凍食品可能需要特別標籤與優先處理,而 Flow Label 就像封包上的特殊運送標籤。

IPv6 Datagram Format 封包格式

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - IPv6 Datagram Format 封包格式

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 379, Figure 4.26)

IPv6 Datagram 格式詳解:

  1. Version:欄位長度為 4 bits,用來表示 IP 版本。
    • 在 IPv6 中,這個欄位的值是 6。但不是把這個欄位改成 4,就會變成 IPv4 datagram,IPv4 和 IPv6 的封包格式不同,不能只靠改版本號碼轉換。
  2. Traffic Class(流量類型):Traffic Class 長度為 8 bits,功能類似 IPv4 的 TOS 欄位。
    • 它可用來區分不同流量的優先順序,例如:
      • VoIP 語音封包需要低延遲,優先權可能較高。
      • SMTP 電子郵件不需要即時送達,優先權可以較低。
    • 簡單來說 Traffic Class 可以幫助網路設備判斷哪些封包比較急,哪些封包可以慢一點。
  3. Flow Label:長度 20 bits,用於識別某一連串屬於同一 flow 的封包。
    • 例如,一場視訊會議的封包可能都屬於同一個 flow,路由器看到相同 Flow Label 時,可知道這些封包可能需要相似的處理方式。
  4. Payload Length:長度 16 bits(這 16 bits 被視為無號整數),表示 IPv6 固定 40-byte 標頭後面還有多少 bytes 的資料。
    • 注意,它不包含 IPv6 標頭本身,只計算標頭後面的部分,也就是 IPv6 datagram total size = 40 bytes header + Payload Length
  5. Next Header(內層標頭):用來指出 IPv6 payload 接下來應該交給哪一個協定處理,功能類似 IPv4 中的 Protocol 欄位。

例如下表:

Next Header 指向意義
TCPpayload 是 TCP segment
UDPpayload 是 UDP segment
Options / Extension Headerpayload 後面還有 IPv6 extension header
  1. Hop Limit(躍程限制):類似 IPv4 的 TTL,每經過一個路由器,Hop Limit 就會減 1,如果減到 0,路由器就會丟棄該封包。
    • 其目的在於避免封包因為路由錯誤而在網路中無限循環,例如原本 Hop Limit = 64,他會這樣一直 -1:64,63,,064, 63, \cdots, 0 ,彈到 0 就丟棄。
  2. Source Address 與 Destination Address:IPv6 的來源與目的位址都是 128 bits。
  3. Data:IPv6 datagram 的 payload,也就是真正要傳送的內容,當封包抵達目的主機時,IPv6 會根據 Next Header 欄位,把 payload 交給對應的上層協定,例如 TCP 或 UDP。

IPv6 Datagram 格式總覽

欄位長度功能
Version4 bits表示 IP 版本,IPv6 中值為 6
Traffic Class8 bits類似 IPv4 的 TOS,用於流量優先權
Flow Label20 bits標記同一個 flow 的封包
Payload Length16 bits表示 IPv6 標頭後方 payload 的長度
Next Header8 bits指出下一層協定,例如 TCP 或 UDP
Hop Limit8 bits類似 IPv4 的 TTL,每經過一個路由器減 1
Source Address128 bits來源 IPv6 位址
Destination Address128 bits目的 IPv6 位址
Data可變真正承載的資料

IPv6 移除了 IPv4 的哪些欄位?

IPv6 的設計重點之一是讓標頭更簡潔,因此,IPv6 移除了 IPv4 中幾個重要欄位。

1. 不讓中間路由器做 Fragmentation / Reassembly

IPv4 中,路由器可以把太大的 datagram 切成較小片段,也就是 fragmentation。

但 IPv6 不允許中間路由器做 fragmentation / reassembly,IPv6 只允許來源端與目的端處理這件事。

那如果 IPv6 的 datagram 太大怎麼辦?他會這樣做:

  1. 直接丟棄該 datagram。
  2. 回傳 ICMP(Internet Control Message Protocol) 錯誤訊息。
  3. 傳送端收到後,改用較小的 datagram 重新傳送。

這樣做的原因是 fragmentation 和 reassembly 很耗時間,會拖慢路由器轉送封包的速度。

2. 移除 Header Checksum

IPv4 有 Header Checksum,用來檢查 IP 標頭是否出錯。

但 IPv6 移除了這個欄位,原因是:

  1. 傳輸層 TCP / UDP 已經有 checksum。
  2. 連結層如 Ethernet 也有錯誤檢查。
  3. IPv4 的 TTL 每經過一個路由器都會改變,因此 Header Checksum 每一跳都要重新計算,成本很高。

IPv6 為了加快路由器處理速度,就把 Header Checksum 拿掉。

但 IPv6 不是完全不檢查錯誤,他只是把重複的檢查從網路層移除,讓其他層(Transport Layer 跟 Link Layer)負責。

3. Options 不再放在固定標頭內

IPv4 的 options 會讓標頭長度變得不固定,造成路由器處理麻煩。

IPv6 的做法:

  • 固定標頭保持 40 bytes。
  • Options 改成可能的 Next Header,也就是 extension header。

這樣 IPv6 的基本標頭可以保持簡單固定,但仍保留擴充能力。

IPv4 vs IPv6 封包格式

比較項目IPv4IPv6
位址長度32 bits128 bits
標頭長度可變,通常 20 bytes固定 40 bytes
Fragmentation中間路由器可做只有來源與目的端可做
Header Checksum
Options在標頭內透過 Next Header / Extension Header
TTL / Hop LimitTTLHop Limit
Protocol / Next HeaderProtocolNext Header
Flow Label

IPv4 到 IPv6 的過渡問題

IPv6 設計完成後,最大的問題不是技術本身,而是全球網際網路已經大量部署 IPv4,要如何慢慢換成 IPv6?

書中指出,新設計的 IPv6 系統可以向下相容 IPv4,也就是可以送、收、路由 IPv4 datagram,但已存在的 IPv4 設備無法向上理解 IPv6 datagram。

這造成一個現實問題,例如 IPv6 主機想傳 IPv6 封包,而中間網路可能還是 IPv4 路由器,但 IPv4 路由器看不懂 IPv6 封包。

因此還不能直接要求所有設備瞬間升級。

Flag Day(揭旗日)為什麼不可行?

一種理論上的做法是 flag day,也就是指定某一天、某一個時間,全世界所有網路設備一起關機升級,從 IPv4 換成 IPv6。

但書中指出,這在現代網際網路幾乎不可能,原因是全球有數十億台設備,不同組織、ISP、公司、國家不可能同步升級;以及網際網路不能大規模停機,且設備汰換週期都不同。

所以 IPv4 到 IPv6 不能用「一次全部換掉」的方式,而必須逐步過渡。

就像要求全台灣所有道路、車牌、導航系統、交通號誌在同一天全部換成新制度,在實務上幾乎不可能。

Tunneling:IPv6 過渡的主要方法

IPv4 到 IPv6 過渡中,實務上被廣泛採用的方法是 tunneling,中譯隧道技術或穿隧技術、通道方案等等。

Tunneling 的概念是把一個 IPv6 datagram 包在 IPv4 datagram 的 payload 裡面,讓它能穿過只支援 IPv4 的網路區段。

即 IPv4 Header + IPv6 Datagram。

IPv4 路由器只看到外層 IPv4 header,因此會正常轉送,但它不知道裡面其實藏了一整個 IPv6 datagram。

Tunneling 的運作流程

【計算機網路筆記】4.3 The Internet Protocol (IP): IPv4, Addressing, IPv6, and More - Tunneling 的運作流程

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 382, Figure 4.27)

  1. B 產生 IPv6 datagram:B 想送一個 IPv6 datagram 給 E,原本理想狀況是 BEB \rightarrow E 直接用 IPv6 傳送,但中間有 IPv4-only routers,所以不能直接送。
  2. B 把 IPv6 datagram 封裝進 IPv4 datagram:B 將整個 IPv6 datagram 放進 IPv4 datagram 的 payload 中。
    • 概念如下:
      • 外層:IPv4 Header
      • 內層:完整 IPv6 Datagram
  3. 中間 IPv4 routers 正常轉送:中間的 IPv4 路由器只處理外層 IPv4 header,它們不知道 payload 裡面是 IPv6 datagram,但也不需要知道,對它們來說,這只是一個普通 IPv4 datagram。
  4. E 收到 IPv4 datagram 後解封裝:E 是 tunnel 的接收端,收到 IPv4 datagram 後,會檢查 IPv4 header 的 Protocol Number。
    • 如果 Protocol Number 是 41,表示 IPv4 payload 裡面裝的是 IPv6 datagram。
    • 接著 E 會做以下的事情:
      1. 移除外層 IPv4 header。
      2. 取出內層 IPv6 datagram。
      3. 像收到一般 IPv6 datagram 一樣繼續處理或轉送。

這個流程中,IPv6 datagram 就像一封外國格式的信,中間郵局看不懂,於是你把它裝進一個本地郵局看得懂的標準信封 IPv4 datagram,中間郵局只看外層信封地址,把信送到目的地。到達後,收件人拆開外層信封,取出真正的 IPv6 信件。

IPv6 推廣速度與困難

書中最後提到,IPv6 的採納一開始相當緩慢,但後來逐漸加速。例如 NIST 報告指出,美國政府第二層網域中已有超過三分之一支援 IPv6,而 Google 也回報約 25% 存取 Google 服務的 client 是透過 IPv6。

不過,IPv6 的推廣仍然困難,原因在於改變 network-layer protocol 就像替房子換地基,非常困難,網路層是位於整個網際網路架構的核心,不像應用層協定那樣容易新增。

總整理

4.3.1 IPv4 Datagram Format

IPv4 封包 (Datagram) 由 Header(標頭)Payload(資料,常為 TCP/UDP segment) 組成。

  • Header 預設大小:通常為 20 bytes(若不含 Options)。承載 TCP 時,加上 TCP 標頭 20 bytes,總開銷至少 40 bytes。

重點欄位解析:

  • Version (4 bits):IP 版本(IPv4 或 IPv6)。
  • Header Length (4 bits):標示 Header 長度,指出 Payload 起點。
  • TOS (8 bits):服務型態,區分資料優先級(如 VoIP vs. Email)與壅塞通知 (ECN)。
  • Datagram Length (16 bits):總長度(Header + Data),最大 65,535 bytes,但通常小於 1,500 bytes 配合 Ethernet。
  • 分段與重組三本柱 (Identifier / Flags / Offset):若封包過大,路由器會將其切割,這三個欄位負責標記、控制是否分段、以及指出碎片在原封包中的位置。
  • TTL (8 bits):存活時間。每經一台路由器 -1,歸 0 則丟棄,防止路由迴圈 (Routing loop)。
  • Protocol (8 bits):連結傳輸層,指示交給哪種協定(TCP=6, UDP=17)。
  • Header Checksum (16 bits):檢查標頭是否有錯。每經過路由器 TTL 改變,都必須重新計算
  • Source / Destination IP (各 32 bits):來源與目的 IP。

4.3.2 IPv4 Addressing

  • 基本概念:IP 位址是綁定在網路介面 (Interface) 上,而非整台設備。
  • Subnet (子網路):不需經過路由器即可直接連通的一群介面。
  • CIDR (無分級跨網域繞送)
    • 現代 IP 分配法,格式如 a.b.c.d/x(前 x bits 為網路前綴)。
    • 取代早期僵硬浪費的 Class A/B/C 分級法。
    • 支援 Address Aggregation (位址聚集):讓路由器用一個大前綴代表多個小網路,大幅縮小轉送表。
  • DHCP (動態主機配置協定)
    • 隨插隨用,自動分配 IP、遮罩、Gateway 與 DNS。
    • 運作於 UDP (Port 67/68),依賴廣播 (255.255.255.255) 尋找伺服器。
  • DORA 流程
    1. Discover(尋找伺服器)
    2. Offer(伺服器提供 IP)
    3. Request(客戶端確認選用)
    4. ACK(伺服器正式租出)
  • 限制:移動至不同子網需重新要 IP,會導致 TCP 斷線。

4.3.3 NAT (網路位址轉譯)

為了解決 IPv4 位址枯竭,讓內部私有網路共用一組(或少數)外部公開 IP。

  • 運作機制:透過 NAT 轉換表 (Translation Table) 改寫封包。
    • 出去時:將 Private IP : 來源 Port 改為 Public IP : 新分配 Port
    • 回來時:比對轉換表,將目的地改回原來的 Private IP : 來源 Port
  • 優點:節省 IPv4、內部 IP 可自訂、對外隱藏內部拓樸結構。
  • 爭議 (網路純粹主義者批評)
    1. 濫用 Port 號(Port 本應用於區分 Process,而非主機定址)。
    2. 破壞分層原則(L3 路由器竄改 L4 標頭資訊)。
    3. 破壞端到端原則(End-to-End Principle)。

4.3.4 IPv6

為徹底解決 IPv4 位址耗盡而誕生,大幅優化路由器處理效率。

IPv6 三大核心變革

  1. 位址空間擴大 (128 bits):支援 Unicast (單播)、Multicast (多播) 以及新增的 Anycast (隨播)(傳給最近的伺服器,如 CDN 節點)。
  2. 固定 40-byte 標頭:取消變動長度,加速路由器處理速度。
  3. 新增 Flow Label (20 bits):標記同性質的資料流(如視訊、語音),利於提供特殊優先級處理。

移除 / 變更的 IPv4 欄位

  • 禁止中間路由器 Fragmentation:太大的封包直接丟棄並回傳 ICMP 錯誤,強迫來源端自己切小塊,減輕路由器負擔。
  • 移除 Header Checksum:因為 L2 與 L4 已經有檢查碼,且省去每跳重新計算的開銷。
  • Options 移出固定標頭:改用 Next Header (Extension Header) 串接,維持主標頭固定長度。

IPv4 到 IPv6 的過渡方案

無法強迫全球設備同一天升級 (Flag Day 不可行),因此採用 Tunneling (穿隧技術)

  • 概念:將整個 IPv6 封包「當作資料」塞進 IPv4 的 Payload 中。
  • 運作:經過 IPv4 網路時,舊路由器只看外層 IPv4 標頭進行轉送;到達支援 IPv6 的接收端後,再把外層 IPv4 剝除 (解封裝),取出內部的 IPv6 封包處理。