“拥塞控制调整发送端对共享网络施加的在途压力;流量控制调整它对接收端缓存的压力。二者共同约束发送。本页选择RFC5681(2009)的Reno式慢启动、拥塞避免、快速重传与快速恢复规则,讨论单…”
形式陈述
TCP可在等待确认时继续发送后续字节,但接收缓存有限。接收方通告窗口rwnd表示从当前ACK位置开始愿意接收的序号范围;发送者据最新有效窗口信息限制新增数据。窗口向右移动使已确认的位置退出、未来位置进入,因而称滑动窗口。
本页用不绕回的展开序号,令
若再考虑拥塞窗口
为明确缓存义务,设接收应用已消费前缀末端为
真实TCP还要过滤陈旧窗口更新、处理序号绕回及可能的窗口收缩。接收方不应收缩已经通告的右边界;本页的
直觉
ACK回答“前面已收到哪里”,窗口回答“后面还预留多少位置”。接收者可能已确认一批数据,却尚未交给应用,因此ACK前进而窗口同时缩小;发送者释放了重传副本,也未必获得更多发送额度。
把接收缓冲变大可以延迟堵塞,但不会让一个永久不读数据的应用突然开始消费。流控把这种下游压力逐步传回发送端。这里滑动的是可接收序号范围;滑动窗口数据流则按时间或最近项数淘汰统计对象,二者不是同一个问题。
例子与边界
发送快照为
再设接收端
对于第一快照,若同时有cwnd=800,在途
推论与应用
窗口单位是字节,带宽单位是字节/秒,二者经RTT联系。在理想稳定流水、无损且ACK及时的简化模型中,窗口
应用背压必须继续约束TCP缓冲之外的队列。若网络线程不停read然后把数据搬入无限应用队列,TCP窗口一直很宽,也可能把进程内存耗尽。
多个流共享一个连接时,还需同时检查各流上限与连接合计。多流信用与最终长度使用单调绝对许可和4+3账本,说明重传不重复计费、RESET仍须按最终长度结算;这与本页TCP的ACK加通告窗口坐标不同。
参考资料
- RFC 9293,§§3.8.6–3.8.6.2:窗口管理、右边界收缩与零窗口探测;本页
是便于证明的固定格子模型。 - Peterson、Davie,Computer Networks: A Systems Approach,在线6.2-dev版,§5.2.4:发送/接收前沿与流量控制。