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

计算机网络-- TCP 滑动窗口与拥塞控制

一、滑动窗口机制(Sliding Window)📤

💡 目的:实现 流量控制(Flow Control)

1. 基本概念

  • 滑动窗口是一种 接收端控制发送端速度 的机制。

  • 每个 TCP 报文头中有一个 Window Size 字段,表示接收方还能接收的字节数。

2. 工作原理

  • 发送方可以发送的数据量 ≤ 接收方通告的窗口大小。

  • 随着接收方处理并确认(ACK)数据,窗口向前滑动,允许发送更多数据。

3. 示例图解:

    这个窗口如何动的可以去看

             当 A 不断发送数据包时,已发送的最后一个序号就往右移动,直到碰到了窗口的上边界,此时 A 就无法继续发包,达到了流量控制。

           

          但是当 A 不断发包的同时,A 也会收到来自 B 的确认包,此时整个窗口会往右移动,因此上边界也往右移动,A 就能发更多的数据包了。

             

           

         以上都是在窗口大小不变的情况下,而 B 在发给 A 的 ACK 包中,每一个都可以重新设置一个新的窗口大小,如果 A 收到了一个新的窗口大小值,A 会随之调整。

            如果 A 收到了比原窗口值更大的窗口大小,比如 win = 6,则 A 会直接将窗口上边界向右移动 1 个单位。

         

          如果 A 收到了比原窗口值小的窗口大小,比如 win = 4,则 A 暂时不会改变窗口大小,更不会将窗口上边界向左移动,而是等着 ACK 的到来,不断将左边界向右移动,直到窗口大小值收缩到新大小为止。

        

        OK,终于将流量控制问题解决得差不多了,你看着上面一个个小动图,给这个窗口起了一个更生动的名字,滑动窗口

4. 特点

  • 🌐 是端到端的流控机制

  • 📥 防止接收端被“灌爆”;

  • 📉 接收方处理慢时,窗口会减小,甚至为0,暂停发送。


二、拥塞控制机制(Congestion Control)🌐

💡 目的:防止过多数据注入网络导致拥塞

1. 拥塞窗口(Congestion Window, cwnd)

  • 是发送端维护的一个窗口大小,用于限制注入网络的数据量

  • 每次发送数据时,允许的数据量 ≤ min(滑动窗口, 拥塞窗口)


2. 四种核心算法

(1)慢启动(Slow Start)
  • 初始 cwnd = 1 MSS,每收到一个 ACK,就将 cwnd 增加 1 MSS。

  • 指数增长(1→2→4→8...)直到达到慢启动阈值 ssthresh

(2)拥塞避免(Congestion Avoidance)
  • 达到 ssthresh 后,进入线性增长阶段。

  • 每个 RTT 增加 1 MSS(变为 加法增长)。

(3)快重传(Fast Retransmit)
  • 接收方收到重复的 ACK(例如重复 3 次 ACK n),意味着丢包了。

  • 不等超时,立刻重传该数据段

(4)快恢复(Fast Recovery)
  • 不回到慢启动阶段,而是调整:

    • ssthresh = cwnd / 2

    • cwnd = ssthresh

    • 然后进入拥塞避免阶段。


3. 拥塞窗口图解(经典 TCP Tahoe & Reno 行为):

        cwnd▲Reno:|       /''''''''\|     /           \|   /               \| /                   \__+----------------------------→ 时间↖慢启动  ↖拥塞避免   ↖丢包快速重传

三、滑动窗口 vs 拥塞窗口 对比表

项目滑动窗口拥塞窗口
控制目的控制接收方处理能力控制网络拥堵状况
控制方接收端控制发送端自己控制
存储在哪报文的 Window Size 字段发送方内存中的变量
动态调整方式接收方 ACK 通告新窗口大小根据网络 ACK/丢包动态调整
极限值接收方缓存限制网络状况决定的带宽上限


四、TCP 发送窗口 = min(滑动窗口, 拥塞窗口)

在实际发送过程中,TCP 的发送窗口大小取决于:

实际窗口 = min(接收端窗口, 拥塞窗口)

五、其他术语

  • MSS(Maximum Segment Size):TCP 一次发送的最大数据段大小,不包括 TCP 头部。

  • RTT(Round-Trip Time):往返时延,影响 cwnd 增长速率。

  • Zero Window:如果接收端通告窗口为 0,发送端需定时发送窗口探测包。

http://www.lryc.cn/news/598169.html

相关文章:

  • 亚马逊云科技:引领云计算新时代,开启无限可能
  • JavaSE:学习输入输出编写简单的程序
  • 【Unity开发】飞机大战项目实现总结
  • DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B
  • Socket编程入门:从IP到端口全解析
  • element-plus 组件 ElMessage、ElLoading 弹框 和加载css 样式展示异常总结
  • SQL基础⑫ | 视图篇
  • 若用dnf下载的nginx和源文件下载的nginx冲突
  • 【学习路线】JavaScript全栈开发攻略:前端到后端的完整征程
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现卫星图像识别(C#代码,UI界面版)
  • 20-ospf技术
  • Java Map.Entry 核心解析
  • IPSec VPN -- 野蛮模式
  • OSPF开放式最短路径优先
  • C# 泛型(泛型方法)
  • Python中常用标准库(时间库、随机库、正则表达式)
  • pytest官方Tutorial所有示例详解(一)
  • 基于Node.js开发的开源博客平台ghost安装和使用
  • MySQL高可用部署
  • 云原生MySQL Operator开发实战(一):Operator基础与CRD设计
  • Spring MVC中常用注解_笔记
  • nuxt更改页面渲染的html,去除自定义属性、
  • 【Word Press进阶】自定义区块的行为与样式
  • go项目实战二
  • Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)
  • 数据挖掘顶刊TKDE论文分享│ST-LLM+:面向交通预测的图增强时空大语言模型
  • 第五章 Freertos物联网实战 微信小程序篇
  • 从0开始学习R语言-Day56--空间变系数模型
  • Django基础(八)———数据库外键及表关系
  • Transformer Masked loss原理精讲及其PyTorch逐行实现