TCP重传、滑动窗口、流量控制、拥塞控制机制

news/2024/8/27 0:11:09/ 标签: tcp/ip, 网络, 服务器

目录

  • 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.ppmy.cn/news/1475747.html

相关文章

观察者模式的实现

引言:观察者模式——程序中的“通信兵” 在现代战争中,通信是胜利的关键。信息力以网络、数据、算法、算力等为底层支撑,在现代战争中不断推动感知、决策、指控等各环节产生量变与质变。在软件架构中,观察者模式扮演着类似的角色…

Leetcode3202. 找出有效子序列的最大长度 II

Every day a Leetcode 题目来源:3202. 找出有效子序列的最大长度 II 解法1:动态规划 本题是选与不选的子序列问题,可以尝试给出这样的状态定义: dp[i][j]:以 nums[i] 结尾模 k 后值为 j 的最长子序列的长度。 那么…

Ubuntu 安装配置与调优 Docker 并支持 IPv6

今天,我们将在三丰云这款不错的免费云服务器上进行 Docker 部署和调优测试。三丰云的免费云服务器配置为:1核CPU、1G内存、10G硬盘和5M带宽。对于一个免费的服务来说,这样的配置已经相当给力了,特别适合我这种需要随时随地进行测试…

python数据可视化(6)——绘制散点图

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 Python绘制散点图查看BMI与保险费的关系 散点图: 用两组数据构成多个坐标点,考察…

加密软件|让数据传输更安全

加密软件在当今数字化时代扮演着至关重要的角色,它们通过先进的加密算法和技术,确保数据在存储、传输和分享过程中的安全性,从而保护个人隐私和企业机密。一、加密软件的基本作用数据加密:加密软件通过应用复杂的加密算法&#xf…

解决npm install 安装报错记录贴

前言 环境背景 nodeJS v.14.8.3(nvm安装) package.json: “node-sass”:“8.0.0” 网络环境: 公司内网 镜像地址:公司的镜像源 解决报错过程: 1.换了最新版 vscode, 然后重装 node_modules 还是不行, 报PostCSS rec…

2024Datawhale AI夏令营---基于术语词典干预的机器翻译挑战赛--学习笔记

#Datawhale #NLP 1.背景介绍: 机器翻译(Machine Translation,简称MT)是自然语言处理领域的一个重要分支,其目标是将一种语言的文本自动转换为另一种语言的文本。机器翻译的发展可以追溯到20世纪50年代,经历…

RABBITMQ的本地测试证书生成脚本

由于小程序要求必须访问wss的接口,因此需要将测试环境也切换到https,看了下官方的文档 RabbitMQ Web STOMP Plugin | RabbitMQ里面有这个信息 然后敲打GPT一阵子,把要求输入几个来回,得到这样一个脚本: generate_cer…

C语言 ——— 调试的时候如何查看当前程序的变量信息

目录 调试前/后的调试窗口 ​编辑 调试窗口 --- 监视 调试窗口 --- 内存 调试窗口 --- 调用堆栈 调试前/后的调试窗口 调试前的调试窗口: 调试前的调试窗口是没有显示的,只有在调试的时候才会有相对应的调试窗口 调试后的调试窗口&#xff1a…

Git的命令使用与IDEA内置git图形化的使用

Git 简介 Git 是分布式版本控制系统,它可以帮助开发人员跟踪和管理代码的更改。Git 可以记录代码的历史记录,并允许您在不同版本之间切换。 通过历史记录可以查看: 进行了哪些更改?谁进行了更改?何时进行了更改&#…

ARM架构(一)—— ARMV8V9基础概念

目录 1.ARMCore的时间线2.ARM术语小结2.1 A64和arrch642.2ARM架构现在的5个系列2.3 微架构2.4 PE2.5 Banked2.6 ARM文档术语2.7 IMPLEMENTATION DEFINFD 和 DEPRECATED2.8 EL1t和EL1h 3 ARMv7的软件架构4 安全状态切换模型4.1 Secure state和Non-secure state介绍 5 Interproce…

深入理解I/O模型

目录 一、I/O 模型简介 二、I/O 模型 2.1 同步阻塞 I/O 2.2 同步非阻塞I/O 2.3 I/O多路复用 2.4 异步I/O 2.5 信号驱动 I/O 三、总结 一、I/O 模型简介 所谓的 I/O 就是计算机内存与外部设备之间拷贝数据数据的过程。有 5 中 I/O 模型,分别是同步阻塞 I/O、同步…

细说MCU用定时器控制ADC采样频率的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、 建立工程 1.选择时钟源和Debug模式 2.配置系统时钟和ADC时钟 3.配置串口 4.配置ADC 5.设置TIM3 6.设置TIM4 7.配置中断 8.GPIO 四、代码修改 1.重新定义ADC回调函数 2.在主程序中编写数据发送代码 3.使能ADC和…

云端日历同步大师:iCloud让工作与生活井井有条

云端日历同步大师:iCloud让工作与生活井井有条 在快节奏的现代生活中,无论是工作还是个人生活,我们都需要一个可靠的日历应用来帮助我们管理日常事务和重要事件。iCloud作为苹果公司提供的云服务,其日历应用(Apple Ca…

PyMuPDF 包读取pdf文档时,span里的flags属性代表什么

在 PyMuPDF(也称为 fitz)库中,flags 属性表示文本的格式化信息。flags 是一个整数,它包含了不同位(bits)的标志,每个位代表文本的一种属性。这些标志位可以组合在一起表示复杂的文本格式。 具体…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(三)-机上无线电接入节点无人机

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…

记一次使用vue连接rabbitMq

连接rabbitMq需要使用stompjsnpm i stompjs 下下面是连接代码 import Stomp from stompjsonConnected(frame) {// 绑定交换机exchange_pushmsg是交换机的名字rk_pushmsg是绑定的路由keyvar exchange this.rabbitMqexchange || queue.device.zzzz// 创建随机队列用上面的路由k…

神经网络替代密度泛函理论!清华研究组发布通用材料模型 DeepH,实现超精准预测

在材料设计中,了解其电子结构与性质是预测材料性能、发现新材料、优化材料性能的关键。过去,业界广泛使用密度泛函理论 (DFT) 来研究材料电子结构和性质,其实质是将电子密度作为分子(原子)基态中所有信息的载体&#x…

【Python】sklearn教程

1. sklearn库介绍 sklearn是 Python 中一个非常重要的机器学习库,全称为scikit-learn。它是基于Python语言的机器学习工具,提供了一系列简单高效的机器学习算法。sklearn库通常与NumPy和SciPy库一起使用,用于数据预处理、特征选择、模型训练…

无人机之遥控器分类篇

一、传统遥控器 传统无人机遥控器一般包括开关键、遥控天线等基础装置。但是会随着无人机具体的应用和功能而开发不同的按键。它的信号稳定性远超对比其他遥控,而且遥控距离也更远(一般遥控范围在100米或以上)传统遥控器对于初学者来说比较难…