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

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.xdnf.cn/news/15315.html

相关文章:

  • 8-day06预训练模型
  • 揭示张量分析的强大力量:高级研究的基础-AI云计算拓展核心内容
  • Django老年健康问诊系统 计算机毕业设计源码32407
  • 从就绪到终止:操作系统进程状态转换指南
  • 将手工建模模型(fbx、obj)转换为3dtiles的免费工具!
  • 上半年净利预增66%-97%,高增长的赛力斯该咋看?
  • 聊一聊在 Spring Boot 项目中自定义 Validation 注解
  • 牛客小白月赛119
  • 进程状态 + 进程优先级切换调度-进程概念(5)
  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • Qt中QGraphicsView类应用解析:构建高效2D图形界面的核心技术
  • 数据结构-顺序表
  • 【C语言网络编程】HTTP 客户端请求(域名解析过程)
  • Oracle字符类型详解:VARCHAR、VARCHAR2与CHAR的区别
  • Qt数据库编程详解:SQLite实战指南
  • 解决Linux绑定失败地址已使用(端口被占用)的问题
  • 设计仿真 | MSC Apex Simufact实现铁路铰链轻量化与高精度增材制造
  • 在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
  • MySQL:分析表锁的常见问题
  • JavaScript加强篇——第四章 日期对象与DOM节点(基础)
  • P9755 [CSP-S 2023] 种树
  • 【JavaScript高级】构造函数、原型链与数据处理
  • OS16.【Linux】冯依诺曼体系结构和操作系统的浅层理解
  • docker-compose安装常用中间件
  • 【unitrix】 4.21 类型级二进制数基本结构体(types.rs)
  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • C语言的程序控制语句
  • VR协作海外云:跨国企业沉浸式办公解决方案
  • 决策树算法在医学影像诊断中的广泛应用
  • ch07 题解