TCP拥塞控制

TCP拥塞控制(Congestion Control)

什么是拥塞控制?

拥塞控制(Congestion Control)主要针对整个网络中的数据传输速率进行调节,防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致于过载,以避免网络拥塞和丢包现象的发生。

拥塞控制是一个全局性的过程,和流量控制(滑动窗口)不同,流量控制指点对点通信量的控制。

为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由VJacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“**快速重传(Fast retransmit)”“快速恢复(Fast Recovery)**算法。

TCP的拥塞控制主要原理依赖于一个**拥塞窗口(cwnd)**来控制,窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段,显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞。

由于需要考虑拥塞控制和流量控制两个方面的内容,因此TCP的真正的发送窗口=min(rwnd,cwnd)。但是rwnd是由对端确定的,网络环境对其没有影响,所以在考虑拥塞的时候我们一般不考虑rwnd的值我们暂时只讨论如何确定cwnd值的大小。关于cwnd的单位,在TCP中是以字节来做单位的,我们假设TCP每次传输都是按照MSS大小来发送数据的,因此你可以认为cwnd按照数据包个数来做单位也可以理解,所以有时我们说cwnd增加1也就是相当于字节数增加1个MSS大小(Maximum SegmentSize)。

判断出现网络拥塞的依据:当出现丢包事件时,也就是要么出现①超时事件,要么②收到三个ACK(一个正常的ACK+三个冗余的ACK),发送方就认为发送方到接收方的路径上出现拥塞

  • 超时:TCP 实现可靠传输依赖的是超时重传机制(Retransmission Timeout)。TCP 在完每个数据包后,会启动一个重传定时器(RTO)。如果在定时器超时前没收到接收方发来的(认为数据丢了),就重传数据。
  • 三个连续冗余ACK:当网络不拥塞时,发生报文段丢失(当接收方收到不连续的数据包时),为了让发送方尽早知道发生了个别报文段的丢失,因此立即发送一个重复确认,怎样让发送方知道是哪个报文丢失的方法就是连读发送三个重复确认。然后立即启动快速重传

在这里插入图片描述

拥塞控制算法

TCP通过拥塞控制算法:慢启动、拥寒避免、快速重传和快速恢复算法

慢启动

最初的TCP在连接建立成功后会向网络中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此新建立的连接不能够一开始就大量发送数据包,而只能根据网络情况逐步增加每次发送的数据量,以避免上述现象的发生。
具体来说,当新建连接时,cwnd=1,cwnd初始化为1个最大报文段,(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd=cwnd+1,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是它的起点比较低而已。

在这里插入图片描述

拥塞避免

从慢启动可以看到,cwnd可以很快的增长上来,从而最大程度利用网络带宽资源,但是这样无限增长下去,一定需要某个限制。TCP使用了一个叫慢启动阈值(ssthresh)的变量cwnd>ssthresh后,慢启动过程结束,进入拥塞避免阶段

对于大多数TCP实现来说,ssthresh的值是65536(同样以字节计算)。拥塞避免的主要思也就是cwnd的值不再指数级往上升,开始加法增加。此时当窗口中所有的报文段都被确大小加1,cwnd的值就随着RTT开始线性增加,这样就可以避免增长过快导致网络拥塞整到网络的最佳值。

上面讨论的两个机制都是没有检测到拥塞的情况下的行为,那么当发现拥塞了cwnd又该怎样去调整呢?

首先来看TCP是如何确定网络进入了拥塞状态的,TCP认为网络拥塞的主要依据是它重传了一个报文段上面提到过,TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时时,那么出现拥塞的可能性就很大,某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应比较“强烈”

1.ssthresh=cwnd/2,即把ssthresh降低为cwnd值的一半
2.cwnd=1,即把cwnd重新设置为1
3.重新进入慢启动过程

从整体上来讲,TCP拥塞控制窗口变化的原则是AIMD原则,即加法增大、乘法减小。可以看出TCP的该原则可以较好地保证流之间的公平性,因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有足够的空间,从而保证整个的公平性

快速重传

其实TCP还有一种情况会进行重传:那就是收到3个相同的ACK。TCP在收到乱序到达包时就会立即发ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传,快速重传做的事情有:
1.ssthresh=cwnd/2,即把ssthresh设置为cwnd的一半
2.cwnd=ssthresh,即把cwnd再设置为ssthresh的值**(具体实现有些为ssthresh+3)**
3.重新进入拥塞避免阶段

快速恢复

“快速恢复”算法是在上述的“快速重传”算法后添加的,快速重传和快速恢复算法一般同时使用

具体来说快速恢复的主要步骤是:

  1. 当收到3个重复ACK时,ssthresh=cwnd/2,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老的数据包离开了网络。

  2. 再收到重复的ACK时,cwnd =cwnd +1,拥塞窗口增加1。

  3. 当收到新的数据包的ACK时,cwnd=ssthresh,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态

拥塞控制流程图

在这里插入图片描述

  • 无论是在慢启动阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢启动阈值设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗白设置为1,执行慢启动算法。

  • 快速恢复是TCP推荐的而非必须的构件。一种称为 TCTahoe的TCP早期版本,不管是发生超时指示的丢包事件,还是发生3个冗余 ACK 指示的丢包事件,都无条件地将其拥塞窗口减至 1个MSS,并进入慢启动阶段。TCP 的较新版本TCP Reno,则综合了快速恢复。

拥塞窗口和滑动窗口的区别:

拥塞窗口和滑动窗口是计算机网络中两种不同的概念,拥塞窗口是用于网络拥塞控制的,而滑动窗口则是用于流量控制的。以下是两者的区别:

  • 拥塞窗口(Congestion Window)主要用于TCP拥塞控制,它的作用是限制发送方发送数据的速率以防止网络拥塞。拥塞窗口的大小是动态调整的,取决于网络当前的拥塞状况。如果网络拥堵,拥塞窗口会减小;如果网络畅通,拥塞窗口会增大。拥塞控制的目的是确保网络的稳定和高效运行,避免因为数据传输过快而导致网络资源不足。
  • 滑动窗口(Sliding Window)主要用于流量控制,它的作用是控制发送方的数据发送速率,以确保接收方来得及接收数据。滑动窗口的大小由接收方根据其缓存大小和处理能力动态调整,并通过确认报文(ACK)通知发送方。如果接收方缓存已满,它会减小窗口大小,告诉发送方慢下来;如果缓存有空余,接收方会增大窗口大小,允许发送方发送更多数据。滑动窗口的大小是动态改变的,故得名“滑动窗口”
  • 简而言之,拥塞窗口关注的是整个网络的拥塞状况,而滑动窗口关注的是发送方和接收方之间的数据流量状况
    更多数据。滑动窗口的大小是动态改变的,故得名“滑动窗口”
  • 简而言之,拥塞窗口关注的是整个网络的拥塞状况,而滑动窗口关注的是发送方和接收方之间的数据流量状况

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

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

相关文章

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

自动驾驶合集(更新中)

文章目录 车辆模型控制路径规划 车辆模型 车辆模型基础合集 控制 控制合集 路径规划 规划合集

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景:一般用于分发配置文件时候,如果配置文件有变化,则重启服务,如果没有变化,则不重启服务 案列01:分发nfs配置文件,若文件发生改变则重启服务 2.when判断 用于给ans运…

整理5个优秀的微信小程序开源项目

​ 一、Bee GitHub: https://github.com/woniudiancang/bee Bee是一个餐饮点餐商城微信小程序,是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷&#x…

微服务链路追踪skywalking安装

‌SkyWalking是一个开源的分布式追踪系统,主要用于监控和分析微服务架构下的应用性能。‌ 它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案,特别适用于微服务、云原生架构和基于容器的环境(如Docker、K8s、Mesos&…

5G的发展演进

5G发展的驱动力 什么是5G [远程会议,2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下,ITU-R WP 5D#35e远程会议宣布3GPP 5G技术(含NB-IoT)满足IMT-2020 5G技…

matlab建模入门指导

本文以水池中鸡蛋温度随时间的变化为切入点,对其进行数学建模并进行MATLAB求解,以更为通俗地进行数学建模问题入门指导。 一、问题简述 一个煮熟的鸡蛋有98摄氏度,将它放在18摄氏度的水池中,五分钟后鸡蛋的温度为38摄氏度&#x…

开源 2 + 1 链动模式、AI 智能名片、S2B2C 商城小程序在用户留存与品牌发展中的应用研究

摘要:本文以企业和个人品牌发展中至关重要的用户留存问题为切入点,结合管理大师彼得德鲁克对于企业兴旺发达的观点,阐述了用户留存对品牌营收的关键意义。在此基础上,深入分析开源 2 1 链动模式、AI 智能名片、S2B2C 商城小程序在…

搭建Python2和Python3虚拟环境

搭建Python3虚拟环境 1. 更新pip2. 搭建Python3虚拟环境第一步:安装python虚拟化工具第二步: 创建虚拟环境 3. 搭建Python2虚拟环境第一步:安装虚拟环境模块第二步:创建虚拟环境 4. workon命令管理虚拟机第一步:安装扩…

对接阿里云实人认证

对接阿里云实人认证-身份二要素核验接口整理 目录 应用场景 接口文档 接口信息 请求参数 响应参数 调试 阿里云openApi平台调试 查看调用结果 查看SDK示例 下载SDK 遇到问题 本地调试 总结 应用场景 项目有一个提现的场景,需要用户真实的身份信息。 …

基于卷积神经网络的车辆损坏部位检测系统带gui

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

CHI atomics 传输——CHI(6)

原子事务,指的是此事务就像原子一样是不可分割的,要么所有操作全部完成,要么全部不执行,不存在执行部分操作的情况。 ALU (Arithmetic Logic Unit) 算术逻辑单元,ALU在HN或SN AddrData:当前memory中的数据…

批量从Excel某一列中找到符合要求的值并提取其对应数据

本文介绍在Excel中,从某一列数据中找到与已知数据对应的字段,并提取这个字段对应数值的方法。 首先,来明确一下我们的需求。现在已知一个Excel数据,假设其中W列包含了上海市全部社区的名称,而其后的Y列则是这些社区对应…

有趣的Midjourney作品赏析(附提示词)

中文提示词:国风少年 C4D软件,高分辨率,超细节,超现实主义, 英文提示词:National Style Youth Cinema4D,high resolution,hyper detailed,surrealism, --niji 6 --ar 1:1 中文提示词:粘土模型,男性穿着中世纪欧洲蓝色盔甲&#x…

SpringBootCloud 服务注册中心Nacos对服务进行管理

介绍 Nacos(Naming and Configuration Service)是一个开源的、动态的服务发现、配置管理和服务管理平台,特别适用于云原生应用和微服务架构。它可以作为服务注册中心,用于微服务的注册、发现、配置管理等。在微服务架构中&#x…

强化学习入门笔记(Reinforcement Learning,RL) 强推!

由于本人的近期研究方向涉及到强化学习,本科时已经学习过了,但是感觉还是有些概念和算法没有学懂学透,所以想重新系统性的学习一下,记录了整个学习过程,而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…

【计算机网络】【网络层】【习题】

计算机网络-网络层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程,表(a)是路由表 R1 初始的路由表,表(b)是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表(c)。…

外星人入侵

学习于Python编程从入门到实践(Eric Matthes 著) 整体目录:外星人入侵文件夹是打包后的不必在意 图片和音效都是网上下载的 音效下载网站:Free 游戏爆击中 Sound Effects Download - Pixabay 运行效果:可以上下左右移…

美国10月CPI符合预期,12月降息稳了?

KlipC报道:当地时间11月13日,美国劳工部公布数据显示,美国10月CPI同比上升2.6%,CPI环比上升0.2%;核心CPI同比上升3.3%,核心CPI环比上升0.3%。 数据公布后,交易员加大了对美联储12月降息的押注。…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI(图形设备接口)中的一个函数,用于在设备上下文(device context, DC)之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…