一、TCP流量控制(Flow Control)

定义:通过调节发送方的发送速率,确保接收方能够及时处理数据,避免缓冲区溢出。
本质:解决发送方与接收方之间的"端到端"速率匹配问题。

1. 实现机制:滑动窗口协议
  • 窗口大小(Window Size):接收方通过TCP报文段中的窗口字段告知发送方自己当前的接收缓冲区可用空间。
  • 动态调整过程
    1. 接收方收到数据后,在ACK中反馈剩余缓冲区大小(即窗口大小)。
    2. 发送方根据窗口大小限制发送数据量,窗口为0时暂停发送。
  • 示例:若接收方缓冲区大小为1000字节,已占用400字节,则窗口大小为600字节,发送方最多发送600字节数据。
2. 关键问题与解决方案
  • 窗口关闭(Zero Window):当接收方缓冲区满时,发送窗口为0的ACK,发送方进入等待状态。
    • 解决:接收方定期发送"窗口探测报文"(Window Probe),通知发送方窗口更新。
  • 糊涂窗口综合征(Silly Window Syndrome):接收方频繁发送小窗口通知,导致发送方发送大量小包,浪费网络资源。
    • 解决
      • 接收方策略:缓冲区达到一半或最大段大小(MSS)时再通知窗口更新。
      • 发送方策略:使用Nagle算法,将小包合并为大包发送。

在这里插入图片描述

二、TCP拥塞控制(Congestion Control)

定义:通过监控网络负载情况,动态调整发送方的发送速率,避免网络拥塞(如分组丢失、延迟激增)。
本质:解决网络中多发送方与路由器之间的"全局"流量管理问题。

1. 核心算法:四阶段控制模型
  • 1. 慢开始(Slow Start)

    • 初始拥塞窗口(cwnd)设为1个MSS,每次收到ACK后cwnd按指数增长(×2)。
    • 触发条件:连接建立或超时重传后。
    • 阈值(ssthresh):当cwnd超过ssthresh时,切换到拥塞避免阶段。
  • 2. 拥塞避免(Congestion Avoidance)

    • cwnd按线性增长(每轮RTT增加1个MSS),避免网络负载激增。
    • 当检测到丢包时,进入快重传或慢开始。
  • 3. 快重传(Fast Retransmit)

    • 若收到3个重复ACK,认为分组丢失,立即重传而不等待超时。
    • 重传后将ssthresh设为当前cwnd的一半,cwnd设为ssthresh,进入快恢复。
  • 4. 快恢复(Fast Recovery)

    • 不执行慢开始,直接从拥塞避免阶段继续,cwnd线性增长。
2. 拥塞检测机制
  • 丢包检测
    • 超时(Timeout):未收到ACK且等待时间超过阈值,认为严重拥塞,触发慢开始。
    • 重复ACK:收到3次相同ACK,认为分组丢失,触发快重传。
三、流量控制与拥塞控制的对比
维度流量控制拥塞控制
目标防止接收方缓冲区溢出防止网络整体拥塞
控制范围端到端(发送方与接收方之间)全局(整个网络路径)
触发因素接收方缓冲区容量网络中路由器队列溢出、分组丢失
关键参数接收窗口(rwnd)拥塞窗口(cwnd)、阈值(ssthresh)
实现方式接收方反馈窗口大小发送方主动调整发送速率
典型算法滑动窗口协议慢开始、拥塞避免、快重传、快恢复
四、实际应用与案例
  • 流量控制场景:手机APP与服务器通信时,若手机内存有限,服务器需根据手机反馈的窗口大小调整发送速率,避免APP崩溃。
  • 拥塞控制场景:当网络中多个用户同时下载大文件时,TCP通过拥塞控制算法自动降低每个连接的发送速率,避免路由器拥塞导致全网瘫痪。
五、总结

TCP通过流量控制和拥塞控制的协同工作,在复杂网络环境中实现了可靠性与效率的平衡:

  • 流量控制确保数据"送得进去"(接收方处理能力);
  • 拥塞控制确保数据"送得出去"(网络路径通畅)。
    两者缺一不可,共同构成了TCP协议在互联网中稳定运行的核心基础。
六、整体流程

在这里插入图片描述
最开传送数据的时候,会采用慢开始算法,执行到我们的拥塞窗口的值,达到慢开始门限的值之后,就开始执行拥塞避免算法,拥塞避免执行到什么时候呢?这时候分为两种情况:第一种是发生超时,第二种是收到3个ACK(确认)分组。发生超时的时候,它会将慢开始的门限值变为当前拥塞窗口(cwnd)的一半,同时将拥塞窗口的值变为1,重新执行慢开始算法。同样的,达到慢开始门限值之后,执行拥塞避免算法,这是第一种情况,发生超时的情况。第二种情况就是收到3个确认的分组,这种情况的话,它会将它慢开始的门限值变为当前拥塞窗口的一半,同时也将拥塞窗口的值变为当前拥塞窗口的一半,也就是和调整后的慢开始门限值相同。这时候执行的是快恢复算法。

为什么在TCP的拥塞控制中,如果发生了丢包,接收端会向发送端发送3个ACK,而不是2个或者4个,偏偏是3个?

  • 背景:TCP 的拥塞控制机制需要在快速检测丢包和避免过度反应之间取得平衡。
  • 解释:
  • 两个重复 ACK:可能不足以表明丢包的严重性,容易导致误判。
  • 三个重复 ACK:是一个合理的阈值,既能有效检测丢包,又能避免因偶然的网络波动而触发不必要的重传。
  • 四个或更多重复 ACK:虽然可以进一步减少误判,但会增加检测丢包的延迟,降低网络效率。
七、检测

可以自己试着做一下,下面的这道题,检测自己是否真正掌握了拥塞控制的整体流程
在这里插入图片描述
答案:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

iOS多端兼容性调试:一次iOS性能优化分工具协作排查过程

在多技术栈混合开发日益普及的今天,iOS应用中越来越多地集成了WebView、Flutter、React Native甚至小程序模块。而这些模块带来的复杂性,不仅体现在UI适配,还包括数据同步、系统权限管理、线程调度等方面的问题。 本文记录的是我们在处理一个…

秋招Day14 - MySQL - 索引

索引为什么能够提高MySQL的查询效率? 索引可以理解为目录,通过索引可以快速定位数据,避免全表扫描 一般是B树结构,查找效率是O(log n)。 索引还能加速排序、分组、连接等操作。 create index idx_name on students(name); 能简…

第5天:LSTM预测火灾温度

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 复用LSTM模型实现火灾温度预测 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch &am…

目标检测之YOLOV11自定义数据使用OBB训练与验证

一、前置条件与环境准备 在开始训练前,确保已完成以下准备《目标检测之YOLOV11自定义数据预处理——从原始标注到YOLO-OBB格式转换与验证》: 数据目录结构: yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程进阶一(Labview与OPC UA设备通信)

1.Labview与OPC UA设备通信 OPC UA通信协议优势显著,具体表现如下: 跨平台兼容:支持多种操作系统和硬件平台,实现无缝数据交换。高安全性:内置加密、身份验证和授权机制,确保数据传输安全。高效数据交换:采用二进制编码和优化的传输协议,提高通信效率。复杂数据建模:…

【Comsol教程】如何求解指定范围的积分 或 在积分中去除奇异点/异常值

我们在Comsol中经常需要对物体的边界求积分,比如求物体在流场中所受的总流体牵引力,又或者是物体在电场中受到的总介电泳力。当物体的材料或者边界条件存在突变时,物体表面的粘性应力或者麦克斯韦电应力可能会存在异常值。通常解决方法有细化…

Python 多版本治理理念(Windows 平台 · 零基础友好)

🧠 Python 多版本治理理念(Windows 平台 零基础友好) 🌐 核心原则:三维治理、四级隔离、五项自治 以下是基于人工智能深度学习环境搭建实践,总结出的"零基础入门 Conda工具链 全隔离项目环境"…

Python文件管理利器之Shutil库详解

Shutil是一个Python内置的用来高效处理文件和目录迁移任务的库。Shutil不仅支持基本的文件复制、移动和删除操作,还具备处理大文件、批量迁移目录、以及跨平台兼容性等特性。通过使用Shutil,我们可以更加轻松地实现文件系统的管理和维护,本文…

学习华为 ensp 的学习心得体会

引言​ 在信息技术日新月异的今天,网络技术作为连接世界的桥梁,其重要性不言而喻。作为一名对网络技术充满热情的大一新生,我选择了 eNSP(Enterprise Network Simulation Platform,企业网络模拟平台)作为我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一个小案例讲解:控制面板(GUI)

# 好吧,每天更新实在有点艰巨,我尽量少量多次 代码仓 所有代码都会上传到这里,可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 运行效果图 ​ 知识要点 一、安装dat.gui npm i dat.gui 二、使用步骤&a…

飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究

以下是一篇关于飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究的论文 ,涵盖理论分析、数学模型构建、控制策略设计及仿真验证等内容,适用于电气工程、新能源技术等领域的研究参考。 飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究 摘要 随着风电在电力…

一次性理解Java垃圾回收--简单直接方便面试时使用

Java的垃圾回收是一个面试必问题,只要按照下面的步骤回答肯定不会有大问题。 1.先告诉面试官垃圾回收分为两大步: a.识别哪些对象是"垃圾"(不再被使用的对象) b.回收这些垃圾对象占用的内存空间 2. 接下来分别介绍标记阶段和回收阶段的细节…

XML映射文件-辅助配置

如果你没有按照同包同名来,就要下面的配置,指定好路径 1.把路径改为类下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路径和

题目 解答: 直接按照空间复杂度O(n)来做了。这种明显是动态规划,每一层用到上一层的信息。 观察数据形状,如下: (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 设dp[n],定义为本层第n…

仕么是Transformer以及工作原理和架构

Transformer 是一种革命性的**深度学习架构**,由 Google 团队在 2017 年论文《Attention is All You Need》中提出。它彻底改变了自然语言处理(NLP)领域,并逐渐扩展到计算机视觉、语音识别等多模态任务。其核心创新在于**完全依赖…

opencv 锁页内存的使用

在OpenCV的CUDA编程中,cv::cuda::HostMem类用于管理锁页内存(Page-Locked Memory)​,这种内存能显著提升主机(CPU)与设备(GPU)间的数据传输效率。而.createMatHeader()正是将HostMem…

亚远景-ASPICE与ISO 26262:理解汽车软件质量保障的双标体系

在汽车行业向智能化、电动化转型的背景下,ASPICE(Automotive SPICE)与ISO 26262作为汽车软件质量保障的两大核心标准,分别从过程能力与功能安全两个维度构建了完整的开发管理体系。以下从标准定位、核心差异、协同实践及行业价值四…

数组的应用

Java数组的基本概念 数组是Java中一种重要的数据结构,用于存储固定大小的相同类型元素。数组在内存中连续分配空间,可以通过索引快速访问元素。数组的声明和初始化是使用数组的基础,声明时需要指定数据类型和数组名称,初始化可以…

基础RAG实现,最佳入门选择(七)

增强型RAG系统的查询转换 采用三种查询转换技术,以提高RAG系统中的检索性能,而无需依赖于像LangChain这样的专门库。通过修改用户查询,我们可以显著提高检索信息的相关性和全面性。 关键转换技术 1.查询重写:使查询更加具体和详…