TCP流量控制與擁塞控制:核心機制與區別

一、TCP流量控制(Flow Control)

定義:通過調節發送方的發送速率,確保接收方能夠及時處理數據,避免緩沖區溢出。
本質:解決發送方與接收方之間的"端到端"速率匹配問題。

1. 實現機制:滑動窗口協議
  • 窗口大小(Window Size):接收方通過TCP報文段中的窗口字段告知發送方自己當前的接收緩沖區可用空間。
  • 動態調整過程
    1. 接收方收到數據后,在ACK中反饋剩余緩沖區大小(即窗口大小)。
    2. 發送方根據窗口大小限制發送數據量,窗口為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:雖然可以進一步減少誤判,但會增加檢測丟包的延遲,降低網絡效率。
七、檢測

可以自己試著做一下,下面的這道題,檢測自己是否真正掌握了擁塞控制的整體流程
在這里插入圖片描述
答案:
在這里插入圖片描述

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910339.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS多端兼容性調試:一次iOS性能優化分工具協作排查過程

在多技術棧混合開發日益普及的今天,iOS應用中越來越多地集成了WebView、Flutter、React Native甚至小程序模塊。而這些模塊帶來的復雜性,不僅體現在UI適配,還包括數據同步、系統權限管理、線程調度等方面的問題。 本文記錄的是我們在處理一個…

秋招Day14 - MySQL - 索引

索引為什么能夠提高MySQL的查詢效率? 索引可以理解為目錄,通過索引可以快速定位數據,避免全表掃描 一般是B樹結構,查找效率是O(log n)。 索引還能加速排序、分組、連接等操作。 create index idx_name on students(name); 能簡…

第5天:LSTM預測火災溫度

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 目標 復用LSTM模型實現火災溫度預測 具體實現 (一)環境 語言環境:Python 3.10 編 譯 器: PyCharm 框 架: Pytorch &am…

目標檢測之YOLOV11自定義數據使用OBB訓練與驗證

一、前置條件與環境準備 在開始訓練前,確保已完成以下準備《目標檢測之YOLOV11自定義數據預處理——從原始標注到YOLO-OBB格式轉換與驗證》: 數據目錄結構: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程進階一(Labview與OPC UA設備通信)

1.Labview與OPC UA設備通信 OPC UA通信協議優勢顯著,具體表現如下: 跨平臺兼容:支持多種操作系統和硬件平臺,實現無縫數據交換。高安全性:內置加密、身份驗證和授權機制,確保數據傳輸安全。高效數據交換:采用二進制編碼和優化的傳輸協議,提高通信效率。復雜數據建模:…

【Comsol教程】如何求解指定范圍的積分 或 在積分中去除奇異點/異常值

我們在Comsol中經常需要對物體的邊界求積分,比如求物體在流場中所受的總流體牽引力,又或者是物體在電場中受到的總介電泳力。當物體的材料或者邊界條件存在突變時,物體表面的粘性應力或者麥克斯韋電應力可能會存在異常值。通常解決方法有細化…

Python 多版本治理理念(Windows 平臺 · 零基礎友好)

🧠 Python 多版本治理理念(Windows 平臺 零基礎友好) 🌐 核心原則:三維治理、四級隔離、五項自治 以下是基于人工智能深度學習環境搭建實踐,總結出的"零基礎入門 Conda工具鏈 全隔離項目環境"…

Python文件管理利器之Shutil庫詳解

Shutil是一個Python內置的用來高效處理文件和目錄遷移任務的庫。Shutil不僅支持基本的文件復制、移動和刪除操作,還具備處理大文件、批量遷移目錄、以及跨平臺兼容性等特性。通過使用Shutil,我們可以更加輕松地實現文件系統的管理和維護,本文…

學習華為 ensp 的學習心得體會

引言? 在信息技術日新月異的今天,網絡技術作為連接世界的橋梁,其重要性不言而喻。作為一名對網絡技術充滿熱情的大一新生,我選擇了 eNSP(Enterprise Network Simulation Platform,企業網絡模擬平臺)作為我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一個小案例講解:控制面板(GUI)

# 好吧,每天更新實在有點艱巨,我盡量少量多次 代碼倉 所有代碼都會上傳到這里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 運行效果圖 ? 知識要點 一、安裝dat.gui npm i dat.gui 二、使用步驟&a…

飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究

以下是一篇關于飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究的論文 ,涵蓋理論分析、數學模型構建、控制策略設計及仿真驗證等內容,適用于電氣工程、新能源技術等領域的研究參考。 飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究 摘要 隨著風電在電力…

一次性理解Java垃圾回收--簡單直接方便面試時使用

Java的垃圾回收是一個面試必問題,只要按照下面的步驟回答肯定不會有大問題。 1.先告訴面試官垃圾回收分為兩大步: a.識別哪些對象是"垃圾"(不再被使用的對象) b.回收這些垃圾對象占用的內存空間 2. 接下來分別介紹標記階段和回收階段的細節…

XML映射文件-輔助配置

如果你沒有按照同包同名來,就要下面的配置,指定好路徑 1.把路徑改為類下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路徑和

題目 解答: 直接按照空間復雜度O(n)來做了。這種明顯是動態規劃,每一層用到上一層的信息。 觀察數據形狀,如下: (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 設dp[n],定義為本層第n…

仕么是Transformer以及工作原理和架構

Transformer 是一種革命性的**深度學習架構**,由 Google 團隊在 2017 年論文《Attention is All You Need》中提出。它徹底改變了自然語言處理(NLP)領域,并逐漸擴展到計算機視覺、語音識別等多模態任務。其核心創新在于**完全依賴…

opencv 鎖頁內存的使用

在OpenCV的CUDA編程中,cv::cuda::HostMem類用于管理鎖頁內存(Page-Locked Memory)?,這種內存能顯著提升主機(CPU)與設備(GPU)間的數據傳輸效率。而.createMatHeader()正是將HostMem…

亞遠景-ASPICE與ISO 26262:理解汽車軟件質量保障的雙標體系

在汽車行業向智能化、電動化轉型的背景下,ASPICE(Automotive SPICE)與ISO 26262作為汽車軟件質量保障的兩大核心標準,分別從過程能力與功能安全兩個維度構建了完整的開發管理體系。以下從標準定位、核心差異、協同實踐及行業價值四…

數組的應用

Java數組的基本概念 數組是Java中一種重要的數據結構,用于存儲固定大小的相同類型元素。數組在內存中連續分配空間,可以通過索引快速訪問元素。數組的聲明和初始化是使用數組的基礎,聲明時需要指定數據類型和數組名稱,初始化可以…

基礎RAG實現,最佳入門選擇(七)

增強型RAG系統的查詢轉換 采用三種查詢轉換技術,以提高RAG系統中的檢索性能,而無需依賴于像LangChain這樣的專門庫。通過修改用戶查詢,我們可以顯著提高檢索信息的相關性和全面性。 關鍵轉換技術 1.查詢重寫:使查詢更加具體和詳…