HarmonyOS-ArkUI Web控件基礎鋪墊6--TCP協議- 流量控制算法與擁塞控制算法

HarmonyOS-ArkUI Web控件基礎鋪墊1-HTTP協議-數據包內容-CSDN博客

HarmonyOS-ArkUI Web控件基礎鋪墊2-DNS解析-CSDN博客

HarmonyOS-ArkUI Web控件基礎鋪墊3--TCP協議- 從規則本質到三次握手-CSDN博客

HarmonyOS-ArkUI Web控件基礎鋪墊4--TCP協議- 斷聯-四次揮手解析-CSDN博客

HarmonyOS-ArkUI Web控件基礎鋪墊5--TCP協議- 動畫展示超時重傳,滑動窗口,快速重傳-CSDN博客

之前我們已經對TCP的三握四揮,重傳, 和滑動窗口的推理過程進行了講解,本文的流暢理解均建立在以上三篇文章涉及的內容之上。如果對TCP不太了解,建議直接從HarmonyOS-ArkUI Web控件基礎鋪墊3--TCP協議- 從規則本質到三次握手-CSDN博客開始閱讀。

流量控制與擁塞控制關系

這兩個概念我們一塊簡略解釋下。因為流量控制和擁塞控制有聯系。我們需要在最初就要了解為什么滑動窗口總是和流量控制,擁塞控制一塊出現。

流量控制:就是控制發送方的發送速率,不要太快,讓接收方來得及處理數據。通常情況下我們希望數據發送的越快越好,但是實際上如果發送方發送的數據太快,接收方可能來不及接收,就會造成數據的丟失。具體操作是,利用算法,算出流量控制的窗口大小,從而影響滑動窗口大小,來調整發送接收速率。

擁塞控制:就是防止過多的數據注入到網絡中,導致網絡過載。注意流量控制欲擁塞控制的區別,流量控制一般是點對點的控制。而擁塞控制是一個全局性的過程,涉及所有的主機和路由器等待。具體操作依然是利用算法,算出擁塞控制的窗口大小,從而影響滑動窗口的大小。

流量控制與擁塞控制的協作方式如圖

為什么要進行流量控制

流量控制的由來我們前文實際上介紹了一點。滑動窗口機制就是實現流量控制的重要機制。下面是最原始的流水線協議傳輸過程,沒有流量控制:

這種是比較野蠻的傳輸方式,發送端不知道接收端的處理能力,就發送數據,如果接收方的處理能力很差,會導致很多數據包被浪費,是很不合理的。其中接收端處理能力不行有多方原因:

  • 接收端本身硬件就不支持快速的傳輸。它可能處于低帶寬網絡環境中。
  • 接收端接收到數據,但是數據消費太慢。例如您用HTTP協議讀取下載內容,結果由于業務邏輯有不是VIP就限制速度的需求,此時您可能會針對非VIP用戶讀取的很慢。那么就必然導致接收端的數據消費的慢。
  • 接收端緩沖區配置不足,無法容納突發流量或者持續高吞吐數據。等等。

滑動窗口的機制,便處理了這種問題。 在HarmonyOS-ArkUI Web控件基礎鋪墊5--TCP協議- 動畫展示超時重傳,滑動窗口,快速重傳-CSDN博客一文中如何演進的我們已經講過。在這里強調的事,流量控制的手段就是滑動窗口。

滑動窗口運作方式

在講流量控制的算法前,我們完善一下滑動窗口機制。在上篇文章里我們著重講了滑動窗口是怎么演化而來的,但是對于滑動窗口的實現方式提及的很少。按照自上而下的學習方式,我們在這里補全滑動窗口的細節。

滑動窗口AB端同步流程

對于滑動窗口可以分為兩類:

  • 發送窗口(SWND) 接收窗口(RWND)
  • 雙方互為發送端。 所以其實每一方都存在一個發送窗口和接收窗口。

滑動窗口協議之間的同步,主要就是一方的發送方窗口與另一方接收窗口大小的組合策略。

TCP滑動窗口的大小同步是由接收方接收窗口主導,發送方發送窗口自適應的動態過程。其核心機制圍繞接收方的緩沖區狀態和網絡擁塞狀況展開。

TCP協議的窗口大小在每一個數據包中都會見到。無論是發送方還是接收方,無論是發送的數據包還是ACK,全部都要帶。這個窗口的大小值,我們稱為 rwnd。存儲的位置如圖所示,位于WIndow Size字段中。單位為字節!我們在以后的圖中,會以 rwnd值來代表窗口大小。

窗口同步方式如圖所示:

  • 在三次握手的時候,第一次和第二次握手雙方發送的數據包rwnd都是2000
  • 當接收端接收到前四個數據包數據的時候發現自身數據消費慢,便改動接收窗口為1000,并跟隨ACK發出去
  • 發送端接受到ACK,根據ACK中的窗口值,1000, 調整發送端窗口的大小為1000. 并將窗口的起始位置定位到ACK中的seq映射的位置。
窗口為0時

有時候接收方的接收窗口大小會為0,比如:

  • 接收方處理能力不足,接收緩沖區滿
  • 接收方的應用層延遲處理,導致讀取邏輯阻塞。等等

此時接收方的接收窗口大小會變為0,會依然發送ACK包使得發送方調整發送窗口為0.當發送方發送窗口是0的時候,便不再發送數據了。

此時,發送端會進行零窗口探測。發送端內部會啟動一個持續計時器,默認30-60s, 定期發送數據內容為1字節的探測包來詢問接收方目前的窗口狀態。接收方接收到探測包便返回最新的rwnd值。就這樣重新起開了窗口。

與此同時,當接收方內部的緩存得到釋放后,會向接收方發送一個普通的ACK包,ACK包中的窗口大小為當前支持的窗口大小。這樣發送方接收并解析之后就可以正常發送數據了。

滑動窗口如何滑動

簡單的理解,滑動窗口的滑動位置,為收到的ACK中 ack中所映射的位置。向下移動不就好嘍?--如果這么簡單,那不必專門寫一個小節😂。

我們探討的是,滑動窗口在數據結構上是怎么個移動法。

我們知道,當TCP完成握手的時候,發送端和接收端分別都會開辟緩沖區。對于接收端,這個緩沖區是接收緩沖區。這個大小我查資料,Linux默認為87KB,最小值為4KB,最大值可擴展至6M(高帶寬場景).

然而我們傳輸的數據通常遠遠大于87KB!滑動窗口如果移動的時候,是按照從前到后這樣移動,那肯定到了87KB就指針越界了!所以對于緩沖區的數據結構而言,必須要采取一種可以快速循環快速偏移的方式。來支持滑動窗口.

TCP采取的是環形緩沖區,來確保窗口可以循環復用內存邊界。對于一個窗口而言其數據也有狀態分類,如圖所示。

盡管窗口會滑動,滑動的范圍在于ACK的偏移量。但是窗口是在一個環形緩沖區中滑動的。你可以想象是一個轉圈的圖。

流量控制-rwnd的計算方式

rwnd是Receiver Window的縮寫,就是接收窗口大小的意思。流量控制就是一個計算出rwnd的過程。上文中我們已經介紹了這個值。這個值之后會被參與計算最終接收端的窗口大小。

這個公式還是相當簡單的。也能解釋如果應用層停止read()數據,TCP干脆就不傳輸了,這種現象。因為應用層不read()數據,會導致應用層已讀取的最后字節序號不動, 但是此刻滑動窗口卻會不斷地向后滑,這樣未消費的數據就會越積越多,直到擠壓的窗口空間為0!

這下如果有個下載需求告訴您非VIP用戶,就要讓他慢。知道切入點在哪里了吧😄😄

顯然流量控制最為關注的就是接收端本地的緩存狀況,以及數據消費能力。流量控制先告一段落。我們算出來rwnd基本就達到目的了。。

擁塞控制及cwnd值的計算方法

擁塞控制主要是用來

  • 防止過多的數據注入到網絡,避免網絡中的路由器或鏈路過載
  • 是一個全局性的過程,涉及到所有主機,路由器以及降低網絡傳輸性能有關的所有因素。

如圖所示:

當發送數據的設備比較多的時候,隨著連接數量的增加,網絡負載加重,則必然會導致擁堵。擁堵會引發發送端超時重傳機制。如果大量的發重傳包,則又會加重網絡負擔。

由于引發問題的設備較多,數量較大,而且傳輸過程中太多不可預測。所以擁塞控制的著力點并不在于統籌所有設備狀況進行管理(事實上這種方式根本不可能實現)。 擁塞控制主要是通過自身試探的方式,來探測出當前的傳輸情況,從而計算擁塞窗口的大小。想象如果每臺設備都探測,則這種機制可以盡量保障他們都能測算出比較科學的數值。

擁塞窗口變量cwnd的計算方式

擁塞窗口計算的是發送端的擁塞窗口大小。與流量控制不一樣,流量控制計算的是接收端的接收窗口。 擁塞窗口是在發送端計算的。發送端在發送數據的時候的確需要知道目前的網絡情況。

擁塞窗口的計算方式比較普遍的是采用Reno算法。其思路如下:

RTT

在了解Reno算法前,先了解下RTT。因為算法需要用到這個。

RTT全稱 round trip time, 是衡量網絡傳輸性能的核心指標。指的是 從發送方發送數據包開始,到收到接收方對改數據包的確認ACK所經歷的時間。這段時間里涵蓋了以下環節的耗時

  • 傳播時延:信號在物理鏈路上的傳輸時間(與距離和介質相關,如光纖 vs 衛星)
  • 排隊時延:數據包在路由器/交換機緩存中的等待時間(受網絡擁塞程度影響)
  • 處理時延:發送/接收端系統處理數據的時間(如內核協議棧處理)

如何判斷網絡擁塞

TCP通過丟包來判斷網絡是否出現擁塞的。具體的丟包場景為

  • 1 發送端出現超時丟包,發送端超時重傳中的計時器,時間到了,還沒有收到對應的ACK,則此時認為丟包了。這種情況往往說明網絡擁塞情況是較為嚴重。
  • 2 發送端收到3個連續一樣的ACK包,此時代表雖然接收端沒有接收到數據,但是網絡情況比上一個情況好一些。輕微的有些擁堵。

Reno算法

Reno算法整體不復雜,沒有涉及到超級難的公式。主要就是梳理邏輯。針對不同的情況主要包含四種操作。其中有的我們上篇文章已經講過:

  • 慢啟動
  • 擁塞避免
  • 快速重傳 詳見HarmonyOS-ArkUI Web控件基礎鋪墊5--TCP協議- 動畫展示超時重傳,滑動窗口,快速重傳-CSDN博客
  • 快速恢復

Reno算法的整體特征為,前期窗口呈指數級增長,之后再線性增長,探測到一定邊緣后便檢測到擁塞,從而再壓低值,使得發送的窗口在一個平穩的波動中。

具體操作是

  • 首先開始慢啟動操作, 慢啟動的規則是:最初設定cwnd值為1,則發送窗口因為取 cwnd 和 rwnd的最小值而選擇是1. 發送端就會發送一個數據包出去,自此每一次傳輸輪次,窗口大小都會變成之前的 2倍。 所以慢啟動的窗口大小是按照指數來增長的。
  • 但是指數增長后期會爆發式上漲,用來設置窗口大小肯定不合適。Reno給慢開始設定了一個慢啟動門限,叫ssthresh。當cwnd超過這個值之后,就切換成第二種操作--擁塞避免算法。
  • 擁塞避免算法具有線性緩慢增長的能力,其具體的規則是,擁塞窗口每次經過一個RTT,大小則會加1。
  • 無論是慢啟動環節,還是擁塞避免啟動環節,只要發送端判斷出來網絡擁塞,就會把ssthresh設置為擁塞時發送窗口的一半。
    • 如果阻塞原因是超時重傳引發的,則代表網絡狀況比較糟糕,則cwnd值設置為1,重新執行慢啟動操作。
    • 如果阻塞原因是收到了三個連續一樣的ack, 則代表出現了輕微擁堵,則縮小幅度也沒必要像超時丟包那么大,同時也可以進行緩慢的增長。于是會開啟兩個操作
      • 執行快速重傳操作,前文我們講過。
      • 開始啟動快速恢復算法:快速啟動算法也就是避免cwnd值直接設置為1,假定這個值已經增長到了ssthresh的前提下,臨時抬高窗口大小,每當ACK重復包來一次,便抬高1.直到收到下一個新的ACK,窗口值直接降到ssthresh大小,再按照擁塞避免的操作執行。

我們根據上述的流程看一下下圖便可以理解了:

小結

本文主要描述了

  • 針對接收方流量控制的數據同步流程與流量窗口 rwnd 計算方式。
  • 針對發送方擁塞控制的計算算法,及 cwnd 計算方式。

我們回顧文章開始的,實際發送方發送窗口的大小則按照以下規則計算。

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

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

相關文章

Dify 從入門到精通(2/100 篇):Dify 的核心組件 —— 從節點到 RAG 管道

Dify 的核心組件:從節點到 RAG 管道 引言 在 Dify 博客系列:從入門到精通(100 篇) 的第一篇《Dify 究竟是什么?真能開啟低代碼 AI 應用開發的未來?》中,我們全面介紹了 Dify 的定位、核心特點…

在線培訓、遠程示教——醫療器械行業的直播解決方案

文章目錄前言一、醫療器械直播應用的兩大核心場景二、直播平臺在醫療場景中的關鍵技術支持點三、典型功能實現原理總結前言 醫療器械行業對“培訓”和“示教”的專業性要求極高,傳統的線下模式常因時間、空間、人員成本等受限而效率低下。而隨著高清低延遲視頻技術…

Mqttnet的MqttClientTlsOptions.CertificateValidationHandler詳解

MqttClientTlsOptions.CertificateValidationHandler 是 MQTTnet 庫中用于自定義 TLS 證書驗證邏輯的關鍵回調函數。在 MQTT 客戶端與服務器建立 TLS 連接時,該回調允許你覆蓋默認的證書驗證流程,實現自定義的安全策略。核心作用當 MQTT 客戶端通過 TLS …

【圖像噪點消除】——圖像預處理(OpenCV)

目錄 1 均值濾波 2 方框濾波 3 高斯濾波 4 中值濾波 5 雙邊濾波 6 小結 噪聲:圖像中的一些干擾因素。通常是由于圖像采集設備、傳輸信道等因素造成的,表現為圖像中隨機的亮度。常見的噪聲類型有高斯噪聲和椒鹽噪聲。高斯噪聲是一種分布符合正態分布…

Vulnhub napping-1.0.1靶機滲透攻略詳解

一、下載靶機 下載地址:https://download.vulnhub.com/napping/napping-1.0.1.ova 下載好后使用VM打開,將網絡配置模式改為net,防止橋接其他主機干擾(橋接Mac地址也可確定主機)。 二、發現主機 使用nmap掃描沒有相應…

Kubernetes自動擴容方案

Kubernetes 自動擴容可以概括為 “三層六類”:層級類型觸發維度官方/社區方案一句話說明Pod 級HPACPU / 內存 / 自定義 / 外部指標內置副本數橫向擴縮,最常用VPACPU / 內存社區組件單 Pod 資源豎向擴縮,不改副本數KEDA任意事件(隊…

linux命令ps的實際應用

ps(Process Status)是 ?Linux/Unix 系統中最核心的進程管理工具,用于實時抓取系統進程快照。它直接讀取 /proc 文件系統,不持續監控進程(區別于 top),但可通過參數組合實現精準進程診斷。下面從…

深入理解C語言:詳解直接插入排序的實現與優化

目錄 引言 一、直接插入排序的相關概念 1.1、基本概念 1.2、直接插入排序過程詳解 二、代碼實現 三、時間復雜度 四、希爾排序 4.1、希爾排序的陳述 4.2、代碼實現 4.3、時間復雜度 結語 引言 在計算機科學的世界里,排序算法是基礎且重要的組成部分。它們…

【DRAM存儲器五十五】LPDDR5介紹--command bus training

??個人主頁:highman110 ??作者簡介:一名硬件工程師,持續學習,不斷記錄,保持思考,輸出干貨內容 參考資料:《某LPDDR5數據手冊》 、《JESD209-5A》 在為高頻或中頻操作啟用ODT之前,必須對L

一道曾經百度面試題

🚀個人主頁:BabyZZの秘密日記 📖收入專欄:C語言 🌍文章目入1. 題目重現2. 大小端到底在比什么?3. 解法一:聯合體(union)為什么一行就夠?使用示例4. 解法二&am…

VIKOR(Multi-criteria Optimization and Compromise Solution)簡介與簡單示例

前言 提醒: 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。 其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展…

【算法訓練營Day18】二叉樹part8

文章目錄修剪二叉搜索樹將有序數組轉換為二叉搜索樹把二叉搜索樹轉換為累加樹修剪二叉搜索樹 題目鏈接:669. 修剪二叉搜索樹 解題邏輯: 因為在刪除的同時要保證相對結構,所以我們不能沿用上一篇文章中的刪除邏輯,新的刪除邏輯為&…

【C++篇】“內存泄露”的寶藏手段:智能指針

目錄 智能指針的使用場景分析 RAII和智能指針的設計思路 C標準庫智能指針的使用 auto_ptr的使用: unique_ptr的使用: shared_ptr的使用: 模擬shared_ptr: 定制刪除器: shared_ptr的循環引用 weak_ptr 智能指針的使用場景…

【密碼學】4. 分組密碼

目錄分組密碼分組密碼概述Feistel 密碼結構數據加密標準(DES)差分密碼分析與線性密碼分析分組密碼的運行模式國際數據加密算法(IDEA)高級加密標準(AES,Rijndael)中國商用密碼 SM4祖沖之密碼&…

單片機(STM32-WIFI模塊)

一、WIFI模塊介紹 1. ESP12-F模組介紹 1.1 簡介 ESP12-F模組(安信可(Ai-Thinker)ESP8266系列模組)是一款基于樂鑫(Espressif)公司ESP8266芯片的Wi-Fi無線通信模塊,廣泛應用于物聯網&#xff0…

PyTorch 數據類型和使用

關于PyTorch的數據類型和使用的學習筆記 系統介紹了PyTorch的核心數據類型Tensor及其應用。Tensor作為多維矩陣數據容器,支持0-4維數據結構(標量到批量圖像),并提供了多種數值類型(float32/int64等)。通過…

[python刷題模板] LogTrick

[python刷題模板] LogTrick 一、 算法&數據結構1. 描述2. 復雜度分析3. 常見應用4. 常用優化二、 模板代碼1. 特定或值的最短子數組2. 找特定值3. 找位置j的最后一次被誰更新4. 問某個或和的數量三、其他四、更多例題五、參考鏈接一、 算法&數據結構 1. 描述 LogTric…

Vim與VS Code

Vim is a clone, with additions, of Bill Joys vi text editor program for Unix. It was written by Bram Moolenaar based on source for a port of the Stevie editor to the Amiga and first released publicly in 1991.其實這個本身不是 IDE (只有在加入和配置…

[2025CVPR-圖象分類方向]CATANet:用于輕量級圖像超分辨率的高效內容感知標記聚合

?1. 研究背景與動機? ?問題?:Transformer在圖像超分辨率(SR)中計算復雜度隨空間分辨率呈二次增長,現有方法(如局部窗口、軸向條紋)因內容無關性無法有效捕獲長距離依賴。?現有局限?: SPI…

課題學習筆記3——SBERT

1 引言在構建基于知識庫的問答系統時,"語義匹配" 是核心難題 —— 如何讓系統準確識別 "表述不同但含義相同" 的問題?比如用戶問 "對親人的期待是不是欲?",系統能匹配到知識庫中 "追名逐利是欲…