單元 07 從遺失到可靠傳輸
學習目標與問題
先讀單元 02、06。你應能用狀態機解釋序號、ACK、逾時與重傳,計算 stop-and-wait 的效率,並比較 Go-Back-N 與 Selective Repeat。如何在可能遺失或重複的通道交付一次正確訊息?
7.1 偵測與恢復是不同責任
校驗可偵測部分資料損壞,卻不能恢復遺失內容;普通 checksum 也不抵抗惡意修改。ACK 回報接收狀態,序號讓接收端辨認重複與順序,計時器讓傳送端在沒有進展時再傳。可靠性需求必須說明「對傳輸接收端交付」還是「對業務執行一次」。後者往往還要交易 ID、持久化與去重。
7.2 Stop-and-wait 狀態機
傳送端先傳一個資料單位,再等待對應 ACK。接收端收到新序號就交付並 ACK;重複序號只重 ACK,不再次交付。資料遺失會使傳送端逾時;ACK 遺失也會逾時,重複資料由接收端去除。收到任何 ACK 就前進是不正確的:舊 ACK 可能延遲到達。
| 事件 | 傳送端 | 接收端 |
|---|---|---|
| 資料 0 到達 | 等 ACK 0 | 交付 0,回 ACK 0 |
| ACK 0 遺失 | 逾時重傳 0 | 收到重複 0,不重複交付,重 ACK |
| 有效 ACK 0 到達 | 前進到資料 1 | 準備接收下一序號 |
交替 bit 只用 0、1,需假設通道 FIFO、不重排,且舊資料不會存留任意久,否則重用序號會產生歧義。實際協定使用更大序號空間與生命週期規則。
7.3 完整效率例題
無遺失,資料長 1000 bytes、速率 10 Mb/s,資料傳送需 0.8 ms;假設從資料最後一個 bit 送出到 ACK 收齊需 40 ms,且 ACK 傳送開銷已包含在這 40 ms。每次週期 40.8 ms,goodput=8000/0.0408=約 196 kb/s,鏈路利用率約 1.96%。
視窗允許多個單位在途,就能讓等待時間和後續傳送重疊。若理想視窗 W 個同長單位,粗略上界為 min(R, W*L/(RTT+L/R)),L 以 bits 計量,此處 RTT 採上述等待定義。實際 TCP 的 RTT 取樣及視窗以 bytes 計量,本例不能直接替代 TCP 模型。
7.4 滑動視窗與兩種恢復方法
Go-Back-N 教學模型以累積 ACK,接收端只按序接收;缺口後的資料可丟棄,逾時重傳缺口起仍未確認的一段。Selective Repeat 可快取失序資料,只重傳缺少的單位,代價是更多狀態與序號管理。對於環狀序號空間大小 M,典型 Selective Repeat 模型要求視窗不超過 M/2,避免新舊視窗重疊。
例:送 0、1、2、3,1 遺失。GBN 接收端先交付 0,後續 2、3 不在預期位置;SR 可留住 2、3,重傳 1 到齊後按序交付。不要把教學 GBN/SR 完全等同於現代 TCP;TCP 累積 ACK 可搭配 SACK 和不同遺失恢復機制。
7.5 逾時與證據
逾時太短產生不必要重傳,太長使遺失恢復慢。延遲變動、重新排序、ACK 延遲和真正遺失可能產生相似觀察。重傳次數不是直接的線路丟包率。L06 是確定性的離散回合模型,故障規則由我們指定,這讓因果可重現,卻不能量測真實 TCP 的 RTO 或壅塞演算法。
實驗、習題與檢核
L02 比較不同視窗的 W/RTT 近似上界;它不含本節額外 L/R 的週期模型;L06 在資料和 ACK 各遺失一次時追蹤交付與重傳。
- ACK 遺失為何可能產生重複資料?接收端如何避免重複交付?
- 將例題等待時間改為 80 ms,求理想 goodput。
- 序號空間 16,典型 SR 的最大視窗是多少?理由為何?
- 「可靠串流」與「扣款剛好一次」需要的保障有何差別?
檢核:能把 sender、receiver 的狀態分開,指出 ACK 與 timer 如何改變狀態。延伸來源:RFC 2018(TCP SACK)、RFC 6298(RTO)。本章 ARQ 例題為教學模型。