当前位置: 首页 > news >正文

【网络】TCP协议通信的重要策略——滑动窗口,快重传,流量控制,拥塞控制,延时应答

目录

MSS值

滑动窗口

滑动窗口与重发机制

快重传机制

滑动窗口与流量控制

滑动窗口与拥塞控制

延时应答


个人主页:东洛的克莱斯韦克-CSDN博客

相关文章

【网络】传输层TCP协议的报头和传输机制-CSDN博客

【网络】详解TCP协议通信时客户/服务端的状态-CSDN博客

【网络】IP分片与路径MTU发现-CSDN博客

MSS值

由于底层(数据链路层)在发送数据时有最大长度限制,所以TCP在发送数据时,为了尽量避免IP分片,TCP一段为单位发送数据。

MSS值表示最大消息长度,正好是不用进行IP分片的最大长度。而MSS值会在三次握手时进行协商。

滑动窗口

如果每发一个段,就要等待一个ACK应答,会让传输数据的效率变得低下

窗口的概念是发送完一个段后无需应答,继续发送。在一个时间节点内发送一批数据,这一批已经发送但未收到应答的数据就用窗口维护起来。

在TCP维护的缓冲区中分为四块,发送以收到应答的数据,发送未收到应答的数据,未发送的数据,剩余空间,而整个缓冲区在逻辑上也是一个环形缓冲区。窗口就是那块发送未收到应答的数据的缓冲区。

上图中,窗口大小也是根据应答的序号动态调整的。

滑动窗口与重发机制

窗口的存在允许部分应答丢失。即使部分应答丢失也不会触发重发机制。

快重传机制

那如果是报文丢失呢?

如上图所示。当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,这个确认应答好像在提醒发送端“我想接收的是从1001开始的数据”。因此,在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答·,就会将其所对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称作高速重发控制。

滑动窗口与流量控制

所谓流量控制就是接收端在应答时在报头中填充窗口字段的大小,大小就填自己剩余缓冲区的空间。滑动窗口的大小就和接收端缓冲区起来,这样发送端就知道自己下一次发送多大的数据。

如上图所示,当接收端收到从3001号开始的数据段后其缓冲区即满,不得不暂时停止接收数据。之后,在收到发送窗口更新通知后通信才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信。为避免此类问题的发生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。

滑动窗口与拥塞控制

上述情况都只是考虑双方主机的问题,但网络通信中不可忽视的一个因素就是网络环境。如果发送出去的数据总是收不到应答,可能是网络本身出问题了。

在一个共享的网络环境中,可能某个时间段发送的数据的高峰期,让网络变得特别拥塞,这是就要对发送的数据量进行控制,这种控制就叫做拥塞控制。

此处引入一个概念称为拥塞窗口,发送开始的时候, 定义拥塞窗口大小为 1;  每次收到一个 ACK 应答, 拥塞窗口加 1;  每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较 小的值作为实际发送的窗口

像上面这样的拥塞窗口增长速度, 是指数级别的. "慢启动" 只是指初使时慢, 但是增长速 度非常快.  为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍. 此处引入一个叫做慢启动的阈值 当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增 长

当 TCP 开始启动的时候, 慢启动阈值等于窗口最大值; 在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回 1; 少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞; 当 TCP 通信开始后, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降; 拥塞控制, 归根结底是 TCP 协议想尽可能快的把数据传输给对方, 但是又要避免给网络 造成太大压力的折中方案

理解拥塞控制要站在全网的角度。由于使用TCP协议的主机多,这种拥塞控制的机制实际上就是一种共识。

网络越拥塞检测到网络拥塞的主机就越多,那么参与到拥塞控制的主机就越多,这样网络才可能或者说有较大概率让网络畅通起来。(不考虑网络的设计本身就有问题)

延时应答

延时应答(Delayed Acknowledgment)是指TCP接收方在接收到数据包后,并不立即发送确认(ACK)消息,而是等待一段时间,以期望在该时间段内收到更多的数据包。如果在这段时间内确实收到了更多的数据包,接收方会将多个ACK消息合并为一个进行发送,从而减少网络中的确认消息数量,提高网络利用率。

 假设接收端缓冲区为 1M. 一次收到了 500K 的数据; 如果立刻应答, 返回的窗口 就是 500K;  但实际上可能处理端处理的速度很快, 10ms 之内就把 500K 数据从缓冲区消费 掉了; 在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也 能处理过来; •如果接收端稍微等一会再应答, 比如等待 200ms 再应答, 那么这个时候返回的 窗口大小就是 1M;

得, 窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络 不拥塞的情况下尽量提高传输效率。

具体的数量和超时时间, 依操作系统不同也有差异; 一般 N 取 2, 超时时间取 200

相关文章:

【网络】TCP协议通信的重要策略——滑动窗口,快重传,流量控制,拥塞控制,延时应答

目录 MSS值 滑动窗口 滑动窗口与重发机制 快重传机制 滑动窗口与流量控制 滑动窗口与拥塞控制 延时应答 个人主页:东洛的克莱斯韦克-CSDN博客 相关文章 【网络】传输层TCP协议的报头和传输机制-CSDN博客 【网络】详解TCP协议通信时客户/服务端的状态-CSDN博…...

极狐GitLab CI/CD 如何构建镜像并推送到 azure 镜像仓库?

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...

Leetcode—1143. 最长公共子序列【中等】

2024每日刷题&#xff08;155&#xff09; Leetcode—1143. 最长公共子序列 实现代码 class Solution { public:int longestCommonSubsequence(string text1, string text2) {int m text1.length();int n text2.length();vector<vector<int>> dp(m 1, vector&…...

ZBrush笔刷介绍

根据使用的方法和效果&#xff0c;ZBrush的笔刷可以分类如下&#xff1a; 基本功能笔刷 这些笔刷用于常规的雕刻、移动和平滑操作。 纹理应用笔刷 一般需要自己额外购买的是这三种笔刷 Alpha Brushes&#xff1a;使用灰度图&#xff08;alpha&#xff09;来定义笔刷形状和纹…...

React+AntDesign做一个日历,展示节假日,节气,并且在某几个时间上添加活动备注

直接贴效果图&#x1f604; 首先日历是用的AntDesign提供的Calendar组件&#xff0c;这个组件还是蛮强大的&#xff0c;可以自定义头部时间下拉&#xff1b;渲染每个时间段&#xff0c;或者重置时间段内容&#xff0c;玩的空间是很大的 直接贴代码&#xff0c;结尾最后我会将…...

排序算法之梳排序

title: 梳排序 date: 2024-7-30 14:46:27 0800 categories: 排序算法 tags:排序算法梳排序 description: 梳排序&#xff08;Comb Sort&#xff09;是一种由弗拉基米尔多博舍维奇&#xff08;Wlodzimierz Dobosiewicz&#xff09;于1980年所发明的不稳定排序算法&#xff0c;并…...

ESP8266 创建TCP连接

TCP Client 使用WiFiClient类可以实现TCP Client 基本方法 连接Server&#xff0c;connect WiFiClient client; client.connect(host, port) 检测客户端是否存在数据流 client.available() 读取客户端的一个字符 client.read(); 检查连接状态 client.connected() 使用…...

OceanBase内存管理小窍门

本文来自OceanBase热心用户的实践分享。 本文主要是对OceanBase内存管理的实用技巧分享&#xff0c;而并非直接深入OceanBase的代码层面进行阐述。​​​​​​​ 阅读本文章你将了解&#xff1a; 重载运算符new 与malloc在返回值上区别&#xff1f;在ceph 双向链表新用法&am…...

【问题解决】git status中文文件名乱码

问题复现 解决办法 在git bash中直接执行如下命令 git config --global core.quotepath false原因 通过 git config --help 可以查看到以下内容&#xff1a; core.quotePath Commands that output paths (e.g. ls-files, diff), will quote “unusual” characters in the p…...

探索数据结构:AVL树的分析与实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. AVL树的介绍 在前面我们学习二叉搜索树时知道&#xff0c;在数据有序…...

使用 C++ 实现简单的插件系统

使用 C 实现简单的插件系统 在现代软件开发中&#xff0c;插件系统是一种常见的架构模式&#xff0c;它允许开发者在不修改主程序的情况下&#xff0c;扩展应用程序的功能。通过插件&#xff0c;用户可以根据需要添加或移除功能模块&#xff0c;从而提高软件的灵活性和可维护性…...

使用Python创建省份城市地图选择器

在这篇博客中&#xff0c;我们将探讨如何使用Python创建一个简单而实用的省份城市地图选择器。这个项目不仅能帮助我们学习Python的基础知识&#xff0c;还能让我们了解如何处理JSON数据和集成网页浏览器到桌面应用程序中。 C:\pythoncode\new\geographicgooglemap.py 全部代码…...

【Java 数据结构】Stack和Queue介绍

Stack和Queue StackStack是什么Stack的使用构造方法常用方法 栈的模拟实现初始化和基本方法入栈出栈查看栈顶 栈的应用链栈的简单介绍 QueueQueue是什么Queue的使用队列的模拟实现初始化入队出队查看队头元素 循环队列循环队列的定义及其注意点循环队列的实现初始化和基本方法获…...

Docker基本语法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、更新yum镜像仓库&#xff08;一&#xff09;查看本地yum镜像源地址&#xff08;二&#xff09;设置docker的镜像仓库&#xff08;1&#xff09;安装必要工具…...

uniapp 对于scroll-view滑动和页面滑动的联动处理

需求 遇到一个需求 解决方案 这个时候可以做一个内页面滑动判断 <!-- scroll-y 做true或者false的判断是否滑动 --> <view class"u-menu-wrap" style"background-color: #fff;"><scroll-view :scroll-y"data.isGo" scroll-wit…...

opencv基础的图像操作

1.读取图像&#xff0c;显示图像&#xff0c;保存图像 #图像读取、显示与保存 import numpy as np import cv2 imgcv2.imread(./src/1.jpg) #读取 cv2.imshow("img",img) #显示 cv2.imwrite("./src/2.jpg",img) #保存 cv2.waitKey(0) #让程序进入主循环(让…...

Java | Leetcode Java题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(TreeNode root) {int[] rootStatus dfs(root);return Math.max(rootStatus[0], rootStatus[1]);}public int[] dfs(TreeNode node) {if (node null) {return new int[]{0, 0};}int[] l dfs(node.left);i…...

本地查看的Git远程仓库分支与远程仓库分支数量不一致

说明&#xff1a;一次&#xff0c;在IDEA中想切换到某分支&#xff0c;但是查看Remote没有找到要切换的分支&#xff0c;但是打开GitLab&#xff0c;查看远程仓库&#xff0c;是有这个分支的。 解决&#xff1a;1&#xff09;在IDEA的Git中&#xff0c;点下面Fatch获取一下远程…...

opencv-python实战项目九:基于拉普拉斯金字塔的图像融合

文章目录 一&#xff0c;简介&#xff1a;二&#xff0c;拉普拉斯金字塔介绍&#xff1a;三&#xff0c;算法实现步骤3.1 构建融合拉普拉斯金字塔3.2 融合后的拉普拉斯金字塔复原&#xff1a; 四&#xff0c;整体代码实现&#xff1a;五&#xff0c;效果&#xff1a; 一&#x…...

浅谈JDK

JDK(Java Development Kit) JDK是Java开发工具包&#xff0c;是Java编程语言的核心软件开发工具。 JDK包含了一系列用于开发、编译和运行Java应用程序的工具和资源。其中包括&#xff1a; 1.Java编译器&#xff08;javac&#xff09;&#xff1a;用于将Java源代码编译成字节…...

爬虫案例3——爬取彩票双色球数据

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正 任务&#xff1a;从500彩票网中爬取双色球数据 目标网页地址&#xff1a;https://datachart.500.com/ssq/ 一、思路和过程 目标网页具体内容如下&#xff1a; ​​​​​ 我们的任务是将上图中…...

C++ | Leetcode C++题解之第337题打家劫舍III

题目&#xff1a; 题解&#xff1a; struct SubtreeStatus {int selected;int notSelected; };class Solution { public:SubtreeStatus dfs(TreeNode* node) {if (!node) {return {0, 0};}auto l dfs(node->left);auto r dfs(node->right);int selected node->val…...

软件架构设计师-UML知识导图

软件架构设计师-UML知识导图&#xff0c;包含如下内容&#xff1a; 结构化设计&#xff0c;包含结构化设计的概念、结构化设计的主要内容、概要设计、详细设计及模块设计原则&#xff1b;UML是什么&#xff1a;介绍UML是什么&#xff1b;UML的结构&#xff1a;构造块、公共机制…...

在使用transformers和pytorch时出现的版本冲突的问题

在使用transformers和torch库的时候&#xff0c;出现了以下问题&#xff1a; 1、OSError: [WinError 126] 找不到指定的模块。 Error loading "D:\Program Files\anaconda3\envs\testenv\Lib\site-packages\torch\lib\fbgemm.dll" or one of its dependencies. 2、…...

uniapp粘贴板地址识别

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…...

C语言 | Leetcode C语言题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; bool isSelfCrossing(int* distance, int distanceSize){if (distance NULL || distanceSize < 4) {return false;}for (int i 3; i < distanceSize; i) {if ((distance[i] > distance[i - 2]) && (distance[i - 1] &l…...

TypeScript学习第十三篇 - 泛型

在编译期间不确定变量的类型&#xff0c;在调用时&#xff0c;由开发者指定具体的类型。 1. 如何给arg参数和函数指定类型&#xff1f; function identity(arg){return arg; }identity(1) identity(jack) identity(true) identity([]) identity(null)定义的时候&#xff0c;无…...

工业智能网关在汽车制造企业的应用价值及功能-天拓四方

随着工业互联网的飞速发展&#xff0c;工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为制造业数字化转型的核心组件。本文将以一家汽车制造企业的实际使用案例为蓝本&#xff0c;深入解析工业智能网关在实际应用中的价值、功能及其实操性。 一、背景与挑…...

LLM - 在服务器中使用 Ollama + OpenWebUI 部署最新大模型

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140992533 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Ollama 是一个开源的大型语言模型(LLM)服务工具,目的是简化本地运行…...

重启人生计划-积蓄星火

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 如果你觉得这个【重启人生…...

广州商城网站建设报价/友情链接源码

目录1.算术指令1.1 比较指令1.算术指令 作用&#xff1a;对两个操作数栈上的值进行某种特定运算&#xff08;加减乘除等&#xff09;&#xff0c;并且把结果重新压入操作数栈。分类&#xff1a;大体上可以分为对整数数据进行运算的指令和对浮点数进行运算的指令。对于byte、sh…...

做网站开发的笔记本配置/平台优化

string &#xff1a;关键字 String &#xff1a;类 可以认为string 是String的别名&#xff0c;在生成的IL中&#xff0c;都是当做String&#xff0c;类似的还有 object 与Object&#xff0c;int 与 Int32 转载于:https://www.cnblogs.com/nzbbody/archive/2012/01/06/2314170.…...

河北建设集团网站/软件制作

1. 问题描述 使用 Iris 数据集&#xff0c;在一个 figure 中绘制出右侧的 16 个子图。 分别使用花瓣长度、花瓣宽度、花萼长度和花萼宽度这四种数据&#xff0c;两两组合&#xff0c;形成散点。 找一组自己感兴趣的真实数据&#xff0c;绘制出饼图。并看看数据的项数在什么范围…...

wordpress和vue哪个好/网站定制开发

[收集]DotNetNuke(DNN)学习和应用资源合集 在想解决任何问题之前&#xff0c;请看看DNN的官方文档有没有答案。DNN官方文档&#xff1a;http://jaist.dl.sourceforge.net/sourceforge/dnn/DotNetNuke_4.4.1_Docs.zipDNN官方安装程序和官方模块下载&#xff08;如果去DNN官网下…...

网站建设 教程/百度关键词怎么优化

Arduino开发环境搭建 获取Arduino IDE开发工具 下载地址 &#xff1a;http://arduino.cc/en/Main/Software 可以下载release 版、Beta版和前期版本 Arduino的开发性&#xff0c;支持源码下载 支持的平台有 Windows、MAC OS X、Linux Windows 平台上面 Arduino IDE下载后为zip包…...

推荐网站在线看兄弟们/广州疫情最新动态

2019独角兽企业重金招聘Python工程师标准>>> 一、框架原理 sqlMapConfig.xml&#xff1a;(是mybatis的全局配置文件&#xff0c;名称不固定的)配置了数据源、事务等mybatis运行环境 mapper.xml&#xff1a;配置sql语句 SqlSessionFactory&#xff1a;&#xff08;会…...