TCP 拥塞控制

概念详解

TCP拥塞控制是网络通信中的一个关键机制,它通过动态调整发送数据的速率来避免网络拥塞。以下是TCP拥塞控制的详细概念解释:

  1. 拥塞窗口(CWND, Congestion Window):

    • 定义:发送方在收到接收方的确认(ACK)之前,可以发送的数据量。
    • 作用:控制发送方的发送速率,是TCP拥塞控制的核心参数。
  2. 慢启动阈值(ssthresh, Slow Start Threshold):

    • 定义:CWND的一个阈值,用于决定何时从慢启动阶段转换到拥塞避免阶段。
    • 作用:平衡网络探测速度和稳定性。
  3. 往返时间(RTT, Round-Trip Time):

    • 定义:数据包从发送到接收到确认的时间。
    • 作用:用于估算网络延迟,影响重传超时时间的计算。
  4. 最大报文段大小(MSS, Maximum Segment Size):

    • 定义:TCP可以发送的最大数据段的大小。
    • 作用:影响CWND的增长和网络效率。
  5. 慢启动(Slow Start):

    • 概念:TCP连接初始阶段,CWND从1个MSS开始,每收到一个ACK就翻倍。
    • 目的:快速探测可用带宽,但避免一开始就发送大量数据。
  6. 拥塞避免(Congestion Avoidance):

    • 概念:CWND达到ssthresh后,每个RTT只增加1个MSS。
    • 目的:在接近网络容量时,缓慢增加发送速率,避免突然的大幅增加导致拥塞。
  7. 快速重传(Fast Retransmit):

    • 概念:收到3个重复ACK时,立即重传丢失的数据包。
    • 目的:快速响应丢包,不等待重传计时器超时。

“3个重复ACK”解释

在TCP(传输控制协议)中,当发送方发送数据给接收方后,接收方会对收到的数据包发送确认(ACK)回给发送方。三个重复的ACK(Acknowledgement),也称为三个冗余ACK或三个重复确认,是指发送方连续收到三个具有相同确认号的ACK。这种情况通常表明在数据传输过程中发生了数据包丢失。
为什么会收到三个重复的ACK?
当接收方收到一个失序的数据包时(即接收到的数据包的序号不是预期的下一个序号),它会立即重复发送上一个连续序列的ACK,以通知发送方某个数据包可能已经丢失。由于TCP是基于累积确认的,这个重复的ACK会确认接收方最后一个按序接收的数据包。如果发送方连续收到三个这样的重复ACK,这通常意味着接收方在期待的数据包之后已经收到了后续的数据包,但期待的那个数据包却没有到达。
三个重复的ACK的作用
在TCP的拥塞控制机制中,收到三个重复的ACK是一个重要的信号,它触发了快速重传(Fast Retransmit)和快速恢复(Fast Recovery)机制:

  • 快速重传:发送方不需要等待重传计时器超时,而是立即重传那个被认为丢失的数据包。
  • 快速恢复:发送方调整拥塞窗口(CWND)和慢启动阈值(ssthresh),然后继续数据传输,而不是重新开始慢启动过程。

这种机制使TCP能够更快地响应丢包事件,减少等待时间,提高数据传输的效率。
三个重复的ACK的作用

在TCP的拥塞控制机制中,收到三个重复的ACK是一个重要的信号,它触发了快速重传(Fast Retransmit)和快速恢复(Fast Recovery)机制:

  • 快速重传:发送方不需要等待重传计时器超时,而是立即重传那个被认为丢失的数据包。
  • 快速恢复:发送方调整拥塞窗口(CWND)和慢启动阈值(ssthresh),然后继续数据传输,而不是重新开始慢启动过程。

这种机制使TCP能够更快地响应丢包事件,减少等待时间,提高数据传输的效率。

  1. 快速恢复(Fast Recovery):

    • 概念:快速重传后,设置ssthresh为CWND的一半,CWND为ssthresh加3个MSS。
    • 目的:在轻微拥塞时保持较高的传输速率。
  2. 加法增大乘法减小(AIMD, Additive Increase Multiplicative Decrease):

    • 概念:拥塞避免阶段线性增加CWND,拥塞时将CWND减半。
    • 目的:在保持高效率的同时,快速响应网络拥塞。
  3. 超时重传(Timeout Retransmission):

    • 概念:当重传计时器超时时,重新发送未确认的数据包。
    • 作用:处理严重的网络拥塞或大量丢包情况。
  4. 接收窗口(RWND, Receive Window):

    • 定义:接收方能够接收的数据量。
    • 作用:与CWND一起决定发送方的发送窗口大小。
  5. 发送窗口(Send Window):

    • 定义:实际可以发送的数据量,是CWND和RWND的最小值。
    • 作用:综合考虑网络拥塞和接收方处理能力。

这些概念共同构成了TCP的拥塞控制机制,使TCP能够适应不同的网络条件,在保证可靠传输的同时,尽可能高效地利用网络资源。

拥塞控制阶段

TCP拥塞控制主要包括四个阶段:慢启动、拥塞避免、快速重传和快速恢复。以下是这些阶段的详细解释:

  1. 慢启动(Slow Start):

    • 目的:快速探测网络可用带宽,但避免一开始就发送大量数据。
    • 过程:
      • 连接建立时,CWND初始化为1个MSS。
      • 每收到一个ACK,CWND增加2n个MSS。
      • CWND呈指数增长(n):1, 2, 4, 8, 16, …
    • 结束条件:
      • CWND达到慢启动阈值(ssthresh)
      • 出现丢包(超时或收到重复ACK)
    • 转换:
      • 如果达到ssthresh,进入拥塞避免阶段
      • 如果出现丢包,进入快速重传/快速恢复或重新开始慢启动
  2. 拥塞避免(Congestion Avoidance):

    • 目的:在接近网络容量时,缓慢增加发送速率,避免突然的大幅增加导致拥塞。
    • 过程:
      • 每个RTT,CWND增加1个MSS
      • CWND线性增长
    • 结束条件:
      • 出现丢包(超时或收到重复ACK)
    • 转换:
      • 如果收到3个重复ACK,进入快速重传/快速恢复
      • 如果发生超时,重新进入慢启动
  3. 快速重传(Fast Retransmit):

    • 目的:快速响应丢包,不等待重传计时器超时。
    • 触发条件:收到3个重复的ACK
    • 过程:
      • 立即重传丢失的数据包
      • 不等待重传计时器超时
    • 转换:直接进入快速恢复阶段
  4. 快速恢复(Fast Recovery):

    • 目的:在轻微拥塞时保持较高的传输速率。
    • 过程:
      • 将ssthresh设置为当前CWND的一半
      • 将CWND设置为新的ssthresh加上3个MSS(对应3个重复ACK)
      • 每收到一个重复的ACK,CWND增加1个MSS
      • 当收到新的ACK(确认新数据)时,将CWND设置为ssthresh
    • 结束条件:
      • 收到新的ACK,确认所有未确认的数据
      • 发生超时
    • 转换:
      • 如果收到新的ACK,进入拥塞避免阶段
      • 如果发生超时,重新进入慢启动
  5. 超时处理:

    • 当发生超时时(可能在任何阶段):
      • 将ssthresh设置为当前CWND的一半
      • 将CWND重置为1个MSS
      • 重新进入慢启动阶段

这些阶段共同构成了TCP的拥塞控制机制,使TCP能够适应不同的网络条件。通过动态调整CWND,TCP在保证可靠传输的同时,尽可能高效地利用网络资源,避免网络拥塞。

图引用自《计算机网络自顶向下方法 》图3-52 拥塞窗口的演化

  • 在该图中,阈值初始等于8个MSS。在前8个传输回合, Tahoe和Reno采取了相同的动作。拥塞窗口在慢启动阶段以指数速度快速爬升,在第4轮传输时到达了阈值。然后拥塞窗口以线性速度爬升,直到在第8轮传输后出现3个冗余ACK。注意到当该丢包事件发生时,拥塞窗口值为12×MSS。于是 ssthresh的值被设置为0.5 x cwnd=6MSS。在 TCP Reno下,拥塞窗口被设置为cwnd=0.5 x cwnd+3=9MSS,然后线性地增长。在 TCP Tahoe下,拥塞窗口被设置为1个MSS,然后呈指数增长,直至到达 ssthresh值为止,在这个点它开始线性增长。
    ———————————————————————————————

注:Tahoe和Reno都是TCP拥塞控制算法

图引用自《计算机网络自顶向下方法 》图3-52 拥塞窗口的演化

拥塞控制算法

TCP拥塞控制算法是为了解决网络中的数据传输拥塞问题而设计的一系列算法。它们通过动态调整数据的发送速率来避免网络过载,确保数据传输的高效和稳定。不同的拥塞控制算法在处理网络拥塞的策略和效率上有所不同。以下是几种主要的TCP拥塞控制算法及其区别:

1. TCP Tahoe

  • 特点:引入了慢启动、拥塞避免和快速重传机制。
  • 缺点:没有快速恢复机制。当发生丢包时,Tahoe会将拥塞窗口(CWND)减少到1个MSS,并重新开始慢启动过程,这可能导致性能下降。

2. TCP Reno

  • 特点:在Tahoe的基础上增加了快速恢复机制。
  • 优势:当检测到三个重复的ACK时,除了立即重传丢失的数据包外,还会进入快速恢复阶段,减少了超时重传对性能的影响。
  • 缺点:在多个数据包丢失的情况下,Reno的性能可能不理想。

3. TCP NewReno

  • 特点:改进了Reno的快速恢复机制。
  • 优势:能够更好地处理一个RTT内多个数据包丢失的情况。
  • 工作方式:在快速恢复阶段,只有当所有丢失的数据包都被确认后,才会退出快速恢复阶段。

4. TCP Vegas

  • 特点:基于预测的拥塞避免算法,通过监测数据包的往返时间(RTT)来预测和避免拥塞。
  • 优势:能够在拥塞发生之前调整发送速率,从而避免丢包,提高网络利用率。
  • 缺点:在高带宽延迟积(BDP)网络中,Vegas的性能可能不如基于丢包的算法。

5. TCP BBR (Bottleneck Bandwidth and RTT)

  • 特点:基于带宽和RTT的拥塞控制算法,旨在最大化网络的吞吐量同时最小化延迟。
  • 优势:不依赖于丢包作为拥塞的信号,能够更有效地利用可用带宽,减少排队延迟。
  • 工作方式:周期性地测量最小RTT和最大带宽,据此调整发送速率。

总结

不同的TCP拥塞控制算法在设计理念、性能优化方面有所不同。Tahoe和Reno侧重于通过丢包信号来调整拥塞窗口大小,而Vegas和BBR则试图通过预测和测量网络状态来避免拥塞的发生。随着网络环境的不断变化和发展,新的拥塞控制算法不断被提出,以适应不同的网络条件和应用需求。

Reno 图示

+----------------+  超时  +----------------+  CWND>=ssthresh  +-------------------+  3个重复ACK  +-------------------+
|                |------->|                |----------------->|                   |------------>|                   |
|   慢启动        |        |   慢启动        |                  |   拥塞避免         |             |   快速重传          |
|  (Slow Start)  |<-------|  (Slow Start)  |<-----------------| (Congestion       |             | (Fast Retransmit) |
|                | 收到新ACK |                |  超时/收到新ACK  |  Avoidance)      |              |                   |
+----------------+        +----------------+                  +--------+----------+              +--------+----------+^                                                                 |                                   ||                                                                 |                                   |+-----------------------------------------------------------------+                                   |收到新的ACK/超时                                                         |||v+-------------------+|                   ||   快速恢复         || (Fast Recovery)   ||                   |+-------------------+|| 收到新的ACKv+-------------------+|                   ||   拥塞避免         || (Congestion       ||  Avoidance)       ||                   |+-------------------+

状态流转条件详解:

  1. 慢启动(Slow Start):

    • 超时:如果在慢启动阶段发生超时,TCP将ssthresh设置为当前CWND的一半,并将CWND重置为1 MSS,继续留在慢启动阶段。
    • CWND>=ssthresh:当CWND达到或超过慢启动阈值(ssthresh)时,进入拥塞避免阶段。
  2. 拥塞避免(Congestion Avoidance):

    • 超时/收到新ACK:如果在拥塞避免阶段发生超时,或者收到新的ACK,TCP将ssthresh设置为当前CWND的一半,并将CWND重置为1 MSS,回到慢启动阶段。
    • 3个重复ACK:如果收到三个重复的ACK,进入快速重传阶段。
  3. 快速重传(Fast Retransmit):

    • 触发条件:收到三个重复的ACK时,立即重传丢失的数据包,然后进入快速恢复阶段。
  4. 快速恢复(Fast Recovery):

    • 收到新的ACK:在快速恢复阶段,当收到新的ACK确认新的数据传输成功时,TCP将CWND设置为ssthresh的大小,然后进入拥塞避免阶段。
    • 超时或继续收到重复ACK:如果在快速恢复阶段再次发生超时,或者继续收到重复的ACK,TCP将根据具体实现可能重新进入慢启动或继续快速恢复的调整逻辑。

这个图示和说明提供了TCP拥塞控制机制中各个阶段的全量视图,包括快速重传和快速恢复阶段的正确位置及其与其他状态之间的流转条件。希望这次的解释能够清晰地展示TCP拥塞控制的完整流程。

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

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

相关文章

Java 面试题:通过JProfile排查OOM问题 内存溢出与内存泄漏问题 --xunznux

文章目录 如何通过JProfile排查OOM或内存泄漏问题1、启动工具观测程序执行状态2、使用默认设置采样3、查看memory&#xff0c;Run GC无效4、查看 Live Memory发现两个byte大数组存在5、通过快照查看堆中的内存使用情况6、找到Full GC无法清除的对象通过大对象列表定位内存泄漏问…

【SpringBoot】电脑商城-12-订单功能

创建订单 1 订单-创建数据表 1.使用use命令先选中store数据库。 USE store;2.在store数据库中创建t_order和t_order_item数据表。 CREATE TABLE t_order (oid INT AUTO_INCREMENT COMMENT 订单id,uid INT NOT NULL COMMENT 用户id,recv_name VARCHAR(20) NOT NULL COMMENT …

Mac 上 YYDS 的自动切换输入法工具:好用到原地炸裂式起飞

有一种幸福的状态就是 任何时刻你都可以全力以赴 被打断、被终止也没有遗憾 因为你对结果没有那么期待 而且已经用尽全力了 当你深刻认识到你所做的事情 是多么好的时候 自然会产生一种想要分享出去 的心情 如今社会大部分工作都被电脑化了&#xff0c;在很多方面我们的…

第140天:内网安全-横向移动局域网ARP欺骗DNS劫持钓鱼中间人单双向

目录 案例一&#xff1a;局域网&工作组-ARP原理-断网限制-单向 案例二&#xff1a;局域网&工作组-ARP欺骗-劫持数据-双向 案例三&#xff1a;局域网&工作组-DNS 劫持-钓鱼渗透-双向 案例一&#xff1a;局域网&工作组-ARP原理-断网限制-单向 原理&#xff1…

数据库MySQL基础

目录 一、数据库的介绍 1.数据库概述 &#xff08;1&#xff09;数据的存储方式 &#xff08;2&#xff09;数据库 2.常见数据库排行榜 二、数据库的安装与卸载 1.数据库的安装 2.数据库的卸载 三、数据库服务的启动与登录 1.Windows 服务方式启动 &#xff08;1&…

Java反序列化漏洞-TemplatesImpl利用链分析

文章目录 一、前言二、正文1. 寻找利用链2. 构造POC2.1 生成字节码2.2 加载字节码1&#xff09;getTransletInstance2&#xff09;defineTransletClasses 2.3 创建实例 3. 完整POC 三、参考文章 一、前言 java.lang.ClassLoader#defineClass defineClass可以加载字节码&…

相机常见名词详解

本文主要参考超人视觉课程做的笔记&#xff0c;有讲解不太懂的&#xff0c;又做了详细的解释 1、物距&#xff1a;物体到镜片的距离&#xff1b; 2、像距&#xff1a;像到镜片的距离&#xff1b; 3、焦距&#xff1a;镜片到焦点的距离&#xff1b; (1)二倍焦距以外&#xff…

AF路由模式组网部署

实验拓扑 防火墙基本配置 接口配置 eth1 eth2 eth3 路由配置 地址转换配置 放通策略 1. 出口申请了主电信、备联通两条外网线路&#xff08;均为 50M 带宽&#xff09;。 2. 内网有 web 服务器linux 172.16.3.100运行 http 服务&#xff0c;内外网用户通过 出口路由器…

用PG Back Web轻松进行PostgreSQL备份

什么是 PG Back Web &#xff1f; PG Back Web &#x1f418; 使用用户友好的 Web 界面轻松进行 PostgreSQL 备份&#xff01;&#x1f310;&#x1f4be;。PG Back Web 不仅仅是另一个备份工具。借助 PG Back Web&#xff0c;用户可以通过受 PGP 加密保护的直观 Web 界面轻松安…

【redis】数据量庞大时的应对策略

文章目录 为什么数据量多了主机会崩分布式系统应用数据分离架构应用服务集群架构负载均衡器数据库读写分离 引入缓存冷热分离架构 分库分表微服务是什么代价优势 为什么数据量多了主机会崩 一台主机的硬件资源是有上限的&#xff0c;包括但不限于一下几种&#xff1a; CPU内存…

【Postgresql】地理空间数据的存储与查询,查询效率优化策略,数据类型与查询速度的影响

注&#xff1a;使用postgresql数据库会用到PostGIS 扩展。 一、安装PostGIS 扩展 在 PostgreSQL 中遇到错误 “type geography does not exist” 通常意味着你的 PostgreSQL 数据库还没有安装 PostGIS 扩展&#xff0c;或者 PostGIS 扩展没有被正确地安装在你的数据库中。geo…

我司使用了两年的高效日志打印工具,非常牛逼!

为了更方便地排查问题&#xff0c;电商交易系统的日志中需要记录用户id和订单id等字段。然而&#xff0c;每次打印日志都需要手动设置用户id&#xff0c;这一过程非常繁琐&#xff0c;需要想个办法优化下。 log.warn("user:{}, orderId:{} 订单提单成功",userId, or…

linux服务器之top命令详解

top&#xff1a;系统资源管理器 top命令类似于windows的任务管理器&#xff0c;可以查看内存、cpu、进程等信息(动态查看系统资源信息)在linux系统中常用top命令查看资源性能分析工具 一、参数释义&#xff1a; 第一行 系统时间和平均负载 top&#xff1a;名称22:12:46&#…

Spring Boot 部署方案!打包 + Shell 脚本详解

本篇和大家分享的是springboot打包并结合shell脚本命令部署&#xff0c;重点在分享一个shell程序启动工具&#xff0c;希望能便利工作&#xff1b; profiles指定不同环境的配置 maven-assembly-plugin打发布压缩包 分享shenniu_publish.sh程序启动工具 linux上使用shenniu_p…

一文梳理RAG(检索增强生成)的现状与挑战

一 RAG简介 大模型相较于过去的语言模型具备更加强大的能力&#xff0c;但在实际应用中&#xff0c;例如在准确性、知识更新速度和答案透明度方面&#xff0c;仍存在不少问题&#xff0c;比如典型的幻觉现象。因此&#xff0c;检索增强生成 (Retrieval-Augmented Generation, …

哪种超声波清洗机效果好?较好的超声波眼镜清洗机品牌推荐

作为一名拥有20年戴镜经验的眼镜爱好者&#xff0c;我深深体会到眼镜清洁的挑战&#xff1a;微小缝隙里的污垢难以触及&#xff0c;频繁的脏污让我苦于找不到清洁时机&#xff0c;而用力不当的擦拭方法更是可能对眼镜特别是镜片造成伤害&#xff0c;这确实让人感到苦恼&#xf…

Java专栏介绍

专栏导读 在当今这个技术飞速发展的时代&#xff0c;Java作为一门成熟且广泛应用的编程语言&#xff0c;一直是软件开发领域的中坚力量。本“Java技术”专栏旨在帮助读者深入理解Java编程语言的精髓&#xff0c;掌握其核心概念与高级特性&#xff0c;并通过实战案例提升编程技…

字符编码转换

文章目录 1. 背景2. 解决方案3. 编码转换实现3.1 shell实现3.2 python实现3.3 开源工具实现 4. 常见中文字符编码介绍4.1 字符编码解决什么问题4.2 常见的中文字符编码4.3 常见中文字符编码关系4.4 unicide字符集与utf-8 1. 背景 在团队合作开发中&#xff0c;经常发现组员的代…

Redis安装步骤——离线安装与在线安装详解

Linux环境下Redis的离线安装与在线安装详细步骤 环境信息一、离线安装1、安装环境2、下载redis安装包3、上传到服务器并解压4、编译redis5、安装redis6、配置redis&#xff08;基础配置&#xff09;7、启动redis8、本机访问redis9、远程访问redis 二、在线安装1、更新yum源2、安…

k8s 高级调度

搞懂Kubernetes调度 K8S调度器Kube-schduler的主要作用是将新创建的Pod调度到集群中的合适节点上运行。kube-scheduler的调度算法非常灵活&#xff0c;可以根据不同的需求进行自定义配置&#xff0c;比如资源限制、亲和性和反亲和性等。 kube-scheduler的工作原理如下&#x…