TCP--拥塞控制

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。

TCP中另一个重要的点就是拥塞控制,TCP是无私的当它感受到网络拥堵了,就会降低自己的发送速率。

前言

有人说?我们有流量控制了,为什么还要有拥塞控制。因为流量控制只保证了数据不会超过接收窗口的缓存大小,但是TCP是感受不到网络的拥堵状态的。当网络拥堵了(比如接收端迟迟收不到ACK),发送端就会一直重传,导致网络更加拥堵,然后就是个恶性循环了。


拥塞控制有4个经典的算法。

  • 慢启动
  • 拥塞避免
  • 快速重传
  • 快速恢复

一、慢启动

首先就是慢启动。
在慢启动的状态,cwnd(拥塞窗口)会被初始化为1个MSS(MSS介绍见下图)。
MTU和MSS.webp
发送端每次接收到一个ACK,cwnd就会增加一个MSS,并且发送两个最大长度的报文段,然后这两个报文段收到确认,cwnd就又会增加两个MSS。这样就相当于每经过1个RTT(不考虑发送时延),cwnd就会翻倍,以2的指数级增长。
TCP慢重传.webp


那什么时候结束指数增长呢?
发送端会维护一个ssthresh(慢启动阈值),为了放置cwnd增长过大引起网络拥塞。

  • 发生了阻塞(丢包了等等)

发送端会将ssthresh设置为当前cwnd值的一半,然后将cwnd设置为1,重新开始慢启动。
(ssthresh = cwnd / 2,cwnd = 1)。

  • cwnd==ssthresh

发送端会结束慢启动进入拥塞避免模式(下文介绍)。

  • 检测到3个冗余ACK

TCP会执行快速重传,然后进入快速恢复状态。


别看它这名字里面有个慢字,其实它是指数上升的。

二、拥塞避免

拥塞避免采取了一种保守的方式来提升cwnd,每个RTT才将cwnd的值加1,也就是1、2、3这样的线性增长。


当网络出现拥塞的时候
发送端会将ssthresh设置为当前cwnd值的一半,然后将cwnd设置为1。
这样就是为了减少数据的发送量,让路由器缓存中的数据先发送发送。
现在看来无论是慢启动状态还是拥塞避免状态,只要网络拥塞了,发送端会将ssthresh设置为当前cwnd值的一半,然后将cwnd设置为1。
下图是慢启动和拥塞避免算法的一个曲线图。
慢启动和拥塞避免.webp




但是这样设置(暴力的将ssthresh=cwnd/2)有点弊端,就是比如说两个相同的拥塞窗口中,丢包的比例不一样,如果都将ssthresh设置为当前cwnd值的一半太过暴力。比如说下面这种情况。
RFC弊端.webp
像上图这种情况两个拥塞窗口都是16MSS,但是丢包的比例不一样。按正常思维来说应该第一个丢包比例少的设置的ssthresh应该大点。但是如果按照上面那种两个都是cwnd/2,就有点问题。
由此Westwood算法产生了,当丢包很轻微时,由于Westwood能估算出当前拥塞并不严重,所以不会大幅度减少临界窗口值,传输速度得以保持。更多的关于Westwood算法的这里没有写,有可能以后我会补充上。\

三、快速重传

快速重传是基于数据的一种重传方式。
快速重传.webp
服务端每次收到数据后,就会返回一个ACK(确认序列号)表示下次希望收到的数据的序号,并且表示该序号之前的数据都已经成功接受。

TCP默认是累计确认机制,当中间有包乱序到达了,TCP只会反复确认最后一个按序到达的数据,TCP只能知道下一个数据没有按时达到,之后的数据怎么样了并不知道。

如图所示,第二个数据丢失了,服务端一直返回ACK2(因为一直没有收到第二个数据),当客户端收到3次同样的ACK后,客户端就会重传丢失的那个数据。然后服务端传回一个ACK6,表示6之前的数据都已经成功接受了。客户端收到3个相同的ACK后,就在超时重传时间之前进行重传。


但是这样还是有个问题,就是重传的时候,是重传一个数据,还是重传所有数据呢。
比如说数据2、3都丢失了,因为ACK只能表示下一次应该重传的一个数据,不能表示多个数据,所以即便数据3也丢失了,它依然是返回ACK2。
如果重传2号数据,那3号数据也丢失了。如果都重传一次,显然是一次不必要的资源浪费。
这就得看SACK了,关于SACK具体详看我的另一篇博客。

四、快速恢复

当接收方收到3个相同的ACK的时候,发送端会认为网络已经拥塞,会进入快速恢复状态,发送端会将ssthresh设置为当前cwnd的一半,然后cwnd设置为一半然后再加三。(ssthresh = cwnd / 2,cwnd = cwnd / 2 + 3)。
但是之后不进行慢启动,之后执行拥塞避免算法。

慢恢复.webp

TCP Tahoe 和 TCP Reno

TCP也是在不断迭代的,最早的TCP版本叫做TCP Tahoe,目前使用最广泛的版本是TCP Tahoe。

ssthresh设置为当前cwnd的一半,然后cwnd设置为一半然后再加三
TCP Tahoe版本中,拥塞算法只有三个,慢启动、拥塞避免、快速重传。在收到3个重复的ACK时候,将ssthresh设置为当前cwnd的一半,然后cwnd设置1(进入慢启动)。(ssthresh = cwnd / 2, cwnd = 1)。
早期TCP拥塞控制.webp
TCP Tahoe版本中,拥塞算法在原来的基础上增加了一个快速恢复,就是在收到3个重复的ACK时候,发送端将ssthresh设置为当前cwnd的一半,然后cwnd设置为一半然后再加三。(ssthresh = cwnd / 2,cwnd = cwnd / 2 + 3)。

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

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

相关文章

字节码进阶之javassist字节码操作类库详解

字节码进阶之javassist字节码操作类库详解 文章目录 前言使用教程添加Javassist依赖库创建和修改类方法拦截创建新的方法 进阶用法创建新的注解创建新的接口创建新的构造器生成动态代理修改方法示例2 前言 Javassist(Java programming assistant)是一个…

磁盘分区如何分? 电脑磁盘分区免费软件指南!

列出并比较顶级免费磁盘分区管理器软件,以选择适用于 Windows 的最佳分区软件: 系统分区在现代计算机设备中起着非常重要的作用。它们可以存储数据,使系统文件远离用户数据,并在同一台设备上安装多个操作系统。但是,这…

订单正向链路压测

这次压测会对正向链路中的生订单号、生成订单、预支付、支付回调四个接口做压测,其他接口或逆向接口并发要求不高,所以不做压测。 1、100并发压测4核8G(初步压测,看代码是否有问题) 压测结果:可以看到&am…

网络协议--IP选路

9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生,也可以由其他主机产生。在后一种情况下,主机必须配置成一个路由器,否则通过网络接口接收到的数据报,如果目的地址不…

python接口自动化测试(单元测试方法)

一、环境搭建 python unittest requests实现http请求的接口自动化Python的优势:语法简洁优美, 功能强大, 标准库跟第三方库灰常强大,建议大家事先了解一下Python的基础;unittest是python的标准测试库,相比于其他测试框架是python目前使用最广…

MySQL -- 库和表的操作

MySQL – 库和表的操作 文章目录 MySQL -- 库和表的操作一、库的操作1.创建数据库2.查看数据库3.删除数据库4.字符集和校验规则5.校验规则对数据库的影响6.修改数据库7.备份和恢复8.查看连接情况 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、库的操作 注意&#xf…

蓝桥杯中级题目之组合(c++)

系列文章目录 数位递增数_睡觉觉觉得的博客-CSDN博客拉线开关。_睡觉觉觉得的博客-CSDN博客蓝桥杯中级题目之数字组合(c)_睡觉觉觉得的博客-CSDN博客 文章目录 系列文章目录前言一、个人名片二、描述三、输入输出以及代码示例1.输入2.输出3.代码示例 总…

muduo异步日志库

文章目录 一、日志库模型1.前端 参考 一、日志库模型 组成部分 muduo日志库由前端和后端组成。 muduo日志库是异步高性能日志库,其性能开销大约是前端每写一条日志消息耗时1.0us~1.6us。 采用双缓冲区(double buffering)交互技术。基本思…

蛇口街道小区长者服务示范点 ——在家门口“乐享晚年”

2023年9月28日,深圳市南山区蛇口街道创建健康街道行动之“老年肌少症免费筛查”项目走进了海昌社区,为数十位长者开展了系统筛查。在家门口就能够享受到由蛇口医院康复科医生提供的专业服务,这对于小区的老人们来说还是第一次。自今年7月以来…

【红日靶场】vulnstack5-完整渗透过程

系列文章目录 【红日靶场】vulnstack1-完整渗透过程 【红日靶场】vulnstack2-完整渗透过程 【红日靶场】vulnstack3-完整渗透过程 【红日靶场】vulnstack4-完整渗透过程 文章目录 系列文章目录描述虚拟机密码红队思路 一、环境初始化二、开始渗透外网打点上线cs权限提升域信息…

图(graph)的遍历----深度优先(DFS)遍历

目录 前言 深度优先遍历(DFS) 1.基本概念 2.算法思想 3.二叉树的深度优先遍历(例子) 图的深度优先遍历 1.图(graph)邻接矩阵的深度优先遍历 思路分析 代码实现 2.图(graph)邻接表的深度优先遍历 思路分析 代码实现 递…

京东数据分析:2023年9月京东洗烘套装品牌销量排行榜!

鲸参谋监测的京东平台9月份洗烘套装市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年9月份,京东平台洗烘套装的销量为7100,环比下降约37%,同比增长约87%;销售额为6000万,环比下降约48%&#…

Rust-后端服务调试入坑记

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括:Rust,Javascript。关注我,我会通过这个项目的开发给大家带来相关实战技术的分享。 如果你关注过我的Rust 实战里…

Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现

可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个全文搜索引擎,它还提供了分布式的多用户能力,实时的分析,以及对复杂搜索语句的处理能力,使其在众多场景下,如企业搜索,日志和事件数据分析等…

后台交互-首页->与后台数据进行交互,wsx的使用

与后台数据进行交互wsx的使用 1.与后台数据进行交互 // index.js // 获取应用实例 const app getApp() const apirequire("../../config/app.js") const utilrequire("../../utils/util.js") Page({data: {imgSrcs:[{"img": "https://cd…

ROI的投入产出比是什么?

ROI的投入产出比是什么? 投入产出比(Return on Investment, ROI)是一种评估投资效益的财务指标,用于衡量投资带来的回报与投入成本之间的关系。它的计算公式如下: 投资收益:指的是投资带来的净收入&#x…

科学指南针iThenticate自助查重系统重磅上线

科学指南针,一直致力于为科研工作者提供高效、专业的学术支持,近日推出了全新的iThenticate自助查重系统。这一系统的上线,旨在为广大科研工作者提供更加便捷、准确的论文查重服务,进一步规范英文使用,提升科研质量。 …

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具,并且其发展非常迅速。其中,TensorFlow 和 PyTorch 脱颖而出,各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢?本综合指南[1]旨在阐明它们的优点和…

WebService SOAP1.1 SOAP1.12 HTTP PSOT方式调用

Visual Studio 2022 新建WebService项目 创建之后启动运行 设置默认文档即可 经过上面的创建WebService已经创建完成,添加HelloWorld3方法, [WebMethod] public string HelloWorld3(int a, string b) { //var s a b; return $"Hello World ab{a …

机器学习中的核方法

一、说明 线性模型很棒,因为它们易于理解且易于优化。他们受苦是因为他们只能学习非常简单的决策边界。神经网络可以学习更复杂的决策边界,但失去了线性模型良好的凸性特性。 使线性模型表现出非线性的一种方法是转换输入。例如,通过添加特征…