当前位置: 首页 > news >正文

11. TCP 滑动窗口、拥塞控制是什么,有什么区别

总结

  1. 滑动窗口:早期网络,通信双方不考虑网络拥挤情况,导致掉包。滑动窗口大小意味着有多少缓冲区接受数据。
  2. 拥塞控制:防止过多数据注入网络中,拥塞控制是一个全局过程,控制网络流量。
  3. 区别:滑动窗口解决掉包问题,拥塞控制解决网络拥塞问题。

TCP 滑动窗口与拥塞控制详解

在 TCP 协议中,为了实现可靠传输高效通信,引入了两个核心机制:滑动窗口(Sliding Window)拥塞控制(Congestion Control)。它们分别从不同的角度优化数据传输过程。


一、滑动窗口(Sliding Window)

✅ 基本概念

滑动窗口是 TCP 实现**流量控制(Flow Control)**的机制,用于控制发送方发送的数据量,确保接收方不会因为数据过多而溢出缓冲区。

✅ 核心作用

  • 控制发送速率,避免接收方缓冲区溢出。
  • 提高传输效率,允许连续发送多个数据包而不必等待每个确认。

✅ 窗口大小含义

  • 表示接收方当前还能接收多少字节的数据(由接收方通过 window 字段告知发送方)。
  • 发送方根据窗口大小决定可以发送的数据量。
[已发送且确认] [已发送未确认] [可发送但未发送] [不可发送]
<----窗口滑动方向---->

✅ 工作流程

  1. 接收方在每次响应中携带自己的接收窗口大小(rwnd)。
  2. 发送方根据接收方窗口大小调整发送的数据量。
  3. 随着接收方不断接收并释放缓冲区,窗口“滑动”,发送方可继续发送新的数据。

二、拥塞控制(Congestion Control)

✅ 基本概念

拥塞控制是 TCP 用来防止网络过载的一种机制,是一种全局性机制,旨在避免因发送方注入过多数据导致网络拥塞甚至崩溃。

✅ 核心作用

  • 防止过多数据注入网络中,造成丢包、延迟增大。
  • 动态调整发送速率,适应当前网络状况。

✅ 主要算法(TCP Reno 中的经典实现)

  1. 慢启动(Slow Start)

    • 初始时以指数方式增加发送窗口。
    • 直到达到慢启动阈值或发生丢包。
  2. 拥塞避免(Congestion Avoidance)

    • 窗口线性增长,更加保守。
    • 避免再次引发网络拥塞。
  3. 快重传(Fast Retransmit)

    • 收到三个重复的 ACK 后立即重传丢失的报文段。
  4. 快恢复(Fast Recovery)

    • 在快重传后进入该阶段,调整拥塞窗口和慢启动阈值。

三、滑动窗口 vs 拥塞控制:主要区别

对比维度滑动窗口(Flow Control)拥塞控制(Congestion Control)
目标防止接收方缓冲区溢出防止网络拥塞
范围点对点通信(发送方 vs 接收方)全局网络环境
影响因素接收方缓冲区大小网络状态(如 RTT、丢包率)
控制机制接收方通过 window 字段反馈窗口大小发送方动态调整拥塞窗口(cwnd)
触发条件接收方处理能力不足网络出现丢包或延迟增大

四、协同工作机制

TCP 的发送窗口最终取的是两个控制机制中的最小值

发送窗口大小 = min(rwnd, cwnd)
  • rwnd:接收方窗口(由滑动窗口控制)
  • cwnd:拥塞窗口(由拥塞控制算法决定)

这意味着即使接收方还有空间接收数据,但如果网络已经拥塞,发送方也会减缓发送速度。


五、一句话总结

滑动窗口解决的是接收端缓冲区问题,而拥塞控制解决的是网络整体负载问题;两者共同协作,确保 TCP 既能高效传输又能稳定运行在网络环境中。


六、扩展知识:现代改进方案

  • BBR(Bottleneck Bandwidth and RTT):Google 提出的新型拥塞控制算法,基于带宽和延迟建模,不再依赖丢包作为拥塞信号。
  • CUBIC TCP:Linux 内核默认使用的拥塞控制算法,性能优于 Reno,在高速网络中表现更好。

http://www.dtcms.com/a/273789.html

相关文章:

  • 正义的算法迷宫—人工智能重构司法体系的技术悖论与文明试炼
  • KeyError: “No object named ‘MambaIRv2Model‘ found in ‘model‘ registry!“
  • iOS 数组如何设计线程安全
  • netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)
  • Rail开发日志_3
  • uniapp+unipush推送配置
  • 阿里云MaxCompute SQL与Apache Hive区别面面观
  • 开疆智能EtherCAT转CANopen网关连接台达伺服驱动器配置案例
  • 大模型及agent开发6 OpenAI Assistant API 高阶应用 - 流式输出功能
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • redis数据结构和数据类型
  • Redis实战案例
  • Java 面试题超详细解析(二)
  • Windows下的redis
  • 小木的机器学习日记——KNN
  • lua中检查静态常量是否正确引用
  • 每天一个前端小知识 Day 28 - Web Workers / 多线程模型在前端中的应用实践
  • 【web应用】若依框架前端报表制作与导出全攻略(ECharts + html2canvas + jsPDF)
  • 界面组件DevExpress WPF中文教程:Grid - 如何检查节点?
  • Windows 应用程序的 UI 框架:WPF、WinUI 3 和 UWP的差异区别
  • VMware安装Centos 7
  • pandas销售数据分析
  • 十年架构心路:从单机到云原生的分布式系统演进史
  • 七牛云运维面试题及参考答案
  • MySQL 的语言体系
  • 【InnoDB存储引擎4】行结构
  • 报错 | “pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,
  • day17 力扣654.最大二叉树 力扣617.合并二叉树 力扣700.二叉搜索树中的搜索 力扣98.验证二叉搜索树
  • 数据库迁移人大金仓数据库
  • 多表查询-2-多表查询概述