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

news/2024/4/29 4:42:27/文章来源:https://blog.csdn.net/weixin_50911232/article/details/126911476

重传机制

  • 超时重传
  • 快速重传
  • SACK
  • D-SACK

超时重传

RTT 就是 数据从网络一端传送到另一端所需要的时间,也就是包的往返时间。

超时重传时间以 RTO 表示,应该略大于RTT。

如果超时重发的数据,再次超时时有需要重传,TCP的策略是超时间隔加倍。也就是每当遇到一次超时重传时,都会将下一次超时时间间隔设为之前的两倍。两次超时,就说明网络环境差,不宜频繁发送。

弊端:超时重传的周期相对长,更快的方法是快速重传。

快速重传

快速重传机制,不以时间为驱动,而是以数据驱动重传。

发送端收到了3个ACK=2的确认,知道了Seq2还没有收到,就会在定时器过期之前,重传丢失的Seq2。

所以,快速重传的工作方式是当收到三个相同ACK报文时,会在定时器之前过期,重传丢失的报文段。

问题:重传的时候,是重传之前的一个,还是重传所有的问题。

SACK 方法

SACK (选择性确认)

在TCP头部[选项]字段里加一个SACK的东西,它可以将缓存的地图发送给对方,发送方就知道哪些数据收到哪些没收到,只重传丢失的数据。

D-SACK

主要是用SACK来告诉发送方有哪些数据被重复接受了。

D-SACK有这么几个好处:

  1. 可以让发送方知道,是发出去的包丢了,还是接收方回应的ACK包丢了。
  2. 可以知道是不是 发送方的数据包被网络延迟了;
  3. 可以知道网络中是不是把发送方的数据包复制了

滑动窗口

以往的传输方式是 发一个,回应一次,才能继续发。这样的缺点是往返时间长,通信效率低。

为解决这个问题,引入窗口的概念,即使在往返时间较长的情况下,它也不会降低网络通信的效率。窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。

  • 发送窗口
  • 接受窗口

流量控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yv6gj1wI-1663423189830)(C:\Users\chenzhengchang\AppData\Roaming\Typora\typora-user-images\image-20220917174123355.png)]

为了解决这种现象发⽣,TCP 提供⼀种机制可以让「发送⽅」根据「接收⽅」的实际接收能⼒控制发送的数据量, 这就是所谓的流量控制。

  • 操作系统缓冲区与滑动窗口的关系
  • 窗口关闭
  • 糊涂窗口综合症

操作系统缓冲区与滑动窗口的关系

实际上,发送窗口和接受窗口所存放的字节数,都是放在操作系统的内存缓冲区中的,而操作系统的缓冲区,会被操作系统调制。

操作系统的缓冲区是如何影响发送窗口和接收窗口的呢?

两个例子

  • 假设服务端作为接收端,服务端非常繁忙,收到客户端的数据时,应用层不能及时读取数据,最终客户端收到确认和窗口报文后,发送窗口减少为0.
  • 当服务端系统资源非常紧张时,可能会直接减小接收缓冲区大小,这时应用程序又无法及时读取缓存数据,这样就会出现数据包丢失的现象。

所以,如果发生了先减少缓存,再收缩窗口,就会出现丢包现象。

为了防止这种情况,TCP规定不允许同时减少缓存又收缩窗口,而是先收缩窗口,果断时间再减小缓存。

窗口关闭

如果窗口大小为0,就会阻止发送方给接收方传递数据,直到窗口变为非0,这就是窗口关闭。

窗口关闭潜在危险

当发送窗口关闭,接收方处理完数据后,会向发送方发送一个窗口非0的ACK报文,如果这个报文丢失,那么将会形成死锁。

解决方法

TCP为每个连接设有一个持续定时器,只要TCP连接的一方收到零窗口通知,就启动持续定时器。定时器超时,就会发生窗口探测报文,对方确认后,就会回应。打破死锁的局面。

窗口探测一般为3次,3次过后接收窗口还是0的话,有的TCP就会发RST报文来中断连接。

糊涂窗口综合症

当发送窗口越来越小时,如果接收⽅腾出⼏个字节并告诉发送⽅现在有⼏个字节的窗⼝,⽽发送⽅会义⽆反顾地发送这⼏个字节, 这就是糊涂窗⼝综合症。

现象来源:

  • 接收方可以通告一个小窗口
  • 发送方可以发送小数据

解决方法

  1. 当窗口大小小于 min(MSS,缓存空间/2),也就是小于MSS与1/2缓存大小中的最小值时,就会向发送方通告窗口为0,阻止对方发数据。等接收方处理了一些数据,满足条件后再打开窗口。
  2. 使用Nagle算法,延时处理数据,避免发送方发送小数据。

拥塞控制

与流量控制的区别

前面的流量控制是避免 [发送方] 的数据填满 [接收方] 的缓存,但是并不知道网络中发生了什么。

在网络出现拥堵时,如果继续发生大量数据包,可能会导致数据包时延,丢失等,这时TCP就会重传,一重传加重网络负担,于是更多包延迟或者丢包,形成恶性循环。

拥塞控制就是用来避免 [发送方] 的数据填满整个网络。

为了在[发送方]调节要发送数据的量,定义了一个叫做 拥塞窗口的概念。

什么是拥塞窗口?

拥塞窗口 cwnd 是发送方维护的一个状态变量,它会根据网络的拥塞程度动态变化的。

拥塞窗口cwnd的变化规则:

  • 只要网络中没有出现拥塞,cwnd就会增加;
  • 但网络中出现拥塞,cwnd就会减少;

PS:发送窗口 swnd ,接收窗口 rwnd

那么怎么知道网络是否出现拥塞?

只要[发送方]没有在规定时间内收到ACK应答报文,也就是发生了超时重传,就认为网络出现了拥塞。

拥塞控制主要是四个算法:

慢启动

慢启动算法只要记住一个规则就行:当发送方每收到一个ACK,拥塞窗口cwnd的大小就会加1。

cwnd为多大,表示可以传多大的数据。

慢启动什么时候停止

慢启动是指数增长。

有一个叫慢启动门限 ssthresh 的状态变量

  • 当cwnd< ssthresh时,使用慢启动算法
  • 当cwnd>ssthresh时,使用 拥塞避免算法

拥塞避免算法

cwnd超过 慢启动门限 ssthresh就会进入拥塞避免算法。

一般来说ssthresh的大小是65535字节。

进入拥塞算法后,它的规则是:每当收到一个ACK,cwnd增加 1/cwnd

这样就从慢启动的指数增长变成线性增长了。

但是一直增长下去,网络还是会拥塞,出现丢包现象,这时需要对丢弃的数据进行重传,当重传机制启动,也就进入了 拥塞发生算法

拥塞发生

当网络出现拥塞,也就是发生数据包重传,重传机制有两种。

  • 超时重传
  • 快速重传

这两种拥塞发生的算法是不同的。

当发生了超时重传
  • ssthresh 设为 cwnd/2;
  • cwnd = 1;

接着就开始慢启动。但是这种方法太激进了,反应很强烈,会造成网络卡顿。

还有更好的方式:快速重传

当发生了快速重传
  • cwnd = cwnd/2;
  • ssthresh = cwnd;
  • 进入快速恢复算法

快速恢复

快速恢复算法是和快速重传同时使用的。

快速恢复算法如下:

  • 拥塞窗口 cwnd =ssthresh +3 (意思是确认有3给数据包被收到了)
  • 重传丢失的数据包;
  • 如果收到重复的ACK,那么cwnd加1
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第⼀步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说 明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进 ⼊拥塞避免状态
    在这里插入图片描述

图片来着 小林coding (侵删)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9306.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[需求管理-2]:什么是需求以及需求的收集与识别

目录 第1章 什么是需求识别 第2章 需求的来源 2.1 外部需求&#xff08;收集&#xff09; 2.2 内部需求&#xff08;开发&#xff09; 第3章 需求的层次 第4章 需求的形式 4.1 提问题&#xff08;针对业务层次需求、原始性需求&#xff09;&#xff1a;第一性原理 4.2 …

视觉SLAM十四讲_4李群与李代数

本文为b站视频的一个笔记 在SLAM中&#xff0c;我们经常要解下面一个问题 FminJ(T)Σi1N∣∣zi−Tpi∣∣2F minJ(T) \Sigma_{i1}^N||z_i - Tp_i||^2FminJ(T)Σi1N​∣∣zi​−Tpi​∣∣2 这个问题中, T是位姿变量。对于求最小值问题&#xff0c;我们第一步就要求函数对于变量…

Java小白踩坑录上

文章目录1、Java小白踩坑录 - String和char2、Java小白踩坑录 - Random 揭秘3、Java小白踩坑录 - B计划之Java资源如何释放&#xff1f;4、Java小白踩坑录 - 反射到底有多慢&#xff1f;5、Java小白踩坑录 - 数组 & List6、Java小白踩坑录 - Java类型的七十二变揭秘7、Java…

IDEA生成带参数和返回值注解

文章目录步骤说明打开IDEA进入 - 设置 - 编辑器 - 活动模板现象一&#xff1a;IDEA提示悬空的注解现象二&#xff1a;IDEA提示标签说明已丢失使用范围设置注解使用步骤说明 打开IDEA进入点击左上角 - 文件 - 设置 - 编辑器 - 活动模板 新建活动模板 填写模板文本 编辑变量 …

2.canal服务器配置及java客户端

【README】 1.本文总结自 B站《尚硅谷-canal》&#xff1b; 2.canal 介绍&#xff0c;可以参考 GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 3. canal服务器配置包括 mysql配置&#xff0c;canal配置等&#xff1b; 4.mysql服务器&#xff0c;ca…

完美且简要,如此输出风控中的重要数据指标曲线(如KS等)

先前&#xff0c;我们用excel给大家演示过一个KS的计算方式。 ks值是在模型中用于区分预测正负样本分隔程度的评价指标。每个样本的预测结果化对应的一个个分数&#xff0c;从最低分到最高分&#xff0c;输出为正负样本的累积分布。Ks值为这个两个正负样本中&#xff0c;最大差…

听吧音乐项目测试

听吧音乐项目 听吧音乐测试1.项目背景2.需求分析2.1 用户需求2.2 软件需求3. 测试点分析及测试用例4. 自动化测试代码4.1 注册登录注销模块自动化测试代码4.2 专辑播放自动化测试代码5. 测试报告1.项目背景 听吧音乐是一个在线听歌网站&#xff0c;游客通过首页可以在线收听其…

WinUI 3 踩坑记:第一个窗口

本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,文中的代码也在此仓库中,若内容出现冲突以 GitHub 上的为准。WinUI 3 应用的入口和 UWP 类似,也是继承自 Application 的一个类,略有不同的是没有 UWP 那么多的启动方式可供重写,只有一个 OnLau…

python计算离散积分

前言 本文是傅立叶及其python应用系列的第一篇文章对应的仓库地址为https://github.com/yuanzhoulvpi2017/tiny_python/tree/main/Fourier_Series 介绍 本篇文章将要介绍一个非常小众的scipy函数&#xff1a;simpson. 这个函数的一大功能就是可以对离散数据积分。之所以要介…

P39 事件处理

P39 事件处理1.事件模型的流程2.事件监听器2.1 动作监听器&#xff08;ActionListener&#xff09;2.2 焦点监听器&#xff08;FocusListener&#xff09;2.3 鼠标监听器&#xff08;MouseListener&#xff09;2.4 鼠标移动/拖动监听器&#xff08;MouseMotionListener&#xf…

SpringAOP的概述与实现

目录 SpringAOP的概述 什么是AOP AOP能干什么 AOP的特点 AOP底层实现 AOP基本概念 连接点 切入点 通知 切面 目标对象 织入 引入 谈谈你对AOP的理解&#xff1f; SpringAOP的实现 依赖引用 spring.xml配置 注解实现 1.定义切面 设置通知 2.开启aop 3.测试 …

金仓数据库KingbaseES客户端编程开发框架-MyBatis(2. 概述 3. MyBatis配置说明)

2. 概述 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c; 将接口和 Java 的 POJOs(Plain Old Ja…

Sourcemap 配置详解

前言 之前在脚手架工具内整合将sourcemap上传sentry能力的时候&#xff0c;考虑bundle分割对.map文件关联的限制&#xff1a;比如TerserWebpackPlugin&#xff08;JS压缩&#xff09;只对 devtool 选项的 source-map&#xff0c;inline-source-map&#xff0c;hidden-source-m…

后端研发工程师面经——JAVA语言

文章目录2. JAVA语言2.1 面向对象的三大特性2.2 JAVA异常2.2.1 异常产生的原因2.2.2 异常的分类2.2.3 异常的处理方式2.3 序列化和反序列化2.3.1 概念2.3.2 JAVA中的序列化和反序列化2.3.3 序列化和反序列化的接口2.3.4 Serialization接口详解2.3.5 Externalizable接口详解2.3.…

3D建模师做多了女人会不会找不到老婆?次世代美少女战士建模流程讲解

什么是次世代&#xff1f; 次世代是个舶来语&#xff0c;“次世代游戏”指代和同类游戏相比下更加先进的游戏&#xff0c;即“下一代游戏”。 次世代是利用高模烘焙的法线贴图回帖到低模上&#xff0c;让低模在游戏引擎里可以及时显示高模的视觉效果。模型面数比较高&#xf…

算法 - 计数排序(Counting_Sort)

目录 引言&#xff1a; 学习&#xff1a; 什么是计数排序&#xff08;Counting_sort&#xff09;&#xff1f; 定义&#xff1a; 算法思想&#xff1a; 排序过程&#xff1a; Step 1 &#xff1a; Step 2 &#xff1a; Step 3 &#xff1a; Step 4 : Step 5 &…

单片机项目式实训总篇

采取新方法&#xff0c;让自己尽快变强&#xff0c;为了更好的再次见面。停止大脑内斗。 总学习目标&#xff1a;&#xff08;完成后此文字支持跳转&#xff09; 基础知识 端口操作 显示 高级输入 时间控制 综合 Flag: 一周破解C51程序 学习内容&#xff1a; 了解单片…

DeepExploit——当Metasploit遇上机器学习

Metasploit Meets Machine Learning 文章目录Metasploit Meets Machine Learning1. Metasploit准备1.1 与外部项目的合作1.1.1 启用RPC API1.1.2 使用RPC API操作Metasploit2. 创建机器学习模型2.1 DQN2.2 A3C2.2.1 CartPole2.2.2 分布式学习机制3. 深度利用3.1 代理任务3.2 当…

JVM——GC垃圾回收机制

文章目录JVM——GC垃圾回收机制一、如何判断哪些对象应该被回收——对象判活算法引用计数算法可达性分析算法引用最终判定二、对象应该怎么被回收——垃圾回收算法分代收集理论标记-清除算法标记-复制算法标记-整理算法三、内存对象什么时候被回收——触发条件年轻代GC(Minor G…

如期而至的SVN服务器迁移引来一个大瓜XAMPP

文章目录前言方案评估前奏XAMMP搭建svn服务准备软件包安装必要环境和工具安装xampp运行xampp编辑xampp访问xampp安装subversion安装svnmanager创建svn仓库目录修改配置文件为svnmanager创建MySQL用户重启xammp服务访问svnmanager登录svnmanager可能遇到的错误查看服务器目录信息…