深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制

news2025/5/11 15:28:37

TCP(Transmission Control Protocol)是一个面向连接、可靠传输的协议,支撑着绝大多数互联网通信。在实现可靠性的背后,TCP 引入了多个关键机制:重传机制滑动窗口流量控制拥塞控制。这些机制共同协作,确保了网络传输的稳定性、高效性和公平性。

本文将从这四大模块出发,逐层剖析其工作原理及内部联系。


一、TCP 重传机制

1.1 超时重传

当 TCP 发送方发出一个数据段后,如果在预定时间内没有收到 ACK(确认),就会触发超时重传。这个时间称为 重传超时时间 RTO(Retransmission Timeout)

RTO 的计算通常使用 RTT(往返时间)预测算法,结合抖动值进行加权调整。

作用:解决数据包丢失或 ACK 丢失问题。

1.2 快速重传

快速重传避免了等待 RTO 超时时间。当接收方连续收到三个相同的 ACK(称为 Duplicate ACK)时,发送方立刻重传对应的段,认为该段可能丢失。

好处:显著缩短丢包检测时间,提高吞吐量。

1.3 SACK 方法(Selective Acknowledgment)

SACK(选择性确认)机制允许接收方告诉发送方:我收到了哪些数据段,即便这些段是不连续的。

例如,收到段 #1、#2、#4、#5,丢了 #3,那么接收方会告诉发送方:我收到了 #1-#2 和 #4-#5。发送方据此只需重发 #3,而不是整个窗口。

对比快速重传:SACK 更细粒度、效率更高。

1.4 Duplicate SACK

一种对 SACK 的增强,用于进一步标明哪些段被重复收到了,有助于快速判断拥塞与丢包状态。

ack包丢失:

网络延时:


二、滑动窗口机制

2.1 滑动窗口定义

滑动窗口是 TCP 中的核心机制之一,用于控制发送方可以连续发送多少字节而无需等待 ACK。其大小取决于接收方通告窗口(rwnd)和拥塞窗口(cwnd)中较小的值。

我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个,这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。

一发一ack:

为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率

2.2 工作原理

  • 每次发送新的数据后,窗口向右滑动;

  • 收到 ACK 后,窗口继续向右滑动;

  • 丢包或拥塞时,窗口收缩。

作用:保持网络“流水线式”的高效传输。


三、流量控制

3.1 基本思想

流量控制主要是为了防止发送方“发太快”,而接收方“接不过来”。这依赖于接收方通告窗口(rwnd),它告诉发送方“我还能接收多少数据”。

3.2 缓冲区与窗口的关系

接收方在操作系统内核中分配一段 缓冲区 存储 TCP 数据。rwnd 就是这个缓冲区剩余大小的反映。

⚠️ 若发送数据快于应用层消费速度,缓冲区满,rwnd=0,发送方必须暂停发送。

可能出现的情况:

为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况

3.3 窗口关闭

当 rwnd=0 时,TCP 会暂时关闭窗口,不再发送数据。发送方会周期性发送“窗口探测包”(Zero Window Probe)询问接收方缓冲是否已空。

3.4 糊涂窗口综合症(Silly Window Syndrome)

当接收方的缓冲区空闲很少就通告窗口,或发送方每次只发一点点数据,这会导致网络效率极低。这种现象称为“糊涂窗口综合症”。

解决方式:
  • 接收方策略:不通告过小窗口;

  • 发送方策略(Nagle算法):累积数据后再发送。


四、拥塞控制

拥塞控制目标是防止发送方过快发送数据导致网络拥塞。TCP 通过以下机制动态调节发送速率:

4.1 慢启动(Slow Start)

初始时 cwnd 很小(1 MSS),每收到一个 ACK 就将 cwnd 加倍(指数增长)。直到达到阈值(ssthresh)或出现丢包为止。

✅ 作用:逐步探测网络能力,防止突发冲击。

4.2 拥塞避免(Congestion Avoidance)

当 cwnd > ssthresh 后,进入线性增长阶段,即每个 RTT 只增长 1 MSS,避免过快增大窗口。

4.3 拥塞发生(例如快速重传触发)

  • cwnd 减半(乘法减小);

  • ssthresh 设置为一半;

  • 重回慢启动或进入快速恢复。

4.4 快速恢复

当触发快速重传时,不进入慢启动,而是认为网络并未严重拥塞,因此采用 快速恢复算法

  • 将 cwnd 设置为 ssthresh;

  • 继续进入拥塞避免阶段。


五、四大机制的联系与整体架构

我们将四部分的核心关系梳理如下:

模块控制目标核心机制所需信息
重传机制保证可靠传输超时重传、快速重传、SACKACK、RTT
滑动窗口提升效率流水线式传输发送窗口
流量控制防止接收方被压垮接收窗口控制 rwnd缓冲区
拥塞控制保持网络稳定慢启动、拥塞避免、快速恢复丢包信号、ACK 统计

总结一句话
TCP 通过滑动窗口提高吞吐,通过流量控制保护接收端,通过拥塞控制避免网络瘫痪,而重传机制是保证可靠性基石。

参考:4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding

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

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

相关文章

uniapp-商城-51-后台 商家信息(logo处理)

前面对页面基本进行了梳理和说明,特别是对验证规则进行了阐述,并对自定义规则的兼容性进行了特别补充,应该说是干货满满。不知道有没有小伙伴已经消化了。 下面我们继续前进,说说页面上的logo上传组件,主要就是uni-fil…

springboot 加载 tomcat 源码追踪

加载 TomcatServletWebServerFactory 从 SpringApplication.run()方法进入 进入到 refresh () 方法 选择实现类 ServletWebServerApplicationContext 进入到 AbstractApplicationContext onRefresh() 方法创建容器 找到加载bean 得到 webServer 实例 点击 get…

使用countDownLatch导致的线程安全问题,线程不安全的List-ArrayList,线程安全的List-CopyOnWriteArrayList

示例代码 package com.example.demo.service;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class UnSafeCDTest {Executor…

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C - 仿 RabbitMQ 实现消息队列(1)(环境搭建) 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…

RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译

概述: 本文主要描述了,如何在ubuntu-20.04操作系统上,编译RK3568平台的OpenHarmony 5.1版本。 搭建编译环境 a. 安装软件包 sudo apt-get install git-lfs ruby genext2fs build-essential git curl libncurses5-dev libncursesw5-dev openjdk-11-jd…

eFish-SBC-RK3576工控板外部RTC测试操作指南

备注: 1)测试时一定要接电池,否则外部RTC断电后无法工作导致测试失败; 2)如果连接了网络,系统会自动同步NTP时钟,所以需要关闭自动同步时钟。 关闭自动同步NTP时钟方法: 先查看是…

vue3的深入组件-组件 v-model

组件 v-model 基本用法​ v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏&#xff1a; <script setup> const model defineModel()function update() {model.value } </script><template>…

【MySQL】数据库、数据表的基本操作

个人主页&#xff1a;Guiat 归属专栏&#xff1a;MySQL 文章目录 1. MySQL基础命令1.1 连接MySQL1.2 基本命令概览 2. 数据库操作2.1 创建数据库2.2 查看数据库2.3 选择数据库2.4 修改数据库2.5 删除数据库2.6 数据库备份与恢复 3. 表操作基础3.1 创建表3.2 查看表信息3.3 创建…

TCP的连接管理

三次握手 什么是三次握手&#xff1f; 1. 第一次握手&#xff08;客户端 → 服务器&#xff09; 客户端发送一个 SYN 报文&#xff0c;请求建立连接。 报文中包含一个初始序列号 SEQ x。 表示&#xff1a;我想和你建立连接&#xff0c;我的序列号是 x。 2. 第二次握手&a…

初识Linux · 传输层协议TCP · 下

目录 前言&#xff1a; 滑动窗口和流量控制机制 流量控制 滑动窗口 1.滑动窗口如何移动 2.滑动窗口的大小如何变化的 3.如果发生了丢包如何解决&#xff08;快重传&#xff09; 拥塞控制 延迟应答 面向字节流 RST PSH URG 什么是 PSH&#xff1f; 什么是 URG&…

什么是分布式光伏系统?屋顶分布式光伏如何并网?

政策窗口倒计时&#xff01;分布式光伏如何破局而立&#xff1f; 2025年&#xff0c;中国分布式光伏行业迎来关键转折&#xff1a; ▸ "430"落幕——抢装潮收官&#xff0c;但考验才刚开始&#xff1b; ▸ "531"生死线——新增项目全面市场化交易启动&…

完整进行一次共线性分析

&#xff08;随便找个基因家族&#xff09; 1.数据收集 使用水稻、拟南芥、玉米三种作物进行示例 可以直接去ensemble去找最标准的基因组fasta文件和gff文件。 2.预处理数据 这里对于fasta和gff数据看情况要不要过滤掉线粒体叶绿体的基因&#xff0c;数据差异非常大&#…

RabbitMQ--基础篇

RabbitMQ 简介&#xff1a;RabbitMQ 是一种开源的消息队列中间件&#xff0c;你可以把它想象成一个高效的“邮局”。它专门负责在不同应用程序之间传递消息&#xff0c;让系统各部分能松耦合地协作 优势&#xff1a; 异步处理&#xff1a;比如用户注册后&#xff0c;主程序将发…

Quorum协议原理与应用详解

一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议&#xff0c;通过权衡一致性&#xff08;C&#xff09;与可用性&#xff08;A&#xff09;实现数据冗余和最终一致性。其核心规则为&#xff1a; W&#xff08;写成功副本数&#xff09; …

vue搭建+element引入

vue搭建element 在使用Vue.js开发项目时&#xff0c;经常会选择使用Element UI作为UI框架&#xff0c;因为它提供了丰富的组件和良好的设计&#xff0c;可以大大提高开发效率。以下是如何在Vue项目中集成Element UI的步骤&#xff1a; 1. 创建Vue项目 如果你还没有创建Vue项…

食物数据分析系统vue+flask

食物数据分析系统 项目概述 食物数据分析系统是一个集食物营养成分查询、对比分析和数据可视化于一体的Web应用。系统采用前后端分离架构&#xff0c;为用户提供食物营养信息检索、食物对比和营养分析等功能&#xff0c;帮助用户了解食物的营养成分&#xff0c;做出更健康的饮…

SPDK NVMe of RDMA 部署

使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先&#xff0c;我们需要从GitHub上克隆SPDK的源码仓库。打开终端&#xff0c;输入以下命令&#xff1a; git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…

【Redis】缓存和分布式锁

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、缓存&#xff08;Cache&#xff09; 概述 Redis最主要的应用场景便是作为缓存。缓存&#xff08;Cache&#xff09;是一种用于存储数据副本的技术或组件&#xff0c;…

OpenLayers 精确经过三个点的曲线绘制

OpenLayers 精确经过三个点的曲线绘制 根据您的需求&#xff0c;我将提供一个使用 OpenLayers 绘制精确经过三个指定点的曲线解决方案。对于三个点的情况&#xff0c;我们可以使用 二次贝塞尔曲线 或 三次样条插值&#xff0c;确保曲线精确通过所有控制点。 实现方案 下面是…

大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调

文章目录 一、简介二、如何安装2.1 安装2.2 校验 三、开始使用3.1 可视化界面3.2 使用命令行3.2.1 模型微调训练3.2.2 模型合并3.2.3 模型推理3.2.4 模型评估 四、高级功能4.1 分布训练4.2 DeepSpeed4.2.1 单机多卡4.2.2 多机多卡 五、日志分析 一、简介 LLaMA-Factory 是一个…