TCP 慢启动:网络不是一上来就全速冲刺

你打开一个网页时,浏览器和服务器之间并不是立刻把数据塞满整条网络。TCP 会先试探一下:我先发一点点包,看看路上有没有堵车;如果对方顺利确认收到了,再把发送量翻倍。这个过程叫 slow start,中文通常叫“慢启动”。

名字有点误导。它不是一直慢,而是从小心开始,然后增长得很快。TCP 维护一个叫拥塞窗口的东西,英文是 congestion window,常写成 cwnd。你可以把它理解成“当前最多允许在路上飞着、还没被确认的数据量”。刚连接时 cwnd 很小,收到 ACK 之后就变大;在慢启动阶段,它大致按指数增长:1、2、4、8、16……

问题在于,网络不是你一个人的。如果一开始就全速发送,路由器队列可能被瞬间塞爆,丢包、重传、延迟都会上来。慢启动的聪明之处,是先用 ACK 当反馈信号:对方确认得越顺,说明路上暂时还能承受更多数据;一旦出现丢包或超时,TCP 就知道自己冲过头了,要收缩窗口。

难点在这里:

这也是为什么小文件传输有时吃不满带宽。文件还没来得及把 cwnd 涨大,传输就结束了。很多网络优化,比如连接复用、HTTP/2、HTTP/3,背后都有一个现实目标:别让每个请求都重新从小窗口开始爬坡。

如果只记一句话:TCP 慢启动不是保守,而是在没有全局视角的网络里,用最少的信息避免把路搞炸。

#CS