TCP--拥塞控制

news2024/11/26 5:36:32

大家好,我叫徐锦桐,个人博客地址为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.coloradmin.cn/o/1122538.html

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

相关文章

【计算机网络】IP协议的相关特性

IP协议:互联网的核心组件 在当今高度数字化的世界中,互联网已成为人们生活、工作不可或缺的一部分。而在这个庞大的网络中,IP协议(Internet Protocol)作为核心的通信协议,发挥着至关重要的作用。本文将详细…

ES6有何新特性?

目录 介绍 let 和 const 解构 模板字符串 箭头函数 Set Map 介绍 ES 全称是ECMAScript,它是JavaScript基础构建的一种语言,JavaScript正是建立在ECMAScript语言的基础规范中建立使用的。ES6实际上是一个泛指,泛指ES2015及后续的版本…

【BP-Adaboost预测】基于BP神经网络的Adaboost的回归预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

20231022 - Day42 总结 Week06 周结

20231022 - Day42 总结 && Week06 周结 今日计划: 早起看JavaEE√午饭前看看复习计组√午睡前背单词√下午复习Java√晚上前跑步√晚上复习JavaEE和Java基础√睡前看英语抽空看书 今日进度: Java:上课看韩顺平老师P910&#xff0…

Linux-管道、环境变量、常用命令

文章目录 管道概念要点与文件重定向的区别 环境变量概念查看 常用命令查看系统状况权限文件查找 用户相关工具 管道 概念 管道的作用类似于文件重定向,可以将前一个命令的stout做为下一个命令的stdin 要点 管道命令进处理stdout,会忽略stderr管道右边…

【PyTorch实战演练】自调整学习率实例应用(附代码)

目录 0. 前言 1. 自调整学习率的常用方法 1.1 ExponentialLR 指数衰减方法 1.2 CosineAnnealingLR 余弦退火方法 1.3 ChainedScheduler 链式方法 2. 实例说明 3. 结果说明 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 4. …

Jenkins 相关内容

Jenkins 相关内容 什么是 Jenkins,它是如何工作的?Jenkins 中自由式项目和管道之间的区别什么是Jenkins管道,它们如何工作?第一次如何安装Jenkins并进行设置?什么是 Jenkins 插件,如何安装它们?…

中间件安全-CVE复现WeblogicJenkinsGlassFish漏洞复现

目录 服务攻防-中间件安全&CVE复现&Weblogic&Jenkins&GlassFish漏洞复现中间件-Weblogic安全问题漏洞复现CVE_2017_3506漏洞复现 中间件-JBoos安全问题漏洞复现CVE-2017-12149漏洞复现CVE-2017-7504漏洞复现 中间件-Jenkins安全问题漏洞复现CVE-2017-1000353漏…

【问题记录】解决Qt连接MySQL报“QMYSQL driver not loaded”以及不支持MySQL事务操作的问题!

环境 Windows 11 家庭中文版,64 位操作系统, 基于 x64 的处理器Qt 5.15.2 MinGW 32-bitmysql Ver 14.14 Distrib 5.7.42, for Win32 (AMD64) 问题情况 在Qt 5.15.2 中编写连接MySQL数据库代码后,使用 MinGW 32-bit 构建套件进行编译运行后,报…

Python基础入门例程5-NP5 格式化输出(一)

描述 牛牛、牛妹和牛可乐正在Nowcoder学习Python语言,现在给定他们三个当中的某一个名字name, 假设输入的name为Niuniu,则输出 I am Niuniu and I am studying Python in Nowcoder! 请按以上句式输出相应的英文句子。 输入描述&#xff1…

驱动开发1 概念、内核模块编程、内核消息打印函数printk函数的使用、内核模块传参、内核导出符号

1 驱动相关概念 2 内核模块编程 内核模块编写实例代码注释 #include <linux/init.h> #include <linux/module.h>//入口函数&#xff0c;安装内核模块时执行 static int __init mycdev_init(void) {//static 修饰当前函数只能在本文件使用//int 函数的返回值类型&a…

063:mapboxGL常见错误:Style is not done loading(原因及解决办法)

第063个 点击查看专栏目录 作者在做vue+mapbox的项目,将geojson的数据加载到地图上来,形成的效果图如下 但是在处理的时候,遇到过这个一个错误,提示信息如下: vue.runtime.esm.js:3049 Error: Style is not done loadingat Qt._checkLoaded (mapbox-gl.js:36:1)at Qt.…

《计算机视觉中的多视图几何》笔记(14)

14 Affine Epipolar Geometry 本章主要是在仿射摄像机的情况下重新考虑对极几何&#xff0c;也就是仿射对极几何。 仿射摄像机的优点是它是线性的&#xff0c;所以很多最优化算法可以用线性代数的知识解决。如果是一般的投影摄像机&#xff0c;很多算法就不是线性的了&#x…

[架构之路-241]:目标系统 - 纵向分层 - 企业信息化与企业信息系统(多台企业应用单机组成的企业信息网络)

目录 前言&#xff1a; 一、什么是信息系统&#xff1a;计算机软件硬件系统 1.1 什么是信息 1.2 什么是信息系统 1.3 什么是信息技术 1.4 什么是信息化与信息化转型 1.5 什么是数字化与数字化转型&#xff08;信息化的前提&#xff09; 1.6 数字化与信息化的比较 1.7 …

Android 10.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在10.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

基于nodejs+vue市民健身中心网上平台mysql

市民健身中心网上平台分为用户界面和管理员界面&#xff0c; 用户信息模块&#xff1a;管理员可在后台添加、删除普通用户&#xff0c;查看、编辑普通用户的信息。 课程表管理模块&#xff1a;管理员可对课程表进行修改任课教师、新增某一堂课、删除某一堂课、查找课程、修改…

论文导读|9月MSOM文章精选:智慧城市运筹

推文作者&#xff1a;郭浩然 编者按 本期论文导读围绕“智慧城市运筹”这一话题&#xff0c;简要介绍并分析了近期的三篇MSOM文章&#xff0c;分别涉及了最后一公里配送中的新模式&#xff1a;“司机辅助”&#xff0c;易腐库存管理的新策略&#xff1a;“截断平衡”&#xff0…

Openssl数据安全传输平台004:套接字C语言API封装为C++类 / 客户端及服务端代码框架和代码实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

性能测试LoadRunner02

本篇主要讲&#xff1a;通过Controller设计简单的测试场景&#xff0c;可以简单的分析性能测试报告。 Controller 设计场景 Controller打开方式 1&#xff09;通过VUG打开 2&#xff09;之间双击Controller 不演示了&#xff0c;双击打开&#xff0c;选择Manual Scenario自…

buuctf[HCTF 2018]WarmUp 1

题目环境&#xff1a; 发现除了表情包&#xff0c;再无其他F12试试发现source.php文件访问这个文件&#xff0c;格式如下&#xff1a;url/source.php回显如下&#xff1a;PHP代码审计&#xff1a; <?php highlight_file(__FILE__); class emmm {public static function ch…