IP 定址、路由與傳輸:封包如何找到路,資料如何抵達應用程式
本頁為依教材與考古題整理的原創摘要;考古題答案經技術覆核,但不是官方答案。
第一次接觸也沒關係
這堂先懂這些詞
先記住白話意思,不必急著背英文。看到正文時,再把正式名稱接回來。
流量控制與壅塞控制
也會看到:receive window、flow control、congestion window、congestion control流量控制避免送太快淹沒接收端;壅塞控制避免送太多造成網路塞車。
- 生活例子:
- 前者像顧客桌面放不下更多菜,後者像整條送餐通道已擁擠。
- 別搞混:
- Receive window 看接收端能力,congestion window 看網路狀況,不能混為同一個視窗。
IP 定址與路由
也會看到:IP address、subnet mask、CIDR、router、default gateway、子網路、路由定址判斷裝置與網段,路由則選擇封包跨網路前往目的地的下一步。
- 生活例子:
- 地址告訴包裹要去哪,轉運站規則決定下一車送往哪裡。
- 別搞混:
- subnet mask 不是另一個主機地址;default gateway 也不是所有封包的最終目的地。
網路封裝
也會看到:encapsulation、header、payload、封包封裝資料往下經過網路各層時,每層加上自己需要的控制資訊。
- 生活例子:
- 像商品先裝盒、貼地址,再裝進物流袋,每層有自己的標籤。
- 別搞混:
- 這個 encapsulation 是網路分層,不是物件導向的資料隱藏。
路由表與最長前綴
也會看到:routing table、longest-prefix match、next hop、TTL路由器依目的位址選最具體的匹配規則與下一站;TTL 限制封包可經過的轉送次數。
- 生活例子:
- 像郵務分流優先採用最精確的區域規則,且包裹附有限次轉寄標記。
- 別搞混:
- TTL 不是傳輸時間計時器;longest prefix 指最具體的網路範圍。
TCP、UDP 與連接埠
也會看到:TCP、UDP、port、transport protocol、連接埠TCP 提供可靠有序的資料流,UDP 提供較精簡的資料報;port 用來找到主機上的應用程式。
- 生活例子:
- IP 像大樓地址,port 像房號;TCP 像掛號信,UDP 像快速投遞。
- 別搞混:
- port 不是實體插孔;UDP 也不是必然比 TCP 好或永遠不可靠。
從 CIDR 與 subnet mask 判斷目的地主機是否在同一子網路,接著比較 distance-vector 與 link-state routing,理解 IPv4 TTL 如何限制封包壽命;最後以 TCP、UDP、receive window 與 congestion window 串起端到端傳輸。所引用考古題答案皆為技術推導與人工覆核結果,並非官方答案。
先抓住這幾件事
- 用 prefix length 或 subnet mask 分出 IPv4 位址的 network 與 host portions,並以 AND 運算求 network address
- 依 routing table 的 longest-prefix match 選擇 next hop,並說明 TTL 防止封包在 routing loop 中無限循環
- 比較 distance-vector 與 link-state routing 的資訊交換範圍、路由器已知狀態與代表協定
- 比較 TCP 與 UDP 的連線、資料邊界、可靠性、排序與 header overhead
- 區分 receiver window 的 flow control 與 congestion window 的 congestion control,判斷可送出的 outstanding data 上限
先想像這個場景
一份文件如何穿過郵政轉運站
你把一份文件寄往外地:信封寫著最終地址,各轉運站依地址選下一站,並在『最多還能轉幾站』的計數上減 1。若文件必須完整且照順序抵達,你會選可編號、確認與補寄的服務;若是可容忍少量遺失、重視即時性的短訊息,則可能選不等待逐件確認的投遞方式。
先別急著往下看,花十秒想一想:
兩條路線都能涵蓋目的地址時,轉運站應選範圍較廣還是地址前綴較具體的路線?若剩餘轉送計數為 1,下一站還能再把文件轉送一次嗎?即時語音又為何可能不想等待遺失資料補齊?
把故事換成電腦語言
| 生活中的角色 | 對應到 | 技術概念 |
|---|---|---|
| 信封上的最終收件地址 | IP destination address,用於跨網路 forwarding | |
| 轉運站從所有涵蓋地址的路線中選最具體的區域路線 | Router 對 forwarding table 執行 longest-prefix match | |
| 每經一個轉運站就減 1 的剩餘轉送計數,歸零即停止轉送 | IPv4 TTL 每次處理至少減 1,歸零丟棄以限制 routing loop | |
| 把連續文件編序、取得確認,缺頁時補寄並按順序交付 | TCP connection 提供 reliable、in-order byte stream,使用 sequence、ACK 與 retransmission | |
| 每張短訊各自投遞,不承諾送達、去重或依寄出順序交付 | UDP connectionless datagram service,不保證 delivery、duplicate protection 或 ordering |
題目出現這些字,先想到
- 多條 route 同時匹配 destination:選最長、最具體的 prefix;/0 是最不具體的 default route。
- 防止 packet 在 routing loop 無限循環:想到 IPv4 TTL;逐次處理至少減 1,歸零丟棄。
- Reliable、in-order、connection-oriented byte stream:TCP;不要誤稱它保留 application message boundaries。
- Connectionless、8-byte header、datagram boundaries、無 delivery/order 保證:UDP;即時應用仍須自行處理 timing 與 loss。
1.CIDR 與 subnet mask:先判斷目的地在不在同一網路
IPv4 位址是 32-bit 的數字,通常用點分十進位表示(如 192.168.1.100)。每個位址分為兩部分:network prefix(網路部分,識別所屬子網路)和 host part(主機部分,識別子網路內的特定主機)。 【Subnet Mask】Subnet mask 用來界定哪些 bits 屬於 network prefix。例如 255.255.255.0(二進位 11111111.11111111.11111111.00000000)表示前 24 bits 是 network prefix,後 8 bits 是 host part。將 IP 位址和 subnet mask 做 bitwise AND 運算,得到 network address。 例如:IP = 192.168.1.100,mask = 255.255.255.0 Network address = 192.168.1.0(前 24 bits 保留,後 8 bits 歸零) 【CIDR 表示法】CIDR(Classless Inter-Domain Routing)用斜線後接 prefix 長度表示:192.168.1.0/24 等同 network = 192.168.1.0、mask = 255.255.255.0。/24 表示前 24 bits 是 network prefix。 【同一子網路判斷】當主機 A 要發送封包給主機 B 時,A 用自己的 subnet mask 對 B 的 IP 做 AND 運算,比較結果是否和自己的 network address 相同。相同 → B 在同一子網路,直接透過 L2(ARP 找 MAC)傳送。不同 → B 在不同子網路,把封包送到 default gateway(路由器)。 【可用主機數計算】/24 網路有 2⁸ = 256 個地址,減去 network address(全 0,如 192.168.1.0)和 broadcast address(全 1,如 192.168.1.255),可用主機數 = 254。一般公式:可用主機 = 2^(32 - prefix length) - 2。 【考試連結】(1) 給定 IP 和 mask,計算 network address。(2) 給定 CIDR,計算可用主機數。(3) 判斷兩個 IP 是否在同一子網路。最常見的計算錯誤是忘記減 2(network 和 broadcast address)。
- /24 對應 255.255.255.0;/26 對應 255.255.255.192
- Network address = IP address AND subnet mask
- 同一 prefix 不代表應用程式一定可連線;防火牆、VLAN 與主機狀態仍可能阻擋通訊
- 在一般 IPv4 subnet 中,host bits 全 0 是 network address、全 1 是 directed broadcast address;特殊 prefix 另有規則
192.168.10.77/26 的 subnet mask 是?
2.Forwarding、longest-prefix match 與 IPv4 TTL
路由器收到封包後,需要決定從哪個 interface(介面)轉發出去。這個決定依據 forwarding table(轉發表),其中每個 entry 包含 network prefix 和對應的 next-hop 或 output interface。 【Longest-Prefix Match】如果封包的目的 IP 同時匹配多個 entry,路由器選擇 prefix 最長的(最具體的)entry。例如 forwarding table 有 10.0.0.0/8 和 10.1.0.0/16,目的 IP 為 10.1.2.3 同時匹配兩者,但 /16 更具體 → 選 /16 的 entry。如果都不匹配,使用 default route(0.0.0.0/0)。 【TTL(Time to Live)】IPv4 header 中的 TTL 欄位是一個計數器(通常初始值 64 或 128),每經過一個路由器減 1。當 TTL 降為 0 時,路由器丟棄封包並向來源發送 ICMP Time Exceeded 訊息。目的是防止封包在路由迴圈中無限循環。traceroute 工具利用 TTL 的特性:依序發送 TTL=1, 2, 3... 的封包,根據每個路由器回傳的 ICMP 訊息追蹤封包經過的路徑。 【IPv4 vs IPv6】IPv4 位址 32 bits(約 43 億個),已經耗盡。IPv6 位址 128 bits(3.4×10³⁸ 個),足夠為地球上每粒沙子分配多個地址。IPv6 簡化了 header 結構(沒有 checksum 和 fragmentation 在 header 中),支援更高效的路由。過渡技術包括 dual stack(同時支援 v4/v6)、tunneling(v6 封包包在 v4 中傳送)、NAT64。 【考試連結】(1) Longest-prefix match 的比較過程。(2) TTL 的作用和機制。(3) IPv4 和 IPv6 的位址長度差異(32 vs 128 bits)。
- Route entry 通常包含 destination prefix、next hop/outgoing interface 與 metric
- Longest-prefix match 看 prefix 長度,不是看 route 寫在表格的先後順序
- 0.0.0.0/0 可作 IPv4 default route,任何目的位址都能匹配,但最不具體
- TTL 是 hop limit,不是封包建立時間戳記,也不負責 fragmentation reassembly ordering
3.Distance-vector 與 link-state:路由器如何學會路徑
路由協定(routing protocol)讓路由器自動學習和交換路由資訊,建立 forwarding table。兩大類路由演算法: 【Distance-Vector(距離向量)】每個路由器維護一個表,記錄到每個目的網路的「距離」(通常是 hop count)和「方向」(經由哪個 neighbor)。定期和相鄰路由器交換整個路由表。收到 neighbor 的資訊後,用 Bellman-Ford 演算法更新自己的表:如果經由某個 neighbor 的路徑比目前已知的更短,就更新。 代表協定:RIP(Routing Information Protocol),以 hop count 為 metric,最大 15 hops。 問題:Count to infinity — 當一條路徑失效時,路由器之間可能反覆遞增距離值,收斂很慢。解法:Split horizon(不把路由資訊送回學到的方向)、Poison reverse(告訴來源該路徑已失效)、設定最大 hop count。 【Link-State(連結狀態)】每個路由器探測自己直接相連的 link 狀態(延遲、頻寬、是否可用),然後用 flooding 把這個資訊廣播給所有路由器。每個路由器都獲得完整的網路拓撲圖,然後用 Dijkstra's shortest path algorithm 獨立計算到每個目的地的最短路徑。 代表協定:OSPF(Open Shortest Path First)。 【比較】 | | Distance-Vector | Link-State | | 交換資訊 | 整個路由表 | 只有自己的 link 狀態 | | 交換對象 | 只和 neighbors | 全網路 flooding | | 演算法 | Bellman-Ford | Dijkstra | | 收斂速度 | 慢 | 快 | | 代表 | RIP | OSPF | 【考試連結】(1) 分辨 RIP 和 OSPF 分別使用哪種演算法。(2) Distance-vector 的 count-to-infinity 問題。(3) Link-state 為什麼收斂更快(每個路由器有完整拓撲,不需要等鄰居傳播)。
- Distance-vector:和鄰居交換距離資訊,不要求每台 router 先取得完整拓撲
- Link-state:flood link-state advertisements,建立 topology database 後算 shortest paths
- OSPF Version 2 是單一 autonomous system 內使用的 link-state routing protocol
- Flooding 是 OSPF 散布 link-state information 的機制,不等於把 OSPF 分類成單純 flooding routing
4.Transport layer:TCP 與 UDP 把資料交給正確應用程式
Transport layer(傳輸層)的核心任務是把資料從一個主機的應用程式送到另一個主機的正確應用程式。它透過 port number 來區分同一台主機上的不同應用程式(例如 HTTP 用 port 80,SSH 用 port 22)。 【TCP(Transmission Control Protocol)】 提供 reliable(可靠)、ordered(有序)、connection-oriented(連接導向)的傳輸。 核心機制: (1) Three-way handshake 建立連線:Client → SYN → Server;Server → SYN-ACK → Client;Client → ACK → Server。 (2) Sequence number 和 acknowledgment 確保封包按序到達,遺失的封包會重傳。 (3) Checksum 檢測資料完整性。 (4) Four-way handshake 關閉連線:FIN → ACK → FIN → ACK。 適用場景:需要可靠傳輸的應用,如 HTTP、FTP、SMTP、SSH。 【UDP(User Datagram Protocol)】 提供 unreliable(不保證到達)、unordered(不保證順序)、connectionless(無連接)的傳輸。 特點:沒有 handshake、沒有重傳、沒有 flow control。Header 很小(8 bytes vs TCP 的 20+ bytes),overhead 低。 適用場景:對速度要求高、能容忍少量遺失的應用,如 DNS 查詢、影音串流、線上遊戲、VoIP。 【Port number 範圍】 • Well-known ports:0-1023,保留給常見服務。 • Registered ports:1024-49151,應用程式註冊使用。 • Dynamic/Ephemeral ports:49152-65535,client 端暫時使用。 【考試連結】(1) TCP 和 UDP 的差異表。(2) Three-way handshake 的流程。(3) 給定應用場景判斷用 TCP 或 UDP — 需要可靠性 → TCP,需要速度/低延遲 → UDP。(4) Port number 的總範圍是 0-65535(16 bits),不是 0-2048。
- TCP connection 以 endpoints 識別,建立連線時使用 three-way handshake
- TCP 的 reliable byte stream 不代表每個應用訊息只會對應一個 TCP segment
- UDP connectionless 且保留 datagram boundaries,但低 overhead 不等於永遠低 latency
- 選 TCP 或 UDP 要依可靠性、延遲、訊息模型及應用程式能否自行處理遺失來決定
DNS 查詢通常用 UDP,但 zone transfer 用 TCP。為什麼?
5.TCP 的兩種窗口:flow control 不等於 congestion control
TCP 同時使用兩種不同的窗口機制來控制傳輸速率,它們解決不同的問題: 【Flow Control(流量控制)】 目的:防止發送端傳太快,淹沒接收端的 buffer。 機制:接收端在每個 ACK 中附帶 receive window(rwnd)大小,告訴發送端「我的 buffer 還能接收多少資料」。發送端不會送出超過 rwnd 的未確認資料。 問題本質:sender 速度 > receiver 處理速度。 具體運作:接收端有一個 receive buffer(例如 64 KB)。當應用程式消耗 buffer 中的資料較慢時,buffer 逐漸填滿,rwnd 縮小。如果 rwnd = 0,發送端暫停發送,定期發送 probe 封包確認 rwnd 是否恢復。 【Congestion Control(壅塞控制)】 目的:防止發送端傳太快,導致網路中間的路由器 buffer 溢出(壅塞)。 機制:發送端維護一個 congestion window(cwnd),根據網路回饋(packet loss、delay)動態調整。實際傳送窗口 = min(rwnd, cwnd)。 四個階段: (1) Slow Start:cwnd 從 1 MSS 開始,每收到一個 ACK 就加倍。指數增長直到達到 ssthresh(slow start threshold)。 (2) Congestion Avoidance:cwnd 超過 ssthresh 後,改為每個 RTT 增加 1 MSS。線性增長。 (3) Fast Retransmit:收到 3 個 duplicate ACK 時,不等 timeout 就立即重傳。 (4) Fast Recovery:3 個 dup ACK 後,ssthresh 和 cwnd 減半,直接進入 congestion avoidance(不回到 slow start)。 【關鍵區分】Flow control 看的是 receiver 的處理能力(端到端),congestion control 看的是網路的承載能力(中間路徑)。兩者獨立運作,實際傳送量受兩者中較小的限制。 【考試連結】(1) 分辨 flow control 和 congestion control 的目的。(2) Slow start 的名稱具有誤導性 — 它的增長速度是指數的(1→2→4→8),一點都不 slow。(3) cwnd 和 rwnd 的關係:effective window = min(cwnd, rwnd)。
- rwnd 保護 receiver;cwnd 保護 network,兩者控制的瓶頸不同
- TCP header 的 Window field 通告接收端目前願意接受的資料範圍
- 窗口固定的簡化題型以 min(rwnd, cwnd) 限制可新增或維持的 outstanding data;cwnd 驟降後既有 flight 可暫時超過新 cwnd
- Slow start 的 exponential growth 是常用近似;它不能保證完全避免 loss 或 retransmission
一起拆題目
範例 1:主機位址是 192.168.10.77/26。求 subnet mask、network address、broadcast address 與一般可用 host range,並判斷 192.168.10.120 與 192.168.10.130 是否在同一 subnet。
- /26 的 mask 前 26 bits 為 1,因此是 255.255.255.192;最後一個 octet 的 block size 是 256-192=64。
- 最後一個 octet 的區段為 0–63、64–127、128–191、192–255;77 落在 64–127。
- Network address 是 192.168.10.64,broadcast address 是 192.168.10.127。
- 一般可用 host range 排除 network 與 broadcast,為 192.168.10.65–192.168.10.126。
- 120 落在 64–127,因此同 subnet;130 落在 128–191,因此不同 subnet,通常交給 default gateway。
所以答案是:Mask=255.255.255.192;network=192.168.10.64;broadcast=192.168.10.127;一般 hosts=.65–.126。位址 .120 同 subnet,.130 不同 subnet。
範例 2:Router 有四條 route:10.0.0.0/8→R1、10.20.0.0/16→R2、10.20.30.0/24→R3、0.0.0.0/0→R4。目的位址為 10.20.30.77,且抵達本 router 時 TTL=2。應選哪個 next hop?若之後還必須經過兩台 routers 才到目的端,封包會如何?
- 10.20.30.77 同時匹配 /8、/16、/24 與 /0。
- 最長匹配是 10.20.30.0/24,所以目前 router 選 R3,而不是第一條匹配 route。
- 目前 router 轉送前把 TTL 由 2 減為 1。
- 下一台 router 再轉送時 TTL 由 1 減為 0,必須丟棄封包;它通常送回 ICMP Time Exceeded,因此封包無法再經第三次 router forwarding 抵達目的端。
所以答案是:使用 /24 的 R3。TTL 只能再支撐一次後續 router forwarding;下一台 router 將 TTL 減至 0 並丟棄,所以不能穿過所需的兩台後續 routers。
範例 3:協定甲只把目前的 destination-distance 資訊傳給直接鄰居;協定乙讓 routers 取得區域拓撲資料庫,再各自建立 shortest-path tree。判斷兩者類型,並指出 OSPF 屬於哪一種。
- 甲的交換對象是直接鄰居,內容是到各目的地的 distance estimate,符合 distance-vector。
- 乙先散布 link states 並建立拓撲圖,再計算 shortest-path tree,符合 link-state。
- OSPF Version 2 規格明定它是 link-state protocol,因此屬於乙。
- 不要因 OSPF 使用 flooding 傳遞 advertisements,就把它誤判為 distance-vector 或單純 flooding routing。
所以答案是:甲是 distance-vector;乙是 link-state;OSPF 屬於 link-state。
範例 4:某 TCP sender 目前 rwnd=12 MSS、cwnd=4 MSS,且沒有其他限制。最多可有多少尚未確認資料?若用簡化 slow-start 模型,起始 cwnd=1 MSS、每個 segment 都及時 ACK 且無 loss,三個 RTT 後 cwnd 約為多少?另說明即時語音若可容忍少量遺失,為何常考慮 UDP。
- Outstanding data 上限是 min(rwnd,cwnd)=min(12,4)=4 MSS。
- 簡化 slow start 每 RTT 約加倍:起始 1 MSS,第一個 RTT 後 2 MSS。
- 第二個 RTT 後 4 MSS,第三個 RTT 後 8 MSS;這是題目明定 ACK 與無損失條件下的近似模型。
- 即時語音常重視延遲,且能容忍少量遺失;UDP 不需 TCP connection establishment、header 較小,也不強制 in-order retransmission。
- UDP 本身不保證較快或可靠;應用程式仍需自行處理 timing、loss concealment 或安全。
所以答案是:最多 4 MSS outstanding;簡化模型三個 RTT 後 cwnd≈8 MSS。可容忍少量遺失且重視延遲的即時語音常考慮 UDP,但必要的可靠性與時序機制須由應用層補足。
這裡最容易選錯
- 把 subnet mask 當成 default gateway;mask 只界定 network 與 host portions
- 看到多條 route 都匹配時選第一條,而不是 longest-prefix match
- 把 TTL 當 timestamp,或以為它負責 TCP segment ordering
- 把 OSPF 使用 flooding 的步驟誤解成 OSPF 不是 link-state protocol
- 以為 TCP 是 message-oriented;TCP 提供的是 byte stream,不保留 write boundaries
- 以為 UDP 完全沒有 checksum,或宣稱 UDP 必然比 TCP 快
- 混淆 rwnd 與 cwnd:前者是 receiver flow control,後者是 sender congestion control
- 把 slow start 的簡化倍增序列當成所有現代 TCP 實作在任何 ACK/loss 條件下的固定行為
換你快速判斷
先在心中作答,再展開答案。答不出來時,回頭找本課的對照關係。
1CIDR 的 /n 與 subnet mask 如何界定 IPv4 network address?
/n 表示前 n bits 是 network prefix;mask 的前 n bits 為 1。將 IP address 與 mask 做 bitwise AND,即得 network address。
例如 /24 是 255.255.255.0。Mask 不負責指出 default gateway、加密或 MTU;它的核心用途是區分 network 與 host portions。
2Router 面對多條匹配 route 時如何選擇?IPv4 TTL 的主要目的又是什麼?
選 longest-prefix match;每次 router forwarding 都將 TTL 至少減 1,TTL 歸零就丟棄,防止封包在 routing loop 中無限循環。
Default route /0 最不具體,只在沒有更長匹配時使用。TTL 是 hop limit,不是建立時間或封包排序欄位。
3Distance-vector 與 link-state routing 的核心差異是什麼?OSPF 屬於哪一類?
Distance-vector 與直接鄰居交換到目的地的距離資訊;link-state 散布鏈路狀態、建立拓撲資料庫後計算 shortest paths。OSPF 是 link-state。
OSPF 會用 flooding 散布 link-state advertisements,這是傳遞狀態的機制;RFC 2328 明確把 OSPF 定義為 link-state routing protocol。
4TCP 與 UDP 在服務模型與 overhead 上有何差異?
TCP 是 connection-oriented 的 reliable、in-order byte stream;UDP 是 connectionless datagram service,header 為 8 bytes,不保證 delivery、duplicate protection 或 ordering。
UDP 機制較少,但不代表任何應用都一定更快;應依可靠性、延遲與訊息邊界需求選擇。TCP 也不保留應用程式 write boundaries。
5TCP header 的 Window field 主要支援哪一種控制?
它通告 receiver window(rwnd),限制 sender 未經進一步 ACK 可送出的資料範圍,避免接收端 buffer 被壓垮,屬於 flow control。
真正可送的 outstanding data 還會受 sender 的 congestion window(cwnd)限制;簡化表示為不超過 min(rwnd,cwnd)。
6TCP slow start 的主要目的與常見簡化成長規則是什麼?
目的在逐步探測未知的 network capacity;在每個 segment 都獲 ACK 且無損失的簡化模型下,cwnd 約每 RTT 加倍。
cwnd 是 sender-side congestion-control limit。實際 initial window 與成長受標準、ACK 行為、loss 與實作影響,不能把 1、2、4、8 當成所有連線的固定序列。
最後用考古題驗證
本課連結的題目都已通過可重現的技術覆核,可逐題練習與判分。
開始本課考古題練習參考來源
- RFC 4632: Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan — V. Fuller and T. Li
- RFC 791: Internet Protocol — J. Postel
- RFC 2328: OSPF Version 2 — J. Moy
- RFC 9293: Transmission Control Protocol (TCP) — W. Eddy (Ed.)
- RFC 768: User Datagram Protocol — J. Postel
- RFC 5681: TCP Congestion Control — M. Allman, V. Paxson, and E. Blanton