TCP的拥塞控制(Congestion Control)是核心机制之一,用于动态调整发送方的数据传输速率,避免网络因过载而出现性能急剧下降(如丢包、延迟激增)。其核心思想是探测网络可用带宽,并在拥塞发生时主动降低速率。以下是TCP拥塞控制的详细解析:


一、拥塞控制的目标

  1. 避免拥塞:预防网络进入过载状态。

  2. 公平性:多个TCP连接共享带宽时,应公平竞争。

  3. 高效性:尽可能利用可用带宽。


二、核心机制

TCP拥塞控制通过拥塞窗口(Congestion Window, cwnd)实现,它限制了发送方未确认数据的最大量(与接收方的滑动窗口共同决定实际发送窗口)。拥塞控制分为四个阶段:

1. 慢启动(Slow Start)
  • 目的:快速探测网络可用带宽。

  • 规则

    • 初始cwnd = 1 MSS(最大报文段大小,如1460字节)。

    • 每收到一个ACK,cwnd 指数增长(即每RTT翻倍:1 → 2 → 4 → 8...)。

  • 终止条件

    • 达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。

    • 检测到拥塞(如丢包)时,重置ssthresh = cwnd/2,cwnd = 1,重新慢启动。

2. 拥塞避免(Congestion Avoidance)
  • 目的:线性增长避免触发拥塞。

  • 规则

    • 每RTT(往返时间)cwnd 增加1 MSS(线性增长,如8 → 9 → 10...)。

  • 终止条件

    • 发生拥塞(超时或重复ACK)时,调整ssthresh和cwnd。

3. 快速重传(Fast Retransmit)
  • 触发条件:收到3个重复ACK(表明报文段丢失,但后续数据仍能到达)。

  • 动作

    • 立即重传丢失的报文段(无需等待超时)。

    • 进入快速恢复阶段。

4. 快速恢复(Fast Recovery)
  • 目的:在快速重传后平滑恢复,避免突然降速。

  • 规则

    • 设置 ssthresh = cwnd/2cwnd = ssthresh + 3 MSS(补偿已确认的3个重复ACK)。

    • 每收到一个重复ACK,cwnd增加1 MSS。

    • 收到新数据的ACK时,退出快速恢复,进入拥塞避免阶段。


三、拥塞控制的触发事件

  1. 超时重传(Timeout)

    • 视为严重拥塞,直接重置 cwnd = 1,重新慢启动。

  2. 重复ACK(DupACK)

    • 触发快速重传和快速恢复,对拥塞响应更温和。


四、拥塞控制算法演进

1. Tahoe(早期版本)
  • 发生任何拥塞(超时或重复ACK)均重置cwnd=1,效率较低。

2. Reno(改进版)
  • 引入快速恢复,区分超时和重复ACK,减少激进降速。

3. NewReno(优化版)
  • 改进快速恢复,避免多次丢包时频繁退出恢复阶段。

4. CUBIC(Linux默认)
  • 使用立方函数替代线性增长,更适合高带宽延迟网络(BDP)。


五、实例分析

假设初始参数:cwnd=1 MSS,ssthresh=16 MSS,MSS=1460字节。

  1. 慢启动阶段

    • 发送1个报文 → ACK → cwnd=2 → 发送2个报文 → ACKs → cwnd=4 → ...(指数增长)。

  2. 拥塞避免阶段(cwnd≥16):

    • 每RTT cwnd增加1 MSS(如16 → 17 → 18...)。

  3. 快速重传与恢复

    • 若收到3个重复ACK,重传丢失报文,设置cwnd=10(假设原cwnd=20),继续线性增长。


六、拥塞控制 vs. 流量控制

对比项拥塞控制流量控制
目标避免网络过载防止接收方缓冲区溢出
控制对象网络链路接收方窗口(rwnd)
实现机制拥塞窗口(cwnd)滑动窗口(Window字段)
触发信号丢包、延迟增加接收方通告的窗口大小

七、关键参数与公式

  1. 实际发送窗口
    Window=min⁡(cwnd,rwnd)Window=min(cwnd,rwnd)

  2. RTT估算
    SRTT=α×SRTT+(1−α)×NewRTTSRTT=α×SRTT+(1−α)×NewRTT
    (α通常为0.875,平滑波动)


八、现代改进方向

  1. BBR(Bottleneck Bandwidth and RTT)

    • Google提出的算法,基于带宽和延迟探测,替代基于丢包的拥塞控制。

  2. AQM(主动队列管理)

    • 路由器主动丢弃/标记报文(如RED算法),提前避免拥塞。


总结

TCP拥塞控制通过慢启动、拥塞避免、快速重传/恢复的动态调整,在公平性与高效性之间取得平衡。其核心是通过cwnd的增减响应网络状态,确保网络在高负载下仍能稳定运行。

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

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

相关文章

依赖倒置原则 Dependency Inversion Principle - DIP

基本知识 1.依赖倒置原则(DIP)是面向对象设计(OOD)中的五个基本原则之一,通常被称为 SOLID 原则中的 D 2.核心思想: 高层模块不应该依赖低层模块,两者都应该依赖抽象。 (High-level modules sho…

原生input添加删除图标类似vue里面移入显示删除[jquery]

<input type"text" id"servicer-search" class"form-control" autocomplete"off" />上面是刚开始的input <div class"servicer-search-box"><input type"text" id"servicer-search" cla…

整理分享 | Photoshop 2025 (v26.5) 安装记录

导语&#xff1a; 最近整理资源时&#xff0c;发现有朋友在找新版 Photoshop。正好手边有 Photoshop 2025年7月的版本&#xff08;v26.5&#xff09;&#xff0c;就记录下来分享给大家&#xff0c;供有需要的朋友参考。关于这个版本&#xff1a;这个 Photoshop v26.5 安装包&am…

【Redis】Redis 数据存储原理和结构

一、Redis 存储结构 1.1 KV结构 Redis 本质上是一个 Key-Value&#xff08;键值对&#xff0c;KV&#xff09;数据库&#xff0c;在它丰富多样的数据结构底层&#xff0c;都基于一种统一的键值对存储结构来进行数据的管理和操作 Redis 使用一个全局的哈希表来管理所有的键值对…

【RAG优化】深度剖析OCR错误,从根源修复RAG应用的识别问题

1. 引言:OCR——RAG系统中的关键问题 当我们将一个包含扫描页面的PDF或一张报告截图扔给RAG系统时,我们期望它能“读懂”里面的内容。这个“读懂”的第一步,就是OCR。然而,OCR过程并非100%准确,它受到图像质量、文字布局、字体、语言等多种因素的影响。 一个看似微不足道…

【第六节】方法与事件处理器

方法与事件处理器 方法处理器 可以用 v-on 指令监听 DOM 事件: <div id="example"> <button v-on:click="greet">Greet</button></div>绑定一个单击事件处理器到一个方法 greet 。下面在 Vue 实例中定义这个方法 var vm=new V…

大语言模型Claude 4简介

Anthropic公司成立于2021年&#xff0c;由一群OpenAI前员工组成。他们最新发布的大语言模型(Large Language Model, LLM) Claude 4系列包括两个版本&#xff1a;Claude Opus 4和Claude Sonnet 4&#xff1a;(1).Claude Sonnet 4&#xff1a;是Claude Sonnet 3.7的升级&#xff…

国产化PDF处理控件Spire.PDF教程:Python 将 PDF 转换为 Markdown (含批量转换示例)

PDF 是数字文档管理的普遍格式&#xff0c;但其固定布局特性限制了在需要灵活编辑、更新或现代工作流集成场景下的应用。相比之下&#xff0c;Markdown&#xff08;.md&#xff09;语法轻量、易读&#xff0c;非常适合网页发布、文档编写和版本控制。 E-iceblue旗下Spire系列产…

PDF转Markdown - Python 实现方案与代码

PDF作为广泛使用的文档格式&#xff0c;转换为轻量级标记语言Markdown后&#xff0c;可无缝集成到技术文档、博客平台和版本控制系统中&#xff0c;提高内容的可编辑性和可访问性。本文将详细介绍如何使用国产Spire.PDF for Python 库将 PDF 文档转换为 Markdown 格式。 技术优…

深度解析 inaSpeechSegmenter:高效音频语音分割与检测开源工具

项目简介 inaSpeechSegmenter 是法国国家视听研究院(INA)开源的音频分割与检测工具,专为广播、播客、采访、影视等多媒体内容的自动化处理设计。它能够高效地将长音频自动分割为语音、音乐、噪声、静音等片段,并支持性别检测(男声/女声),为后续的语音识别、内容检索、转…

VirtualBox安装Ubuntu 22.04后终端无法打开的解决方案

问题现象在VirtualBox中使用"快速安装"模式安装Ubuntu 22.04后图形终端&#xff08;gnome-terminal&#xff09;无法通过图标或快捷键(CtrlAltT)启动系统其他功能正常根本原因语言环境(Locale)配置异常导致&#xff1a;快速安装模式可能跳过Locale生成步骤gnome-term…

java磁盘操作与IO流(序列化、Properties类)

目录 一、磁盘操作 1、File类&#xff1a; &#xff08;1&#xff09;创建File对象&#xff1a; &#xff08;2&#xff09;获取文件信息&#xff1a; &#xff08;3&#xff09;判断文件 &#xff08;4&#xff09;删除文件 &#xff08;5&#xff09;创建文件&#xff…

【WPF】WPF Prism 开发经验总结:菜单命令删除项时报 InvalidCastException 的问题分析与解决

WPF Prism 开发经验总结&#xff1a;菜单命令删除项时报 InvalidCastException 的问题分析与解决 在 WPF Prism 项目中使用 ContextMenu 执行删除操作时&#xff0c;遇到一个令人疑惑的问题&#xff1a;命令绑定本身没有问题&#xff0c;但点击“删除”菜单后&#xff0c;程序抛…

《WebGL打造高性能3D粒子特效系统:从0到1的技术探秘》

在游戏里,爆炸时四溅的火花、魔法释放时闪烁的光晕;在可视化项目中,数据流动时呈现的璀璨光河,这些令人惊叹的效果,背后离不开强大的技术支撑。而WebGL,作为在浏览器端实现硬件加速3D图形渲染的技术,为我们开启了构建高性能3D粒子特效系统的大门。 WebGL的渲染管线是整…

全国计算机等级考试二级题库【C语言】:程序填空题型——结构体 自制答案详解合辑

二级C语言程序填空题型简介 1、/**********found**********/紧跟的下面一行的程序设空,一般为3个空; 2、常见错误: (1) (2) 3、做题推荐步骤: (1) (2) ---------------一、结构体--------------- 2、题目要求【结构体】 程序通过定义学生结构体变量,存储了学生…

人工智能与城市:城市生活的集成智能

1. 智慧城市的核心价值&#xff1a;从 “硬件堆砌” 到 “智能协同”1.1 传统城市的治理困境全球 55% 的人口居住在城市&#xff0c;到 2050 年这一比例将升至 68%。传统城市管理面临多重挑战&#xff1a;资源分配失衡&#xff1a;早晚高峰主干道拥堵率达 80%&#xff0c;而支线…

Linux下挂载磁盘报superblock错误

Linux下挂载磁盘报superblock错误背景问题现象1、使用fdisk查询设备文件信息2、挂载磁盘&#xff0c;报出fs type错误解决办法1、使用e2fsk命令检查整个磁盘2、resize2fs 命令调整文件系统块大小和物理磁盘块大小3、挂载磁盘&#xff0c;确认修复结果问题思考1、rclone命令做数…

Http证书体系及证书加密流程(通信流程)

一、HTTPS 证书体系&#xff1a;信任的基石 HTTPS 证书体系是保障网络通信安全的核心机制&#xff0c;其本质是一套基于公钥基础设施&#xff08;PKI&#xff0c;Public Key Infrastructure&#xff09; 的信任体系&#xff0c;通过数字证书实现通信双方的身份验证和数据加密&…

【分布式架构】学习路径概述:了解分布式系统的核心问题、解决方案与实战说明

文章目录零、前言一、分布式系统理论1、 分布式系统的一致性问题1.1、一致性问题理论&#xff08;CAP/BASE&#xff09;1.2、 一致性协议与算法&#xff08;Paxos/Raft&#xff09;&#xff1a;选主、分布式锁1.3、 分布式事务(2PC\3PC\TCC)&#xff1a;服务一致性保障与性能2、…

C# 密封类_密封方法 (seadled 关键字)

C#允许将类声明为密封类&#xff0c;密封类不能被继承在什么场景用&#xff1f;答&#xff1a;防止重写某些类导致代码混乱密封类seadled 声明密封类的关键字//seadled 声明密封类的关键字 //密封类不能被继承 sealed class Class1 {public int age;public string name;publi…