TCP詳解——流量控制、滑動窗口

目錄

流量控制

滑動窗口?

丟包重傳

情況一:數據到達,應答丟失

情況二:數據包丟失


流量控制

TCP協議會根據接收端的緩沖區大小來調整發送速度,剩余空間多則發送速度快,否則降低發送速度

接收端將??可以接收的緩沖區剩余空間??放? TCP ?部中的 "窗???" 字段,窗???字段越?, 說明?絡的吞吐量越?

接收端?旦發現??的緩沖區快滿了, 就會將窗???設置成?個更?的值通知給發送端

發送端接受到這個窗?之后, 就會減慢??的發送速度,如果接收端緩沖區滿了, 就會將窗?置為0; 這時發送?不再發送數據, 但是需要定期發送?個窗?探測數據段, 使接收端把窗???告訴發送端.

同時如果接收方的緩沖區騰出空間了,會發送窗口更新通知給發送端

窗口的初始大小由三次握手階段的ACK包來確定

窗口的大小在TCP首部里是16位,但并不意味著最大只能有65535,首部里的選項還包含了?個窗?擴?因?M, 實際窗???是 窗?字段的值左移 M 位

滑動窗口?

?對每?個發送的數據段, 都要給?個ACK確認應答. 收到ACK后再發送下?個數據段. 這樣做有?個?較?的缺點, 就是性能較差. 尤其是數據往返的時間較?的時候

既然如此,一次發送多條數據而不等待應答就可大大提升效率

如上圖,就是選擇一次發送四條數據(這里先記住,TCP協議只能像這樣一條發送有限字節的數據,圖中就是1000字節,也就是一次只能發送1000字節,不能更多,主要是因為數據鏈路層的限制,一次性只能傳輸有限字節的數據)

發送前四個段的時候, 不需要等待任何ACK, 直接發送
收到第?個ACK后, 滑動窗?向后移動, 繼續發送第五個段的數據,依次類推
操作系統內核為了維護這個滑動窗?, 需要開辟發送緩沖區來記錄當前還有哪些數據沒有應答; 只
有確認應答過的數據, 才能從緩沖區刪掉;
窗?越?, 則?絡的吞吐率就越?;?

所謂窗口,就是你寫算法題經常遇到的那個滑動窗口。。。這個窗口內所維護的就是待發送的數據段,窗口左邊是確認收到應答的數據段,窗口右邊就是以后再發的數據段

窗口大小的確定與TCP首部的16位窗口大小有關,先可以理解為那個字段就是窗口大小,根據上面流量控制的討論,我們知道,這個大小完全取決于接收端的緩沖區剩余空間大小,由這個參數,滑動窗口就能實現流量控制

窗口具體如何移動,取決于TCP首部的確認應答號

確認應答號i+1表示從1~i序號的數據段全收到了,比如上面的圖,如果2001~3000丟包了,只收到了1001~2000,不管后面的數據段接收端是否收到,確認應答號都是2001,注意窗口左邊的是已經確認過應答的數據段

根據確認應答號i,可以確定窗口左邊left = i;

根據16位窗口大小,確定窗口右邊right = left + window;

這樣滑動窗口就能向右移動起來,注意上面的計算方式只適用于沒有丟包的情況

丟包重傳

情況一:數據到達,應答丟失

這種情況下, 部分ACK丟了并不要緊, 因為可以通過后續的ACK進?確認,比如上圖1~1000的數據丟了無所謂,后續會收到1~2000的確認應答號2001,收到2001,根據確認應答好的定義,1~2000全收到了,不用管1~1000沒收到應答

情況二:數據包丟失

接收端根本沒收到數據包

?對于這種情況,拿下圖討論一下

窗口內的數據段都有可能丟,我們不妨先來回憶一下確認應答號的定義,確認應答號為i表示1~i-1的數據全部收到了,把left賦值為i,表示1~i-1的數據全收到了,如果i <= right,可以看出丟包了,那么i~right的每一個數據段,都有可能丟包了,但是,我們只需要處理最左邊的數據段,即以left為開頭的第一個數據段,把它重發即可

做完之后,如果確認應答號i > right,直接left = i, right = left + window,否則說明仍有丟包的,假設剛才發的以left為開始的第一個數據段為丟包,那么確認應答號i肯定大于left,直接left = i,然后完全重復上面的工作即可

實際中可能不能根據i <= right來判斷是否丟包,因為收到的確認應答號總是要更小的,以下圖為例

判斷是否丟包,一般根據是否收到3次重復的確認應答為準,不是兩次是因為,數據包到達時間并不嚴格按照發送先后時間,可能3001~4000比2001~3000先到達,導致收到了兩次重復的確認應答號,所以一般設置為3次,3次一般足夠精確,再多又不好了?

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

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

相關文章

C#高級特性面試問題的詳細分析,涵蓋核心概念、應用場景和最佳實踐

序列化與反序列化 1. 什么是序列化和反序列化&#xff1f;用途是什么&#xff1f; // 序列化示例 Person person new Person { Name "Alice", Age 30 }; string json JsonSerializer.Serialize(person); // 序列化為JSON// 反序列化示例 Person deserialized Js…

【電腦】內存的基礎知識

內存&#xff08;Memory&#xff09;是計算機中用于臨時存儲數據和程序的地方&#xff0c;它直接影響到系統的運行速度和性能。以下是關于內存的詳細知識&#xff1a;1. 內存類型常見的內存類型包括以下幾個主要種類&#xff1a;SDRAM (Synchronous Dynamic Random Access Memo…

Java---IDEA

IDEA概述 IDEA&#xff1a;全稱Intellij IDEA&#xff0c;是用于Java語言開發的集成開發環境 集成環境&#xff1a;把代碼編寫&#xff0c;編譯&#xff0c;運行&#xff0c;調試等多種功能綜合到一起的開發工具 下載與安裝 下載&#xff1a;IntelliJ IDEA – the IDE for …

【每日刷題】x 的平方根

69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;暴力 從0開始遍歷&#xff0c;直到 ans*ans > x 為止&#xff0c;這時ans-1就是答案。需要注意可能會爆int&#xff0c;所以ans要開為long&#xff0c;最后再轉換為int。 class Solution {publ…

C#元組:從基礎到實戰的全方位解析

C#元組&#xff1a;從基礎到實戰的全方位解析 在 C# 編程中&#xff0c;元組&#xff08;Tuple&#xff09;是一種輕量級的數據結構&#xff0c;用于臨時存儲多個不同類型的元素。無論是方法返回多個值、LINQ 查詢中的臨時投影&#xff0c;還是簡化數據傳遞&#xff0c;元組都以…

Django母嬰商城項目實踐(二)

2、母嬰商城項目環境配置 環境配置: Python3.12 解釋器Pycharm Professional 2025.1 編輯器Django 4.2(或 Django 5.x)MySQL 8.0.28 數據庫 1、Django框架 介紹 Django是一個高級的Python Web應用框架,可以快速開發安全和可維護的網站。由經驗豐富的開發者構建,Django負責…

Go語言的Channel通道的含義。區分緩沖通道和非緩沖通道,并討論通道的發送、接收、關閉以及如何安全地從已關閉的通道讀取數據。

非緩沖通道&#xff1a;非緩沖通道在確定時沒有聲明容量大小&#xff0c;發送和接收操作會同步阻塞&#xff0c;直到另一端準備好。發送方和接收方必須同時就緒才能完成數據交換&#xff0c;否則會阻塞。常用于goroutine之間的同步通信。緩沖通道&#xff1a;緩沖通道在確定時就…

tensor

&#x1f609;如果您想用jupyter notebook跑我的筆記&#xff0c;可以在下面獲取ipynb版本 &#x1f60a;麻煩給個免費的star&#x1f618; ??主包也更建議這種形式&#xff0c;上面的筆記也更加全面&#xff0c;每一步都有直觀的輸出 文章目錄&#x1f4da; PyTorch張量操作…

STM32-DAC數模轉換

DAC數模轉換&#xff1a;將數字信號轉換成模擬信號特性&#xff1a;2個DAC轉換器每個都擁有一個轉換通道8位或12位單調輸出&#xff08;8位右對齊&#xff1b;12位左對齊右對齊&#xff09;雙ADC通道同時或者分別轉換外部觸發中斷電壓源控制部分&#xff08;外部觸發3個APB1&am…

前后端集合如何傳遞

前端vue后端rest風格&#xff1a;1.路徑傳參&#xff08;參數必傳&#xff09;&#xff0c;通過pathvarible注解后端&#xff1a;DeleteMapping("/{YYIDs}")public R<Void> remove(NotEmpty(message "主鍵不能為空")PathVariable String[] YYIDs) {…

1353. 最多可以參加的會議數目

1353. 最多可以參加的會議數目 題目鏈接&#xff1a;1353. 最多可以參加的會議數目 代碼如下&#xff1a; class Solution { public:int maxEvents(vector<vector<int>>& events) {int mx 0;for (auto& e : events) {mx max(mx, e[1]); // 找到最大的結…

OCR 本地版本

UMI OCR 支持本地部署&#xff0c;支持HTTP OCR

大數據驅動的酒店用品需求預測模型研究 開發——畢業論文,畢業設計——仙盟創夢IDE

主頁酒店用品 平臺協議促銷畢業論文摘要本研究旨在構建基于大數據分析的酒店用品需求預測模型&#xff0c;以提高酒店用品批發企業的庫存管理效率和供應鏈響應速度。研究整合了酒店歷史采購數據、季節因素、市場趨勢、節假日信息等多源數據&#xff0c;通過對比傳統時間序列模型…

Windows11桌面解鎖守護腳本

使用python程序加bat一鍵運行腳本&#xff0c;媽媽再也不用擔心我的電腦桌面了import os import time import cv2 import pyautogui import psutil from datetime import datetimeclass UnlockMonitor:def __init__(self):"""初始化監控器"""sel…

Linux Ubuntu系統的用戶管理

一.關于root用戶默認我們安裝完系統后 注冊的用戶就是管理員用戶標識符 $ 管理員標識符#最高管理員在Ubuntu系統中,root是最高管理員,擁有最大的權限,默認情況下root用戶沒有啟用密碼,而是通過sudo機制來獲取管理員權限二.Ubuntu系統中root用戶的默認狀態root用戶存在,但未啟用…

ROS1學習第三彈

ROS1學習第二彈 本文純屬記錄學習過程&#xff0c;所學教程來自B站古月居ROS入門21講 tf工具的使用 命令行中 1.rosrun tf view_frames 生成當前各個坐標的結構圖&#xff0c;導出pdf文件到當前終端所在文件夾下面2.rosrun rviz rviz -d rospackage find turtle_tf /rviz/tu…

技術演進中的開發沉思-30 MFC系列:五大機制

MFC&#xff0c;記得我剛畢業時在 CRT 顯示器前敲下第一行 MFC 代碼時&#xff0c;那時什么都不懂&#xff0c;沒有框架的概念。只覺得眼前的 CObject 像位沉默且復雜的大家族&#xff0c; 就像老北京胡同里的大家族&#xff0c;每個門牌號都藏著自己的故事。但現在看看&#x…

機器學習-06(Optimization-自動調整學習率)

臨界點其實不一定是在訓練神經網絡過程中遇到的最大阻礙。隨著對參數的不斷更新&#xff0c;Loss值會不斷下降&#xff0c;直至幾乎沒有變化&#xff0c;不再下降。當參數更新到臨界點時&#xff0c;意味著gradient非常小&#xff0c;所以要認定參數是否到達臨界點應當確認grad…

Uniapp中的uni.scss

uni.scss為uni-app新建項目自帶工程文件&#xff0c;使用的預處理器為sass/scss&#xff0c;由此可見&#xff0c;uni-app官方推薦的是scss。 uni.scss特點 無需引入&#xff0c;uni-app在編譯時&#xff0c;會自動引入此文件在此中定義的scss變量&#xff0c;可以全局使用&…

PreparedStatement 實現分頁查詢詳解

PreparedStatement 實現分頁查詢詳解 在 JDBC 中使用 PreparedStatement 實現分頁查詢是高效安全的方式&#xff0c;可以避免 SQL 注入并提升性能。下面我將詳細說明實現步驟和原理。 &#x1f4d0; 分頁查詢核心參數參數名說明計算公式pageNum當前頁碼&#xff08;從1開始&…