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

TCP 拥塞控制算法 —— 慢启动(Slow Start)笔记

一、TCP 拥塞控制概述

TCP 拥塞控制(Congestion Control)是指在网络发生拥塞时,控制数据发送速率,避免网络资源被耗尽。
主要采用四种机制:

  • 慢启动(Slow Start)
  • 拥塞避免(Congestion Avoidance)
  • 快重传(Fast Retransmit)
  • 快恢复(Fast Recovery)

本节重点介绍 慢启动


二、慢启动(Slow Start)原理

2.1 慢启动的目的

  • 防止初始阶段因发送速率过快导致网络拥塞
  • 通过逐步探测网络的可用带宽

2.2 工作机制

  • 初始阶段

    • 拥塞窗口(cwnd)设置为 1 MSS(最大报文段)
    • 每收到一个确认(ACK),cwnd 增加 1 MSS
  • 指数增长

    • 每个 RTT(往返时延),cwnd 会翻倍
    • 这种指数增长会持续到达到一个阈值(ssthresh)
  • 达到阈值后

    • 切换到 拥塞避免 阶段,改为线性增长

2.3 关键参数

参数说明
cwnd拥塞窗口,控制发送端能发送的未确认数据量
ssthresh拥塞窗口阈值,慢启动和拥塞避免的分界点
MSS最大报文段长度,通常为 1460 字节

三、慢启动过程图示

时间轴
|
| cwnd = 1
| cwnd = 2  (收到1个ACK,增长1)
| cwnd = 4  (收到2个ACK,各增长1)
| cwnd = 8  (收到4个ACK,各增长1)
| ...
| cwnd >= ssthresh(进入拥塞避免)
|
  • 每轮 RTT,cwnd 翻倍
  • 增长速度很快,直到接近带宽上限或发生丢包

四、慢启动与拥塞避免的关系

  • 慢启动阶段
    快速增长,指数级
  • 拥塞避免阶段
    缓慢增长,线性级

如果发生超时或丢包,ssthresh 通常会减半,cwnd 重置为 1,重新进入慢启动。


五、触发条件与阈值调整

事件动作
正常 ACK 收到cwnd 按规则增长
超时发生ssthresh = cwnd / 2,cwnd 重置为 1
快重传触发ssthresh = cwnd / 2,进入快恢复

六、慢启动和带宽利用

  • 慢启动能快速增加数据发送速率,充分利用带宽
  • 但如果 ssthresh 设置不当,可能触发丢包或超时
  • 实际应用中,TCP 会根据网络状态动态调整

七、典型 TCP 拥塞控制曲线

cwnd
^
|         /-- 慢启动 (指数增长)
|        /
|       / 
|------/---- 拥塞避免 (线性增长)
|     /
|    /
|---/---- 丢包发生,cwnd 收缩
|
+---------------------> 时间

八、常见面试高频考点

  • 为什么叫慢启动?
    相对于直接满速发送,“慢启动” 是指从 1 MSS 开始,防止瞬间占满带宽,实际增长很快。

  • 慢启动会一直进行下去吗?
    不会,达到 ssthresh 后转为拥塞避免,发生丢包会重置。

  • 丢包后会怎样?
    超时重传会让 cwnd 重置为 1,进入慢启动,ssthresh 设为 cwnd / 2

  • 慢启动是拥塞控制还是流量控制?
    拥塞控制,面向网络,防止网络拥塞。


九、总结

特性说明
控制目的探测网络可用带宽,防止一开始发送过快
窗口增长每收到一个 ACK,cwnd 增加 1 MSS
增长模式指数增长
切换条件cwnd >= ssthresh 后,进入拥塞避免
丢包处理cwnd 重置,ssthresh 调整
http://www.lryc.cn/news/590752.html

相关文章:

  • 能行为监测算法:低成本下的高效管理
  • AlpineLinux的用户管理
  • 同态加密赋能大模型医疗文本分析:可验证延迟压缩的融合之道
  • MPPT电路设计
  • LVS集群调度器
  • 解决容器dns问题
  • LVS四种模式及部署NAT、DR模式集群
  • Liunx-Lvs配置项目练习
  • Python函数全解析
  • 横向移动(中)
  • 使用YOLOv11实现水果类别检测:从数据到模型训练的全过程
  • 每日钉钉API探索:getAuthCode实现免登授权
  • 测试工作中的质量门禁管理
  • Maven入门指南:生命周期、阶段和执行顺序详解
  • 基于FPGA的IIC控制EEPROM读写(1)
  • 项目流程管理系统使用建议:推荐13款
  • 华为OD机试_2025 B卷_完美走位(Python,100分)(附详细解题思路)
  • ES组合使用must与should时的注意事项
  • 【LeetCode刷题指南特别篇】--移除链表元素,调试技巧,链表分割
  • Linux4:线程
  • TRAE + Milvus MCP:用自然语言 0 门槛玩转向量数据库
  • OpenVela之 Arch Timer 驱动框架使用指南
  • UltraISO编辑ISO文件
  • Karate(Java)接口自动化测试框架
  • 二刷 黑马点评 分布式锁-redission
  • 基于Canal实现MySQL数据库数据同步
  • Alamofire 网络请求全流解析,通俗易懂
  • ai 编程工具,简单总结
  • Python脚本批量修复文件时间戳,根据文件名或拍摄日期
  • 达梦数据库CASE_SENSITIVE大小写敏感差异比较