TCP101
用圖解與練習理解 TCP
「看得到逾時的記錄,卻查不出下一步」「打開封包擷取,也不知道 seq 或 ack 的數字在說什麼」— TCP 明明天天在用,內部卻出乎意料地難以說清楚。本課程不要求把 TCP 死背下來,而是以能夠自己用序號與視窗的視角,追蹤封包擷取與故障記錄為目標。先用圖掌握整體樣貌,再透過各章途中的小題與手算一路確認前進。
圖解 → 手算 → 模擬器 → 案例演習
共 43 題
瀏覽器內評分
localStorage 儲存
所需時間
3〜4 小時
題目數
共 43 題
形式
7 章 + 小題 + 模擬器
費用
免費
IP 只承諾到「大概會送到」。疊在其上的 TCP 代替應用程式守住 3 項承諾。先把這個分工放在腦中,之後的每一章都會更容易閱讀。
本課程的特色
本文正下方就有小題
讀完馬上解 2〜3 題的構成,讓你不容易在「自以為懂了」的狀態下繼續前進。
親手計算 seq / ack
用小的數字實際計算序號與 ACK 號碼、視窗的剩餘量、cwnd 的成長,培養讀得懂封包擷取數字的感覺。
滑動視窗的模擬器
在第 4 章的模擬器中調整 RTT、視窗、頻寬,就能親眼確認「1 個 RTT 能送多少」與吞吐量上限如何變化。
瀏覽器內評分、無需註冊
全部 43 題都在瀏覽器內評分,結果只儲存在你瀏覽器的 localStorage。不會向伺服器傳送任何資料。
貫穿本課程的 3 項承諾
TCP 的機制看起來很多,但全部都是為了守住 3 項承諾之一的工具。隨著章節推進,支撐各項承諾的零件也會逐漸增加。
1. 一定送達 — 沒送到就會發現
送出的位元組都有編號,對方會回報「收到了哪裡」。沒有回報就重傳。(第 2〜3 章)
2. 按照順序
即使途中發生超車或重複,接收端也會依靠編號把原本的位元組序列排好再交給應用程式。(第 3 章、第 6 章)
3. 配合對方與網路的步調
不會比對方緩衝區的狀況(流量控制)與路徑壅塞的狀況(壅塞控制)兩者所允許的速度更快。(第 4〜5 章)
本課程的口訣:看到封包擷取或故障記錄時,別停下思考,先問自己 — 現在快被打破的,是送達的承諾?順序?還是步調的配合?
章節構成
1 導入 — TCP 承諾了什麼
5 題。從「只有 IP 會不送達、亂序、重複」出發,整理 TCP/UDP 的分工、連接埠號與 socket。
2 連線 — TCP 的三向交握與斷線
6 題。追蹤 SYN → SYN/ACK → ACK 這 3 個封包的意義、「為什麼不是 2 次也不是 4 次而是 3 次」,以及 FIN 斷線與 TIME_WAIT。
3 序號與重傳 — TCP 如何確認資料已送達
6 題。用手算把「ack 號碼 = 下一個想要的位元組」內化,並區分重傳計時器與重複 ACK、快速重傳。
4 流量控制 — TCP 的滑動視窗
6 題。手算視窗通告與 in-flight,再透過模擬器體感「吞吐量上限 = 視窗 ÷ RTT」。
5 壅塞控制 — TCP 向網路的壅塞退讓
6 題。區分對方的狀況(流量控制)與網路的狀況(壅塞控制),並手算慢啟動的倍增成長。
6 串流與 framing — TCP 的 send 與 recv 會錯開
6 題。學習「1 次 send 不等於 1 次 recv」的位元組串流性質,以及自己建立訊息邊界的 framing。
7 綜合演習 — 以封包的視角解讀 TCP 的行為
8 題。以連線遭拒、重傳頻發、零視窗、TIME_WAIT 大量出現等模擬故障調查的案例題,橫跨全部章節。
學習訣竅
- 請按照本文 → 正下方的小題的順序進行。讀完立刻解題,比累積起來之後再解更容易記住。
- 第 3〜5 章的計算題不要靠心算,把位元組的編號與視窗的兩端寫在紙上。「讀得懂」封包擷取數字的感覺是從手上來的。
- 第 4 章的模擬器,請在解小題的前後都操作一次。「視窗 ÷ RTT」這條式子會變成身體記憶。
- 在第 7 章的案例題卡住時,回到對應章節複習 1〜2 輪就好,不需要整個重來。
開始前的前提
- 只要有一點用任何語言寫過程式的經驗就足夠。不以網路的專業知識為前提。
- 會乘法、除法與「位元組數的加法」,就能完成所有手算。
- 知道 IP 位址是「指向目的地的住址」就沒問題。不會深入路由的細節。