TCP 流量控制和拥塞控制都会限制发送速度,但保护对象不同。流量控制避免发送端把接收端的缓冲区压满;拥塞控制避免发送端向网络注入过多流量,导致路由器队列积压、丢包和时延上升。一个看接收方能力,一个看路径的网络承载能力。
接收端通过 TCP 首部通告接收窗口 rwnd,表示当前还能接收多少尚未确认的数据。发送方据此限制在途数据,接收缓冲变紧时窗口可能缩小,甚至通告零窗口;发送方需按协议探测窗口何时重新打开。窗口扩大选项可以表示超过首部字段基本范围的接收窗口,但协商与实现受连接条件影响。
拥塞控制由发送端的拥塞窗口 cwnd 等状态控制。经典算法根据确认、丢包或其他拥塞信号调整发送量,常讲慢启动、拥塞避免、快速重传和快速恢复;现代算法的具体机制差异较大。cwnd 不是接收端在报文中直接告诉发送端的数值,而是发送端对网络路径容量的控制状态。
概念上,发送方可用的在途数据上限受接收窗口与拥塞窗口共同约束,通常不能超过二者中较小的限制;另外还要受发送队列、应用数据和协议状态影响。因此只看某一个窗口不足以判断吞吐。接收端窗口很大时,网络拥塞仍可让 cwnd 成为瓶颈;网络空闲时,接收端处理慢也可能由 rwnd 限速。
这两类控制都不等同于应用限流。服务端仍可在业务层限制请求速率、队列长度或并发数;TCP 窗口针对字节传输,无法替应用完成公平调度或优先级控制。
常见追问
rwnd 和 cwnd 分别由谁决定?
rwnd 由接收方依据缓冲区情况通告;cwnd 由发送方拥塞控制算法维护,用来控制网络中的在途数据。
接收窗口很大,为什么发送速度仍然慢?
拥塞窗口可能更小,也可能受 RTT、丢包、应用供数速度、发送队列或接收处理能力等因素限制。实际在途量受多个约束共同影响。
零窗口和网络拥塞是一回事吗?
不是。零窗口表示接收端暂时没有接收空间,是流量控制信号;拥塞是网络路径承载压力,靠拥塞控制算法响应。
快速重传属于流量控制还是拥塞控制?
它属于可靠传输及拥塞控制相关机制,用丢包迹象触发更早重传,并可带动拥塞窗口调整;它不是接收窗口的流量控制。