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

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

TCP重传机制:

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

通过序列号与确认应答判断是否要重传

超时重传:
超过指定时间没有收到确认应答报文,就会重发该数据

触发超时重传的情况:

  • 数据包丢失
  • 确认应答丢失

RTT:数据发送时刻到接受到确认的时刻的差值 包的往返时间

RTO:超时重传时间

RTO太长或太短:

  • 太长,效率差,重发慢,丢了半天才重发,性能差
  • 太短:没有丢就重发,增加网络拥塞,导致更多的超时

超时重传时间RTO的值应该略大于报文往返RTT的值

如果超时重发的数据,再次超时的时候,又需要重传,TCP的策略是超时间隔加倍

也就是每次遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁发送

超时重传缺点:

超时周期长,用快速重传机制来解决

快速重传

不以时间为驱动,而是以数据驱动重传

当收到三个相同的ACK报文,会在定时器过期之前,重传丢失的报文段

缺点:不知道重传一个,还是重传所有的问题

于是有了SACK方法:选择性确认

在TCP头部加一个SACK,可以将已收到的数据的信息发送给发送方

这样就可以知道哪些数据接收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相当于是快速重传知道了该重传一个还是全部

D-SACK

使用SACK来告诉发送方有哪些数据被重复接受了

D-SACK的作用:

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

滑动窗口:

上面的传输方式有一个缺点:数据往返时间越长,通信的效率就越低

窗口就是指无需等待确认应答,而可以继续发送数据的最大值

窗口实质上是一个缓存空间,发送发主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据,如果收到确认应答,此时数据就可以从缓存区清除

确认应答报文丢也没事,可以累计确认,累计应答

窗口大小:
通常是由接收方的窗口大小来决定的

否则接收方可能无法正常接收到数据

发送方的滑动窗口:

有四部分:

  • 1 是已发送并收到ACK确认的数据
  • 2是已发送但未收到ACK确认的数据
  • 3 是未发送但总大小在接受方处理范围内
  • 4是未发送但总大小超过接收方处理范围

当发送方把数据全部都发送出去,可用窗口3 为0 在未接到ACK之前无法发送数据

接收方的滑动窗口

三部分:

  • 已经成功接受并确认的数据(等待应用进程读取)
  • 未收到数据但可以接收的数据
  • 未收到数据并不可以接受的数据

接收窗口和发送窗口的大小是相等的吗?

并不完全相等,接受窗口的大小约等于发送窗口的大小的

流量控制:
TCP提供一种机制可以让发送方根据接收方的实际接受能力控制发送的数据量,这就是所谓的流量控制

先发一部分比如80,再发一部分比如120,然后发送方的可用窗口为0了,然后等待80的确认报文,

操作系统缓冲区和滑动窗口的关系:
发送窗口和接受窗口中所存放的字节数,都是放在操作系统内存缓冲区中的,而操作系统的缓冲区,会被操作系统调整

为了避免丢包:TCP规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存

当应用程序没有及时读取缓存时,发送窗口和接收窗口

根据流量控制,发送方随着接收方的窗口逐渐减小,直到最后两个窗口减小为0 窗口关闭

数据丢包的发生是因为:当服务器资源紧张的时候,操作系统直接减少了接收缓冲区的大小,这是应用程序无法及时读取缓存数据

TCP是通过让接收方指明 希望从发送方接受的数据大小(窗口的大小)来进行流量控制

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

但是这里存在一个问题:如果接收方向发送方发送的窗口非0的ACK报文,丢失,那么会造成死锁

TCP如何解决窗口关闭时,潜在的死锁现象

TCP,为每一个连接设有一个持续定时器:只要TCP链接一方收到对方的零窗口通知,就启动计时器

这样即使是非0ACK丢失,计时器超时之后依然会发送窗口探测报文,相当于是双保险

糊涂窗口综合症:

如果接收方腾出几个字节并告诉发送方现在有几个字节的窗口,而发送方会义无反顾的发送这几个字节

相当于开公交车送1个人,造成资源的浪费

解决办法:接收方满足不通知小窗口给发送方,发送方开启Nagle算法(延时处理)

拥塞控制

避免「发送方」的数据填满整个网络。

拥塞窗口:发送方维持的一个状态,根据网络拥塞个程度动态变化的

变化规则:

  • 只要网络中没有出现拥塞,cwnd就会增大
  • 但是如果出现拥塞,cwnd就会减少

如何判断是否出现拥塞 :
只要发送了超时重传就认为出现了拥塞

拥塞控制的四个算法

  • 慢启动
  • 拥塞避免
  • 拥塞发生
  • 快速恢复

慢启动:一点一点提高发送的数据包

当发送方每收到一个ACK,拥塞窗口大小+1

20 21 22 23 24

1 2 4 8 16

当拥塞窗口的大小大于慢启动门限的时候使用拥塞避免算法

拥塞避免算法:

每当收到一个 ACK 时,cwnd 增加 1/cwnd

8 9 10 11 12

拥塞避免算法将指数增长变成线性增长

然后慢慢增长之后会出现拥塞,出现丢包,超时重传了

就进入了拥塞发生算法

当发生了「超时重传」,则就会使用拥塞发生算法。

直接开始慢启动,一夜回到解放前,并且更新慢启动门限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发生快速重传的拥塞发生算法:

拥塞窗口大小变为原来一半

进入快速恢复算法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还会维持在比较高的值,后续呈线性增长

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

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

相关文章

(十四)Servlet教程——Servlet中HttpSession的使用

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,相应地也增加了服务器的存储压力。 1. 什么是Session Session是另外一种记录客户端状态的机制,不同的是Cookie保存在客户…

2024年618哪些数码家电值得入手?热门家电好物抢先看!

618购物狂欢节即将来临,这是一年一度的大促销活动,家电和数码产品在这个时间段内通常都会有优惠和折扣。但随着产品的多样化,很多时候一款产品就有多款品牌,在这不同品牌又各自擅长不同的东西,看着眼花缭乱。今天我就给…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Java中优雅实现泛型类型的强制转换

在Java中经常遇到将对象强制转换成泛型类的情况&#xff1a; Map<String, Object> data Map.of("name", "XiaoMing","age", 17,"scores", List.of(80, 90, 70) );List<Integer> scores (List<Integer>) data.get…

Docker容器添加修改端口映射的方法与详细步骤

1、先找到要修改的容器hash值&#xff1a; 2、然后退出docker Desktop服务 &#xff08;因为在线状态配置文件修改保存不了&#xff09; 3、资源管理器中打开最新安装的Docker的配置文件的路径&#xff1a; 4、打开后修改其中的 config.v2.json 和 hostconfig.json 5、启动…

【C++】哈希表的底层逻辑

目录 一、哈希概念 1、哈希冲突 2、哈希冲突的解决 a、闭散列 &#x1f7e2;插入 &#x1f7e2;查找 &#x1f7e2;删除 &#x1f7e2;其他类型的数据 &#x1f7e2;实现 b、 开散列 &#x1f7e2;插入 &#x1f7e2;查找 &#x1f7e2;删除 &#x1f7e2;析构 &a…

《霍格沃茨之遗》找不到emp.dll如何修复?分享5种亲测有效的方法

在我们享受电脑游戏带来的乐趣时&#xff0c;偶尔会遇到一些技术上问题&#xff0c;具体来说&#xff0c;当你启动一款游戏&#xff0c;系统却弹出一个提示“由于找不到emp.dll文件&#xff0c;因此无法继续执行代码”&#xff0c;这样的情况确实让人感到扫兴。这究竟是什么原因…

.net core ef 连表查询

Information和TypeInfo连表查询 类似&#xff1a; select st.Title1,si.* from [Star_Information] si left join Star_TypeInfo st on si.typeId2st.id 先在EfCoreDbContext.cs配置 protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(b…

Jupyter Notebook 中使用虚拟环境的Python解释器

问题&#xff1a;创建虚拟环境&#xff0c;在pycharm中配置虚拟环境的Python解释器&#xff0c;然后在pycharm中打开ipynb&#xff0c;执行发现缺少包&#xff0c;但是虚拟环境中已经安装了 解决方式&#xff1a; 配置Jupyter Notebook 使用虚拟环境的Python解释器 1&#x…

ElasticSearch总结2

一、创建索引库&#xff1a;PUT ES中通过Restful请求操作索引库、文档。请求内容用DSL语句来表示。创建索引库和mapping的DSL语法如下&#xff1a; 整个jason 里边&#xff0c;它有一个叫mapping的属性&#xff0c;代表的是映射。映射里边有properties代表就是字段。可以看到这…

C++入门系列-缺省参数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 缺省参数的概念 缺省参数是生命或者定义函数时为函数的参数指定一个缺省值&#xff0c;在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用…

一单利润100+,不起眼的小生意,却能闷声发财!

今天&#xff0c;我想向大家介绍一个看似不太热门&#xff0c;但实际上需求很高的项目——酒店代订。这个项目其实很早以前就已经有人开始尝试了&#xff0c;但可能并没有被大众所熟知。简而言之&#xff0c;酒店代订就是帮助他人通过我们来预订他们想要入住的酒店。 当客户将…

ThinkPHP5 SQL注入漏洞敏感信息泄露漏洞

1 漏洞介绍 ThinkPHP是在中国使用极为广泛的PHP开发框架。在其版本5.0&#xff08;<5.1.23&#xff09;中,开启debug模式&#xff0c;传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c…

Allegro如何将铜皮复制到其他层

如何将铜皮复制到其他层 方法一&#xff1a; 第一步&#xff1a;选择需要复制的铜皮&#xff0c;然后按下CtrlC 第二步&#xff1a;选择要粘贴到的层面&#xff0c;然后按Ctrl V 将在所在层面创建一个新的铜皮&#xff0c;几何形状与原铜皮完全一样 方法二&#xff1a; 第一…

基于SSM的个人博客系统(二)

目录 第四章 系统设计 4.1 系统总流程 4.2 博主用例 4.3 游客用例 4.4 系统类 一、博客类 二、博客类型类 三&#xff0c;评论类&#xff1a; 四&#xff0e;友情链接类 4.5 E-R图 4.6 系统表设计 前面内容请移步 基于SSM的个人博客系统&#xff08;一&#xff09;…

docker mysql更新升级版本

一、环境说明 操作系统&#xff1a;Centos7 数据库版本&#xff1a;MySql 8.0.22 数据库中数据量不大&#xff0c;处于开发/测试环境&#xff0c;风险较低 二、升级原因 升级是因为测评漏洞&#xff0c;在进行国家三级等级保护测评过程中&#xff0c;漏扫发现多个MySql漏洞…

(十五)Servlet教程——Servlet文件上传

JSP和HTML标签一起使用&#xff0c;来允许用户把文件上传到服务器。 首先我们需要创建一个前端界面&#xff0c;创建上传文件表单时&#xff0c;需要注意以下几点&#xff1a; (1) 表单的method属性必须设置为POST方法&#xff0c; 不能使用GET方法。 (2) 表单enctype属性应该…

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

2.2 前言 关于Unity面试题相关的所有知识点&#xff1a;&#x1f431;‍&#x1f3cd;2023年Unity面试题大全&#xff0c;共十万字面试题总结【收藏一篇足够面试&#xff0c;持续更新】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理…

19 做好微服务间依赖的治理和分布式事务

在前两讲里&#xff0c;分别从微服务的对外接口、消息消费以及微服务自身的相关编码规范上阐述了“防备上游、做好自己”这两个准则如何落地。 在本讲里&#xff0c;将会讲解为什么要“怀疑下游”&#xff0c;以及有哪些手段可以落地此条准则。此外&#xff0c;还会介绍在进行…

基于SSM的个人博客系统(三)

目录 第五章 系统实现 5.1 登录模块 5.1.1 博主登录 5.2 博客管理模块&#xff1a; 5.2.1 博客查询 5.2.2 博客新建 5.2.3 博客修改 5.2.4 博客删除 5.3 博客类别管理模块 前面内容请移步 基于SSM的个人博客系统&#xff08;二&#xff09; 个人博客系统的设计…
最新文章