TCP重傳、滑動窗口、流量控制、擁塞控制機制

目錄

  • 1、TCP重傳機制
    • 超時重傳
    • 快速重傳
  • 2、滑動窗口
  • 3、流量控制
  • 4、擁塞控制
    • 1、慢啟動
    • 2、擁塞避免
    • 3、擁塞發生

1、TCP重傳機制

TCP 針對數據包丟失的情況,會用重傳機制解決。

超時重傳

就是在發送數據時,設定一個定時器,當超過指定的時間還沒有收到對方的 ACK 確認應答報文,就會重發該數據。
RTT往返時延是數據包的往返時間,超時重傳時間的值應該略大于報文往返 RTT 的值。

快速重傳

不以時間為驅動,而是以數據驅動重傳。
快速重傳的工作方式是當收到三個相同的 ACK 報文時,會在定時器過期之前,重傳丟失的報文段。
比如A給B發了1、2、3、4、5個報文,B收到1后應答2表示希望收到2,但是2丟失了,后面B收到3、4、5時都返回2,A收到了三個 Ack = 2 的確認,知道了 Seq2 還沒有收到,就會在定時器過期之前,重傳丟失的 Seq2。
【它依然面臨著另外一個問題。發送方并不清楚這連續的 ACK2 是接收方收到哪個報文而回復的,是重傳一個,還是重傳所有的報文。】
選擇性確認
在 TCP 頭部「選項」字段里加一個 SACK數據,它可以將已收到的數據的信息發送給「發送方」,這樣發送方就可以知道哪些數據收到了,哪些數據沒收到,知道了這些信息,就可以只重傳丟失的數據。

2、滑動窗口

我們都知道 TCP 是每發送一個數據,都要進行一次確認應答。當上一個數據包收到了應答了, 再發送下一個。這種方式的效率比較低。
所以TCP引入了窗口這個概念,窗口大小就是指無需等待確認應答,而可以繼續發送數據的最大值。窗口實際上是操作系統開辟的一個緩存空間,發送方主機在等到確認應答返回之前,必須在緩沖區中保留已發送的數據。如果按期收到確認應答,此時數據就可以從緩存區清除。而且還會有累計應答,只要發送方收到了 ACK xx 確認應答,就意味著 xx 之前的所有數據「接收方」都收到了,這樣即使之前有應答丟失了也沒事。

3、流量控制

發送方不能無腦的發數據給接收方,要考慮接收方處理能力。如果一直無腦的發數據給對方,但對方處理不過來,導致網絡流量的無端的浪費。TCP 提供一種機制可以讓「發送方」根據「接收方」的實際接收能力控制發送的數據量。

  • TCP流量控制的主要機制是通過滑動窗口實現的。發送方根據接收方的窗口大小和網絡情況動態調整自己的發送窗口大小。

4、擁塞控制

流量控制是避免「發送方」的數據填滿「接收方」的緩存
擁塞控制是避免「發送方」的數據填滿整個網絡
擁塞窗口cwnd是發送方根據網絡的擁塞程度而動態維護的一個的變量。
發送窗口的值 是擁塞窗口和接收窗口中的最小值。
擁塞控制三個階段:慢啟動-》擁塞避免-》擁塞發生

1、慢啟動

有個ssthresh慢啟動門限的變量
TCP 在剛建立連接完成后,首先是有個慢啟動的過程,一點一點的提高發送數據包的數量,發包的個數是指數性的增長,也就是擁塞窗口1、2、4、8這樣。
當 擁塞窗口cwnd 超過 ssthresh慢啟動門限 時,開始「擁塞避免算法」。

2、擁塞避免

進入擁塞避免算法后,每當收到一個 ACK 時,擁塞窗口cwnd 增加 1,也就是變成了線性增長。所以還是增長階段,只是增長速度緩慢了一些。

3、擁塞發生

一直增長后,網絡就會慢慢進入擁塞的狀況,于是就會出現丟包現象,需要對丟失的數據包進行重傳。
我們知道,重傳一般也就超時重傳和快速重傳。

  • 當發生了「超時重傳」,則就會使用擁塞發生算法。
    ssthresh慢啟動門限 設為 擁塞窗口的一半,擁塞窗口重置為 1(初始值),然后重新進入慢啟動階段。
    這種方式太激進,反應也很強烈,會造成網絡卡頓。
  • 當發生了「快速重傳」,使用快速恢復算法。
    快速恢復算法是認為,你還能收到 3 個重復 ACK 說明網絡也不那么糟糕。此時慢啟動門限和擁塞窗口都設為原擁塞窗口的一半,然后重新進入擁塞避免階段;

TCP擁塞控制是傳輸控制協議(TCP)中用于防止網絡擁塞的一種機制。當網絡中的流量過多時,可能會導致數據包丟失和延遲增加,擁塞控制的目的是避免這種情況的發生。TCP擁塞控制主要基于以下四個算法:

慢啟動(Slow Start):

慢啟動是TCP開始發送數據時的初始階段,此時擁塞窗口(Congestion Window, cwnd)從1個最大報文段(MSS)開始,每收到一個確認(ACK),cwnd 就增長1個MSS,直到達到一個閾值(ssthresh),之后切換到擁塞避免算法。
擁塞避免(Congestion Avoidance):

當cwnd超過ssthresh后,擁塞避免算法開始工作。此時,cwnd的增長速率會減慢,每經過一個往返時間(RTT),cwnd增長1個MSS。這種增長方式是線性的,而不是指數級的。
快重傳(Fast Retransmit):

當接收方檢測到失序的報文段時,它會立即發送重復ACK(Duplicate ACK),而不是等待自己的數據發送時才進行確認。當發送方接收到三個相同的重復ACK時,會立即重傳該報文段,而不是等待重傳計時器到期。
快恢復(Fast Recovery):

快恢復是與快重傳配合使用的算法。當發送方接收到三個重復ACK時,會將ssthresh設置為當前cwnd的一半,并將cwnd設置為ssthresh加3個MSS,然后進入擁塞避免狀態,而不是慢啟動。
選擇性確認(Selective Acknowledgments, SACK):

SACK是TCP的一個選項,允許接收方明確告訴發送方哪些數據已經被成功接收,哪些需要重傳。這可以減少不必要的重傳,提高網絡效率。
延遲確認(Delayed Acknowledgments):

延遲確認是接收方為了減少發送ACK的數量而采取的一種策略,它會等待一段時間或直到收到一定數量的數據后再發送ACK。
窗口縮放(Window Scaling):

窗口縮放允許TCP窗口大小超過64KB的限制,這對于高速網絡來說是非常有用的,可以顯著提高傳輸效率。
擁塞窗口全開(Congestion Window Full, CWnd Full):

當cwnd達到最大窗口大小時,TCP會根據網絡的反饋來調整數據的發送速率,以避免網絡擁塞。
TCP擁塞控制的這些算法共同工作,以確保網絡中的流量得到合理分配,減少數據包丟失,提高網絡的整體性能和穩定性。然而,擁塞控制算法的選擇和調整通常依賴于具體的網絡環境和應用需求。


擁塞窗口全開(Congestion Window Full,簡稱CWND Full)并不是一個標準的TCP擁塞控制算法,而是對TCP擁塞窗口(Congestion Window,簡稱CWND)在達到最大值時行為的一種描述。在TCP擁塞控制中,CWND是一個重要的參數,用于控制發送端可以連續發送的數據量,而不受接收端接收能力的限制。

以下是CWND全開的一些概念和行為:

CWND增長:在TCP連接建立初期,CWND從1個最大報文段(MSS)開始,隨著數據的成功傳輸,CWND會逐漸增長。

慢啟動階段:CWND按照指數方式增長,直到達到慢啟動閾值(ssthresh),此時進入擁塞避免階段。

擁塞避免階段:CWND的增長速度會減慢,通常每經過一個往返時間(RTT),CWND增加1個MSS,增長方式為線性增長。

達到最大值:當CWND增長到一個預設的最大值(例如,由操作系統或網絡環境決定的值)時,CWND就被認為是"全開"的。此時,CWND不再增長,發送端將根據這個窗口大小來控制數據的發送速率。

擁塞信號:在CWND全開的情況下,如果發生丟包或其他擁塞信號,TCP會采取措施減少CWND的大小,以避免進一步的擁塞。這通常涉及到將ssthresh設置為當前CWND的一半,并將CWND重置為1個MSS,然后重新進入慢啟動階段。

自適應調整:在某些情況下,TCP可能會使用自適應算法來調整CWND的最大值,以更好地適應網絡條件。例如,使用自適應擁塞控制算法(如Vegas)的TCP變種會根據網絡反饋來調整CWND的增長和減少策略。

網絡環境影響:CWND全開的行為會受到網絡環境的影響,例如帶寬、延遲、丟包率等。在高帶寬、低延遲的網絡環境中,CWND可能會增長到較大值,而在擁塞嚴重的網絡中,CWND的增長可能會受到限制。

CWND全開是一個動態的過程,它依賴于網絡條件和TCP擁塞控制算法的實現。正確地管理CWND的大小對于優化網絡性能和避免擁塞至關重要。

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

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

相關文章

Ctrl+C、Ctrl+V、Ctrl+X 和 Ctrl+Z 的起源

注:機翻,未校對。 The Origins of CtrlC, CtrlV, CtrlX, and CtrlZ Explained We use them dozens of times a day: The CtrlZ, CtrlX, CtrlC, and CtrlV shortcuts that trigger Undo, Cut, Copy, and Paste. But where did they come from, and why do…

文件上傳接口

文章目錄 開發前端接口 開發前端接口 首先這個前端的文件上傳組件使用了,前端組件 首先這個接口不是一般的接口,這個接口可以提取出來,之后那里使用了,就直接放到哪里 所以這是一個萬能文件上傳接口 寫完之后選擇 頭像組件 在圖庫中添加組件 寫前端組件之后,寫了前端的組件…

Bootstrap 5 加載效果

Bootstrap 5 加載效果 Bootstrap 5 是一個流行的前端框架,它提供了豐富的組件和工具,用于快速開發響應式和移動優先的網頁。在本文中,我們將探討 Bootstrap 5 中的加載效果,包括如何實現它們以及它們在網頁設計中的作用。 什么是加載效果? 加載效果是在網頁或應用程序中…

k8s集群創建devops項目一直等待狀態,沒有發現host

問題分析: kubesphere在幫我們自動化創建一些智能自動化的額時候難免會發生一些小錯誤,devops-jenkins是一個部署也會生成一個容器組即pod,容器組的容器服務端口是 targetPort,容器組對外暴露的端口是port,拿devops-c…

[深度學習]基于yolov10+streamlit目標檢測演示系統設計

YOLOv10結合Streamlit構建的目標檢測系統,不僅極大地增強了實時目標識別的能力,還通過其直觀的用戶界面實現了對圖片、視頻乃至攝像頭輸入的無縫支持。該系統利用YOLOv10的高效檢測算法,能夠快速準確地識別圖像中的多個對象,并標注…

Billu_b0x靶機

信息收集 使用arp-scan 生成網絡接口地址來查看ip 輸入命令: arp-scan -l 可以查看到我們的目標ip為192.168.187.153 nmap掃描端口開放 輸入命令: nmap -min-rate 10000 -p- 192.168.187.153 可以看到開放2個端口 nmap掃描端口信息 輸入命令&…

配置PYTHONPATH環境變量

配置PYTHONPATH環境變量 前言Win系統臨時配置永久配置 Linux系統臨時配置永久配置 前言 在運行py腳本時不僅需要import官方庫,經常會import自己編寫的腳本,但此時會出現模塊找不到的如下報錯。解決方法是配置PYTHONPATH,下文介紹Win系統和Li…

禹神:一小時快速上手Electron,前端Electron開發教程,筆記。一篇文章入門Electron

一、Electron是什么 簡單的一句話,就是用htmlcssjsnodejs(Native Api)做兼容多個系統(Windows、Linux、Mac)的軟件。 官網解釋如下(有點像繞口令): Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面…

Resources.Load返回null

Resources.Load返回null 在unity中Resources.Load從Assets下的任意Resources目錄下讀取資源&#xff0c;比如從Assets\Resources下讀取Cube&#xff08;預制體&#xff09;&#xff0c;當然也可以讀取其他資源 代碼為 GameObject prefab Resources.Load<GameObject>(…

微軟Edge瀏覽器深度解析:性能、安全性與特色功能全面評測

一、引言 自Windows 10操作系統推出以來&#xff0c;微軟Edge瀏覽器作為默認的網頁瀏覽器&#xff0c;憑借其現代化的設計和出色的性能表現&#xff0c;逐漸獲得了用戶的認可。本文旨在對Edge瀏覽器進行深入分析&#xff0c;探討其在多個方面的表現。 二、界面與操作體驗 界面…

在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01;&#x1f4da;領書&#xff1a;PostgreSQL 入門到精通.pdf 文章目錄 在 PostgreSQL 里如何處理數據的存儲優化和數據庫備份的效率平衡&#xff1f;一、數據存儲優化&#x…

HTML表格表單及框架標簽

一.表格標簽 1.<table></table> 創建表格 2.<caption></caption> 表格的標題 3.<tr></tr>Table Row&#xff08;表格行&#xff09; 4.<td></td>Table Data&#xff08;表格數據&#xff09;其中有屬性rowspan"2&quo…

Linux操作系統——數據庫

數據庫 sun solaris gnu 1、分類&#xff1a; 大型 中型 小型 ORACLE MYSQL/MSSQL SQLITE DBII powdb 關系型數據庫 2、名詞&#xff1a; DB 數據庫 select update database DBMS 數據…

Go中的defer看似很簡單,實則一點都不難

Golang 中的 Defer 在Go語言中&#xff0c;defer語句用于將一個函數調用推遲到外圍函數返回之后執行。它常用于確保某些操作在函數結束時一定會執行&#xff0c;例如資源釋放、文件關閉等。 基本語法 defer語句的基本使用方法如下&#xff1a; func main() {defer fmt.Prin…

距離變換 Distance Transformation

以下為該學習地址的學習筆記&#xff1a;Distance transformation in image - Python OpenCV - GeeksforGeeks 其他學習資料&#xff1a;Morphology - Distance Transform 簡介 距離變換是一種用于計算圖像中每個像素與最近的非零像素之間距離的技術。它通常用于圖像分割和物體…

51單片機5(GPIO簡介)

一、序言&#xff1a;不論學習什么單片機&#xff0c;最簡單的外設莫過于I口的高低電平的操作&#xff0c;接下來&#xff0c;我們將給大家介紹一下如何在創建好的工程模板上面&#xff0c;通過控制51單片機的GPIO來使我們的開發板上的LED來點亮。 二、51單片機GPIO介紹&#…

第三節SHELL腳本中的變量與運算(1.1-1.5)

一,腳本中的變量 1,1什么是變量 在編寫程序是,通常會遇到被操作對象不固定的情況我們需要用一串固定的字符來的表示不固定的值,這就是變量存在的根本意義變量的實現原理就是內存存儲單元的一個符合名稱 1,2 變量的命名規則 變量的名稱中只能包含數字,大小寫字母以及下劃線 …

PySide在Qt Designer中使用QTableView 顯示表格數據

在 PySide6 中&#xff0c;可以使用 Qt Model View 架構中的 QTableView 部件來顯示和編輯表格數據。 1、創建ui文件 在Qt Designer中新建QMainWindow&#xff0c;命名為csvShow.ui。QMainWindow上有兩個部件&#xff1a;tableview和btn_exit。 2、使用pyuic工具將ui文件轉換為…

Kafka(四) Consumer消費者

一&#xff0c;基礎知識 1&#xff0c;消費者與消費組 每個消費者都有對應的消費組&#xff0c;不同消費組之間互不影響。 Partition的消息只能被一個消費組中的一個消費者所消費&#xff0c; 但Partition也可能被再平衡分配給新的消費者。 一個Topic的不同Partition會根據分配…

MySQL集群、Redis集群、RabbitMQ集群

一、MySQL集群 1、集群原理 MySQL-MMM 是 Master-Master Replication Manager for MySQL&#xff08;mysql 主主復制管理器&#xff09;的簡稱。腳本&#xff09;。MMM 基于 MySQL Replication 做的擴展架構&#xff0c;主要用來監控 mysql 主主復制并做失敗轉移。其原理是將真…