news 2026/4/23 14:57:51

计算机网络基础:TCP 的拥塞控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机网络基础:TCP 的拥塞控制

计算机网络基础:TCP 的拥塞控制详解

TCP 的拥塞控制(Congestion Control)是 TCP 协议中最核心、最复杂的部分之一。
它的目标是:在不让网络崩溃的前提下,尽可能快地、公平地利用网络带宽

简单一句话总结:
TCP 拥塞控制就是让发送方自己“感知”网络是否拥堵,然后动态调整发送速率(拥塞窗口 cwnd)

一、为什么需要拥塞控制?(与流量控制的区别)

  • 流量控制:防止接收方缓冲区被撑爆(靠滑动窗口、接收窗口 rwnd)
  • 拥塞控制:防止网络中间路由器的缓冲区被撑爆(靠拥塞窗口 cwnd)

两者共同决定实际发送窗口:
实际发送窗口 = min(cwnd, rwnd)

如果没有拥塞控制,TCP 会像“疯狂发消息”一样把数据一股脑儿塞进网络,导致路由器丢包 → 全局拥塞崩溃。

二、TCP 拥塞控制的四大核心算法(现代主流 Reno 版本)

TCP 拥塞控制主要由以下四个经典算法组成(TCP Reno):

  1. 慢启动(Slow Start)
  2. 拥塞避免(Congestion Avoidance)
  3. 快速重传(Fast Retransmit)
  4. 快速恢复(Fast Recovery)
1. 慢启动(Slow Start)

核心思想:一开始别发太多,先小步试探网络,确认网络好就指数级加速。

  • 初始时:拥塞窗口 cwnd = 1 MSS(Maximum Segment Size,通常 1460 字节)
  • 每收到一个 ACK,cwnd += 1 MSS
  • 每经过一个 RTT(往返时间),cwnd 翻倍(指数增长)

举例(假设 MSS=1 单位):

轮次cwnd发送包数收到 ACK 后 cwnd 变化
01发 1 个收到 1 个 ACK → cwnd=2
12发 2 个收到 2 个 ACK → cwnd=4
24发 4 个收到 4 个 ACK → cwnd=8
38发 8 个收到 8 个 ACK → cwnd=16

增长规律指数增长(非常快)

结束条件

  • cwnd ≥ ssthresh(慢启动门限,通常初始 64KB 或更大)
  • 发生丢包(超时或收到 3 次重复 ACK)
2. 拥塞避免(Congestion Avoidance)

核心思想:已经试探出网络大致容量了,不能再指数疯涨了,要慢慢线性增长,避免直接撞墙。

  • 当 cwnd ≥ ssthresh 时,进入拥塞避免阶段
  • 每收到一个 ACK,cwnd += 1/cwnd(约等于每个 RTT 增加 1 MSS)

增长规律线性增长(非常稳)

目的:缓慢逼近网络容量,避免突然拥塞

3. 丢包的两种检测方式

TCP 通过两种方式判断网络可能拥塞了:

方式触发条件严重程度处理方式
超时重传RTO(重传超时)到期严重认为网络严重拥塞
快速重传收到 3 个重复 ACK(3 duplicate ACK)较轻只是个别包丢失,网络还活着

现代 TCP 优先用快速重传,因为超时通常意味着更严重的拥塞。

4. 快速重传(Fast Retransmit)

核心思想:别傻等超时!收到 3 次重复 ACK 就知道某个包丢了,马上重传它。

  • 正常 ACK 是累计确认
  • 收到 3 次相同的重复 ACK → 立即重传那个 seq 号的包(不需要等超时)

极大减少了等待时间,提高效率

5. 快速恢复(Fast Recovery)—— Reno 的关键改进

核心思想:既然只是丢了一个包,网络没完全崩,不用从头慢启动,稍微降一点速度继续发。

快速恢复算法(TCP Reno)流程:

  1. 收到 3 次重复 ACK
  2. ssthresh = cwnd / 2(把慢启动门限减半)
  3. cwnd = ssthresh + 3(加 3 是因为已经收到了 3 个重复 ACK,说明这 3 个包已经出队了)
  4. 进入快速恢复状态:每收到一个新的重复 ACK,cwnd += 1(允许继续发新包)
  5. 当收到新 ACK(确认了重传的包):
    • cwnd = ssthresh
    • 退出快速恢复,回到拥塞避免阶段(线性增长)

对比 TCP Tahoe(更老的版本):

  • Tahoe:收到 3 次重复 ACK → 直接 cwnd=1,ssthresh=cwnd/2,进入慢启动(太保守)
  • Reno:快速恢复后直接进入拥塞避免(更激进,性能更好)

三、拥塞控制状态机简图(Reno)

新连接 ↓ cwnd=1 慢启动(指数增长) ↓ cwnd ≥ ssthresh ↓ 拥塞避免(线性增长) ↓ 两种丢包事件: ├── 超时(严重) │ → ssthresh = cwnd/2 │ → cwnd = 1 │ → 回到慢启动 └── 收到 3 次重复 ACK(较轻) → ssthresh = cwnd/2 → cwnd = ssthresh + 3(快速恢复) → 每多一个重复 ACK,cwnd +=1 → 收到新 ACK → cwnd = ssthresh → 回到拥塞避免

四、现代改进(简单了解)

  • TCP New Reno:改进快速恢复,能处理一个窗口内多个包丢失
  • TCP SACK:Selective ACK,选择性确认,告诉发送方哪些包收到了
  • TCP Cubic / BBR(Google):更现代的算法,2020年后很多系统默认使用,适应高带宽大时延网络(BBR 特别适合长肥管道)

五、总结一句话

TCP 拥塞控制的核心策略

  • 慢启动 → 指数试探网络容量
  • 拥塞避免 → 线性平稳逼近容量
  • 快速重传 + 快速恢复 → 轻度丢包时快速响应,不必从头慢启动

一句话口诀
“慢启动指数疯,拥塞避免慢慢升;三重复快重传,快速恢复别太狠。”

如果你想看具体数字示例、cwnd 变化曲线图、Reno vs Tahoe 对比、或 BBR 的原理,也可以继续问我,我再给你画得更细~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:18:59

TranslateGemma-12B与MySQL集成:多语言内容管理系统开发

TranslateGemma-12B与MySQL集成:多语言内容管理系统开发 1. 为什么需要数据库驱动的多语言内容管理 做国际化产品时,最让人头疼的往往不是翻译本身,而是如何让翻译内容真正活起来。我见过太多团队把翻译结果存在Excel表格里,每次…

作者头像 李华
网站建设 2026/4/23 10:47:38

R语言数据处理:骑行时长的平均值计算

在数据分析和处理中,如何有效地从时间格式的数据中提取和计算统计信息是一个常见的问题。本文将介绍如何使用R语言中的aggregate函数来计算骑行时长(ride_length)的平均值,并且将结果按会员类型(member_casual)分类展示。 数据背景 我们有一个包含骑行数据的data.frame…

作者头像 李华
网站建设 2026/4/23 13:44:21

Fish-Speech-1.5与VITS整合:语音合成模型微调实战

Fish-Speech-1.5与VITS整合:语音合成模型微调实战 1. 为什么需要微调Fish-Speech-1.5 你有没有遇到过这样的情况:用现成的语音合成工具生成的声音,听起来总有点“机器味”,不够自然,或者音色和你想要的完全不一样&am…

作者头像 李华
网站建设 2026/4/23 9:23:37

Qwen3-ASR-0.6B模型微调:领域自适应训练指南

Qwen3-ASR-0.6B模型微调:领域自适应训练指南 1. 为什么需要对Qwen3-ASR-0.6B做微调 你可能已经试过Qwen3-ASR-0.6B的开箱即用效果,它在通用场景下确实表现不错——日常对话、会议记录、新闻播报这些任务基本都能应付。但当你把模型用在法律咨询录音转写…

作者头像 李华
网站建设 2026/4/23 12:23:47

Kook Zimage 真实幻想 Turbo 实现Web爬虫数据可视化

Kook Zimage 真实幻想 Turbo 实现Web爬虫数据可视化 你是不是也遇到过这种情况?辛辛苦苦写了个爬虫,从网上抓回来一大堆数据,结果面对着一堆密密麻麻的表格、数字和文本,头都大了。数据是有了,可怎么才能让别人一眼就…

作者头像 李华
网站建设 2026/4/23 12:19:03

高清生成作品:户外运动装备雪地模式视觉化改写结果

高清生成作品:户外运动装备雪地模式视觉化改写结果 1. 这不是滤镜,是会听指令的修图师 你有没有试过——想把一张登山包的宣传图改成雪地场景,却卡在调色、加雪、换光影的繁琐步骤里?或者想快速给越野跑鞋配一张极寒环境实拍感的…

作者头像 李华