1.2 IP 位址與路由:封包的旅程#
尋址問題:如何在千萬網路中找到一台機器?#
郵寄需要地址,網路通訊需要 IP 位址。IP 的設計目標:全球唯一的邏輯地址 + 分層選路。
IPv4:32 位元的地址危機#
IPv4 地址是 32 位元,理論上限 \(2^{32} \approx 43\) 億個:
192.168.1.10 = 11000000.10101000.00000001.00001010
網路部分(子網遮罩決定) 主機部分
1980 年代就有人算出:43 億不夠(世界人口就超過了)。演化出的三個補丁,恰好是理解今天網路架構的鑰匙:
補丁一:子網與 CIDR(1993)#
早期的 A/B/C 分類浪費嚴重,CIDR(Classless Inter-Domain Routing)改為彈性字首:
\[ \text{網路大小} = 2^{(32 - \text{前綴長度})} \quad \text{如 } 192.168.1.0/24 \text{ 有 } 256 \text{ 個地址} \]
字首分層讓路由表可聚合:骨幹路由器不必記 43 億條,只記幾十萬條聚合前綴 —— 這是「層次化降低複雜度」的又一例證。
補丁二:NAT(網路地址轉換)#
你家只有一個公網 IP,但十幾台裝置都能上網,靠的是 NAT:路由器把內網地址(192.168.x.x)+ 埠號映射成公網地址 + 埠號。
NAT 的副作用:外網無法主動連進你的裝置 —— 這直接造成 3.4 節 WebRTC 需要 STUN/TURN 打洞的複雜性。技術的補丁常常埋下下一代的問題。
補丁三:私有地址段#
| 段 | 範圍 |
|---|---|
| 10.0.0.0/8 | 10.x.x.x |
| 172.16.0.0/12 | 172.16–31.x.x |
| 192.168.0.0/16 | 192.168.x.x |
IPv6:128 位元的最終解答#
1998 年定案的 IPv6 用 128 位元: \(2^{128} \approx 3.4 \times 10^{38}\) ,地球上每平方米可分 \(10^{23}\) 個地址。
2001:0db8:85a3:0000:0000:8a2e:0370:7334
遷移缓慢的原因:NAT 已經夠用 + 新舊不相容 —— 技術再好,轉換成本決定採用速度(對照 2.1 節 HTTP/3 的推行困境)。
路由:封包如何跨洋#
flowchart TB
A[你的筆電<br/>192.168.1.10] --> B[家用路由器 NAT<br/>→ 61.220.x.x]
B --> C[ISP 骨幹路由器<br/>查路由表選下一跳]
C --> D[海底光纜]
D --> E[目的地 ISP]
E --> F[伺服器<br/>142.250.x.x]每一跳路由器做的事:查路由表(最長字首匹配)→ TTL 減 1 → 轉發。tracert 指令顯示的正是這條路徑:
traceroute google.com
# 1 192.168.1.1 家用路由器
# 2 10.0.0.1 ISP 閘道
# 3 ... 骨幹節點
TTL(Time To Live)的存在是為了防止路由迴圈讓封包永生不死 —— 分散式系統的每個協定都要回答「資料丟了怎麼辦」與「資料繞圈了怎麼辦」。
埠號:一台機器上的多個服務#
IP 找到機器,埠號找到機器上的程序:
| 埠 | 服務 |
|---|---|
| 80 | HTTP |
| 443 | HTTPS |
| 22 | SSH |
| 3000 | 開發用(Node 常用) |
\[ \text{完整的通訊端點} = \text{IP 位址} : \text{埠號} \quad \text{(即 Socket,見第 3 章)} \]
習題#
- 為什麼 NAT 會阻礙 P2P 連線?這與 WebRTC 的設計有何關聯?
- 說明 CIDR 如何讓骨幹路由表維持在可管理的規模。
- 用 traceroute 追蹤一個國外網站,解釋每一跳的 IP 屬於誰。