一、TCP流量控制(Flow Control)
定義:通過調節發送方的發送速率,確保接收方能夠及時處理數據,避免緩沖區溢出。
本質:解決發送方與接收方之間的"端到端"速率匹配問題。
1. 實現機制:滑動窗口協議
- 窗口大小(Window Size):接收方通過TCP報文段中的窗口字段告知發送方自己當前的接收緩沖區可用空間。
- 動態調整過程:
- 接收方收到數據后,在ACK中反饋剩余緩沖區大小(即窗口大小)。
- 發送方根據窗口大小限制發送數據量,窗口為0時暫停發送。
- 示例:若接收方緩沖區大小為1000字節,已占用400字節,則窗口大小為600字節,發送方最多發送600字節數據。
2. 關鍵問題與解決方案
- 窗口關閉(Zero Window):當接收方緩沖區滿時,發送窗口為0的ACK,發送方進入等待狀態。
- 解決:接收方定期發送"窗口探測報文"(Window Probe),通知發送方窗口更新。
- 糊涂窗口綜合征(Silly Window Syndrome):接收方頻繁發送小窗口通知,導致發送方發送大量小包,浪費網絡資源。
- 解決:
- 接收方策略:緩沖區達到一半或最大段大小(MSS)時再通知窗口更新。
- 發送方策略:使用Nagle算法,將小包合并為大包發送。
- 解決:
二、TCP擁塞控制(Congestion Control)
定義:通過監控網絡負載情況,動態調整發送方的發送速率,避免網絡擁塞(如分組丟失、延遲激增)。
本質:解決網絡中多發送方與路由器之間的"全局"流量管理問題。
1. 核心算法:四階段控制模型
-
1. 慢開始(Slow Start)
- 初始擁塞窗口(cwnd)設為1個MSS,每次收到ACK后cwnd按指數增長(×2)。
- 觸發條件:連接建立或超時重傳后。
- 閾值(ssthresh):當cwnd超過ssthresh時,切換到擁塞避免階段。
-
2. 擁塞避免(Congestion Avoidance)
- cwnd按線性增長(每輪RTT增加1個MSS),避免網絡負載激增。
- 當檢測到丟包時,進入快重傳或慢開始。
-
3. 快重傳(Fast Retransmit)
- 若收到3個重復ACK,認為分組丟失,立即重傳而不等待超時。
- 重傳后將ssthresh設為當前cwnd的一半,cwnd設為ssthresh,進入快恢復。
-
4. 快恢復(Fast Recovery)
- 不執行慢開始,直接從擁塞避免階段繼續,cwnd線性增長。
2. 擁塞檢測機制
- 丟包檢測:
- 超時(Timeout):未收到ACK且等待時間超過閾值,認為嚴重擁塞,觸發慢開始。
- 重復ACK:收到3次相同ACK,認為分組丟失,觸發快重傳。
三、流量控制與擁塞控制的對比
維度 | 流量控制 | 擁塞控制 |
---|---|---|
目標 | 防止接收方緩沖區溢出 | 防止網絡整體擁塞 |
控制范圍 | 端到端(發送方與接收方之間) | 全局(整個網絡路徑) |
觸發因素 | 接收方緩沖區容量 | 網絡中路由器隊列溢出、分組丟失 |
關鍵參數 | 接收窗口(rwnd) | 擁塞窗口(cwnd)、閾值(ssthresh) |
實現方式 | 接收方反饋窗口大小 | 發送方主動調整發送速率 |
典型算法 | 滑動窗口協議 | 慢開始、擁塞避免、快重傳、快恢復 |
四、實際應用與案例
- 流量控制場景:手機APP與服務器通信時,若手機內存有限,服務器需根據手機反饋的窗口大小調整發送速率,避免APP崩潰。
- 擁塞控制場景:當網絡中多個用戶同時下載大文件時,TCP通過擁塞控制算法自動降低每個連接的發送速率,避免路由器擁塞導致全網癱瘓。
五、總結
TCP通過流量控制和擁塞控制的協同工作,在復雜網絡環境中實現了可靠性與效率的平衡:
- 流量控制確保數據"送得進去"(接收方處理能力);
- 擁塞控制確保數據"送得出去"(網絡路徑通暢)。
兩者缺一不可,共同構成了TCP協議在互聯網中穩定運行的核心基礎。
六、整體流程
最開傳送數據的時候,會采用慢開始算法,執行到我們的擁塞窗口的值,達到慢開始門限的值之后,就開始執行擁塞避免算法,擁塞避免執行到什么時候呢?這時候分為兩種情況:第一種是發生超時,第二種是收到3個ACK(確認)分組。發生超時的時候,它會將慢開始的門限值變為當前擁塞窗口(cwnd)的一半,同時將擁塞窗口的值變為1,重新執行慢開始算法。同樣的,達到慢開始門限值之后,執行擁塞避免算法,這是第一種情況,發生超時的情況。第二種情況就是收到3個確認的分組,這種情況的話,它會將它慢開始的門限值變為當前擁塞窗口的一半,同時也將擁塞窗口的值變為當前擁塞窗口的一半,也就是和調整后的慢開始門限值相同。這時候執行的是快恢復算法。
為什么在TCP的擁塞控制中,如果發生了丟包,接收端會向發送端發送3個ACK,而不是2個或者4個,偏偏是3個?
- 背景:TCP 的擁塞控制機制需要在快速檢測丟包和避免過度反應之間取得平衡。
- 解釋:
- 兩個重復 ACK:可能不足以表明丟包的嚴重性,容易導致誤判。
- 三個重復 ACK:是一個合理的閾值,既能有效檢測丟包,又能避免因偶然的網絡波動而觸發不必要的重傳。
- 四個或更多重復 ACK:雖然可以進一步減少誤判,但會增加檢測丟包的延遲,降低網絡效率。
七、檢測
可以自己試著做一下,下面的這道題,檢測自己是否真正掌握了擁塞控制的整體流程
答案: