TCP_拥塞控制

引言

24年春节马上就要到了,作为开车党,最大的期盼就是顺利回家过年不要堵车。梦想是美好的,但现实是骨感的,拥堵的道路让人苦不堪言。
在网络世界中,类似于堵车的问题也存在,而TCP(Transmission Control Protocol)的拥塞控制机制就是为了解决这一问题而设计的。
在这里插入图片描述

为什么需要拥塞控制

前面介绍TCP滑动窗口的博文中,我们已经了解到TCP有两种流控机制,即接收方的滑动窗口和发送方的拥塞窗口。接收方的流控机制主要是为了防止接收方无法处理过多的数据而导致溢出,而拥塞控制则是为了避免网络中的拥塞,确保数据能够流畅传输。

类比高速堵车的案例,不同路段的通行能力不同,当车流量超过某一路段的容量时,就会发生“堵车”现象,需要交警来管控疏导。TCP的拥塞控制机制,是发送方主动感知、适配链路状态而采取的速度控制策略,在防止网络拥塞的前提下来最大程度的利用带宽。发送方是如何感知到“堵车”的,它又怎样来进行限流?

链路拥塞的感知方法

TCP拥塞控制主要依赖于两种链路拥塞的感知方法:网络辅助的拥塞控制和端到端的拥塞控制。

网络辅助的拥塞控制依赖于网络层提供的拥塞信息,而端到端的拥塞控制则通过报文段的丢失来感知链路的拥塞情况。

TCP采用端到端的拥塞控制,因为IP层不提供拥塞控制反馈。
在这里插入图片描述

TCP的拥塞控制机制

TCP的拥塞控制主要依赖于发送方维护的拥塞窗口(congestion window,缩写为cwnd)。cwnd控制着流量的发送速率,即数据发送到网络中的速率。与之相对应的是接收方的窗口大小(rwnd),由接收方通告。

发送方可发送的在途流量(未收到ACK)<= min {cwnd,rwnd}

TCP拥塞控制遵循三个指导性原则:

  • 一个丢失的报文段意味着拥塞,此时应当降低发送速率;一个超时事件或者四个确认(一个初始ACK和其后的三个冗余ACK),是一种隐含的丢包指示;
  • 一个确认报文段指示网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认达到时,能够增加发送方的速率;
  • 带宽探测。给定ACK指示链路无拥塞,丢包说明有拥塞,TCP通过调节发送速率来探测带宽。当收到ACK时增加发送速率,直至出现丢包,降低速率。然后开始新的一轮探测,逐渐趋近于带宽上限。

接下来介绍tcp的拥塞控制算法,包括三个主要部分:慢启动,拥塞避免,快速恢复;其中慢启动和拥塞避免是TCP的强制部分,两者的区别在于收到的ACK时拥塞窗口的增速不一样,快速恢复是推荐部分。

慢启动

慢启动特点是发送速率慢,当增速(加速度)快,以指数增长;
TCP连接刚建立的时候,不了解实际的带宽情况,需要能快速的探测拥塞点,提高带宽利用率。
每收到一个确认时,拥塞窗口增加一个MSS,即每经过一个RTT周期,cwnd的大小翻倍。

假设MSS=1024、RTT=100ms、初始cwnd为1个MSS,最开始的发送速率约为80kps;但经过一秒后,cwnd会扩大到1024(假设尚未到拥塞点),速率提高到80Mbps。
在这里插入图片描述

慢启动阶段可能在以下情况结束:

  • 超时丢包:TCP记录慢启动阈值(ssthresh),将其设置为当前拥塞窗口大小的一半,然后将cwnd重置为1,重新开始慢启动的过程。

  • cwnd>=ssthresh:继续翻倍增加大小可能导致二次拥塞,结束慢启动进入拥塞避免。

  • 三个冗余的ACK:进入快速恢复状态。
    在这里插入图片描述

拥塞避免

拥塞避免阶段的特点发送速率快,但增速慢,以线性增长。在接近拥塞点时,缓慢增加发送速率,每个RTT只将cwnd的值增加一个MSS。处理超时丢包和三个冗余的ACK的行为与慢启动阶段相似。

快速恢复

在收到三个冗余的ACK时,发送方进入快速恢复状态,对丢失的报文进行重传。快速恢复中,对于引起TCP进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK,cwnd的值增加一个MSS。最终,当对丢失报文段的一个ACK到达时,TCP在降低cwnd后进入拥塞避免状态。如果出现超时事件,处理行为和慢启动阶段超时丢包事件处理行为一样。

对丢失的报文进行重传时会涉及到重传策略,是回退N步(GNB)还是选择重传(SR)(这两种重传策略介绍,可参见前面博文TCP_可靠数据传输原理),reno算法使用选择性重传。

快速恢复是TCP的推荐策略,早期版本的TCP Tahoe,不管是超时丢包还是冗余ACK丢包事件,均直接进入慢启动阶段。reno对丢失报文的处理更加智能。

下图中,可以看到冗余ACK出现时,这两个算法拥塞窗口的变化差异。最开始慢启动阈值为8,第8个传输回合收到三个冗余ACK,然后慢启动阈值变为6。
在这里插入图片描述

通过慢启动、拥塞避免和快速恢复这三个阶段,TCP的拥塞控制机制实现了在不同网络环境下的自适应调整,以确保数据的可靠传输并最大化网络利用率。

拥塞控制的关键原则

  • 丢包指示拥塞: 丢失的报文段被视为拥塞的信号,导致发送方降低发送速率。
  • 确认报文段指示网络畅通: 接收到确认报文段时,说明网络正在成功传递数据,发送方可以适度增加发送速率。
  • 带宽探测: TCP通过调节发送速率来主动探测带宽,通过适应性地调整拥塞窗口大小,以达到最优的传输速率。

新的拥塞感知方式

除了基于丢包事件的拥塞感知方式外,还有基于RTT(往返时延)策略的拥塞感知方式。这种策略通过测量数据包的往返时延来推断网络的拥塞程度。
例如,Google推出的BBR算法就是一种基于RTT的拥塞控制算法,它能够在不同网络环境下实现较高的带宽利用率和较低的延迟。

结语

TCP的拥塞控制机制是保证网络传输稳定性和高效性的重要组成部分。通过慢启动、拥塞避免和快速恢复等阶段,TCP能够根据网络环境的变化动态地调整发送速率,避免拥塞的发生,从而确保数据能够顺利地传输。这种自适应调整的特性使得TCP成为网络通信中不可或缺的协议之一。

在网络世界中,就像在开车的路上一样,遇到拥堵时我们需要智能的调整速度和路径以避免更大的问题。TCP的拥塞控制就是网络通信的"交警",在网络的高速公路上引导数据流畅行,确保通信的顺畅和高效。

参考资料

TCP拥塞控制介绍和BBR算法

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

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

相关文章

环形链表找入环点----链表OJ---三指针

https://leetcode.cn/problems/linked-list-cycle-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 首先&#xff0c;需要判断是否有环&#xff0c;而这里我们不单纯判断是否有环&#xff0c;还要为下一步做准备&#xff0c;需要让slow指针和fast都从头结点开始…

【数据结构1-1】线性表

线性表是最简单、最基本的一种数据结构&#xff0c;线性表示多个具有相同类型数据“串在一起”&#xff0c;每个元素有前驱&#xff08;前一个元素&#xff09;和后继&#xff08;后一个元素&#xff09;。根据不同的特性&#xff0c;线性表也分为数组&#xff08;vector&#…

MySQL 学习记录

基本常识 row-size-limitsblob&#xff1a; BLOB and TEXT columns cannot have DEFAULT values.Instances of BLOB or TEXT columns in the result of a query that is processed using a temporary table causes the server to use a table on disk rather than in memory b…

C++11——新的类功能与可变参数模板

系列文章目录 文章目录 系列文章目录一、新的类功能默认成员函数类成员变量初始化强制生成默认函数的关键字default禁止生成默认函数的关键字delete继承和多态中的final与override关键字 二、可变参数模板递归函数方式展开参数包逗号表达式展开参数包STL容器中的empalce_back与…

写点东西《JWT 与会话身份验证》

写点东西《JWT 与会话身份验证》 身份验证与授权 JWT 与session身份验证 - 基本差异 什么是 JWT&#xff1f; JWT 结构&#xff1a; JWT 工作流程&#xff1a;优势: 安全问题&#xff1a; 处理令牌过期&#xff1a; 基于session的身份验证&#xff08;通常称为基于 cookie 的身…

工程对接大模型流式和非流式对话底层原理解析

文章目录 前言一、非流式输出设计二、stream流式输出设计三、手撸一个流式输出项目总结 前言 之前对接过OpenAi大模型的官方API&#xff0c;可以看到它有一个Stream参数&#xff0c;设置成true的时候就是流式的对话输出&#xff0c;现象就是一段一段的往外崩。 官方手册的地址…

蓝桥杯训练|基础语言Day1 - STL pair vector list stack queue set map容器

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 算法题入门 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽≦)o .&#xff61…

Python爬虫案例展示:实现花猫壁纸数据采集

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 模块使用: import requests >>> pip install requests win R 输入cmd 输入安装命令 pip install requests 安装即…

Springboot各种请求参数详解

文章目录 请求Postman**为什么需要Postman****什么是Postman****Postman使用教程** 请求参数简单参数实体参数数组参数集合参数![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/eba0ca80e3724412ae4c79af72b859c3.png#pic_center)日期参数json参数路径参数总结 请求…

STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

目录 1、准备材料 2、实验目标 3、模拟鼠标实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.0、工程基本配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.0、配置Project Manager页面 3.2.1、设初始化调用流程 3.2.2、外设中…

ESP8266 控制之 : 使用 RingBuffer USART1 和 USART3互传

简介 使用Buffer来避免数据的丢失, 或许你自己在使用串口进行收发时会丢失数据, 现在我们就来简单使用一下RingBuffer创建Rx、Tx的Buffer来避免发送接收丢包或数据丢失问题。 扩展知识 RingBuffer的介绍, 看完大概也就知道了&#xff0c;实在不知道就看看下面的代码 线路连接…

详解操作系统各章大题汇总(死锁资源分配+银行家+进程的PV操作+实时调度+逻辑地址->物理地址+页面置换算法+磁盘调度算法)

文章目录 第三章&#xff1a;死锁资源分配图例一例二 第三章&#xff1a;银行家算法第四章&#xff1a;进程的同步与互斥做题步骤PV操作的代码小心容易和读者写者混 1.交通问题&#xff08;类似读者写者&#xff09;分析代码 2.缓冲区问题&#xff08;第二个缓冲区是复制缓冲区…

实现元素进入界面的平滑效果

先看效果&#xff1a; 实现思路&#xff1a;获取页面中需要加载动画的节点&#xff0c;用元素的animate()方法创建一个动画对象&#xff0c;并传入两个关键帧&#xff0c;接着使用IntersectionObserverAPI创建观察对象&#xff0c;用于观察元素进入页面。当元素进入界面时&…

【数据分享】1929-2023年全球站点的逐年平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

CSS--Emmet 语法

Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法. 目录 1. 快速生成HTML结构语法 1.1 快速生成HTML结构语法 2. 快速生成CSS样式语法 2.1 快速生成CSS样式语法 1. 快速生成HTML结构语法 1.1 快速生成HTML结构语法 1. 生成标…

2.【Vue3】Vue 基本使用——局部使用Vue

文章目录 1. 快速入门2. 常用指令2.1 v-for2.2 v-bind2.3 v-if 与 v-show2.4 v-on2.5 v-model 3. 生命周期4. Ajax 函数库 Axios4.1 Axios 基本使用4.2 Axios 请求方式别名 1. 快速入门 现在需要将 “hello vue3” 这样一个字符串渲染到页面上进行展示。 这个需求并不陌生&…

JVM系列——对象管理

JVM对象分布 对象头 第一类是用于存储对象自身的运行时数据&#xff0c;如哈希码&#xff08;HashCode&#xff09;、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等 另外一部分是类型指针&#xff0c;即对象指向它的类型元数据的指针&#xff0c;Java 虚…

【ArcGIS微课1000例】0096:dem三维块状表达(层次地形模型)

文章目录 一、DEM表达方式二、层次模型表达三、注意事项一、DEM表达方式 DEM数字高程模型的表达方式通常有以下4种: 1. 规则格网 2. 不规则三角网 3. 等高线 4. 层次地形模型 作为栅格地理数据,DEM 数据具有2.5维的特征,能够以三维表面的形式进行三维空间表达。但受其数…

Web 开发 6:Redis 缓存(Flask项目使用Redis并同时部署到Docker详细流程 附项目源码)

大家好&#xff01;欢迎来到第六篇 Web 开发教程&#xff0c;今天我们将探讨一个非常重要的话题&#xff1a;Redis 缓存。作为一个互联网开发者&#xff0c;你一定知道在处理大量请求时&#xff0c;性能优化是至关重要的。而 Redis 缓存正是帮助我们提升系统性能的利器。Redis …

爬虫基础-计算机网络协议

一个数据的传输 这些设备的数据转发是通过协议来完成的&#xff0c;整个互联网可以说是完全由网络协议来维持的 不同的协议分工不同&#xff0c;比如ip协议确保了ip寻址&#xff0c;tcp协议确保了数据完整性 IP地址和URL ip地址 整个网络传输可以比作快递&#xff0c;数据就…