TCP窗口控制是实现流量控制的技术手段,其中接收窗口(rwnd)由接收方通告以防止缓冲区溢出,拥塞窗口(cwnd)由发送方根据网络状况自主调整,发送窗口(swnd)取二者最小值,真正约束发送速率。

TCP 窗口控制是实现流量控制的技术手段,而流量控制是它的设计目标。窗口控制本身不区分“谁在控”,它只是定义了数据发送的边界;流量控制特指“由接收方能力驱动的速率限制”,核心在于防止接收缓冲区溢出。
窗口控制:发送与接收的双向边界机制
窗口控制泛指所有基于“窗口大小”字段协调收发行为的机制,包括:
- 接收窗口(rwnd):接收方在每个 ACK 中通告的、当前还能接收多少字节的数据,直接反映其应用层读取速度和内核缓冲区剩余空间
- 拥塞窗口(cwnd):发送方根据网络反馈(如丢包、延迟)自主维护的窗口,代表它认为当前网络能承受的最大未确认数据量
- 发送窗口(swnd):实际允许发送的数据上限,取值为 min(rwnd, cwnd) —— 它同时受接收能力和网络状况双重约束
流量控制:专指由接收方驱动的端到端限速
流量控制是窗口控制中明确以“接收方处理能力”为唯一依据的那一部分,特点鲜明:
- 控制信号单向发出:仅由接收方通过 ACK 报文中的 16 位窗口字段(配合窗口扩大因子)通知发送方
- 触发条件明确:当接收缓冲区趋近满时,rwnd 减小;满时置为 0,发送方必须暂停发送
- 恢复机制可靠:发送方启动持续计时器,定期发送零窗口探测报文;接收方只要缓冲区有空,就在 ACK 中更新非零 rwnd
- 不关心网络链路:即使网络通畅、无丢包,只要接收方来不及读数据,流量控制就会生效
为什么容易混淆?关键在“窗口”一词的多义性
“TCP 窗口”在不同语境下指向不同对象:
- 说“TCP 使用滑动窗口进行流量控制”,这里的“滑动窗口”指代的是 rwnd 驱动的接收端反馈机制
- 说“Linux 内核调整 TCP 窗口大小”,可能是在调优 rwnd 初始值(如 net.ipv4.tcp_rmem),也可能是在干预 cwnd 增长策略(如启用 BBR)
- 抓包看到 TCP 头部的 Window 字段,它只承载 rwnd,永远不携带 cwnd —— 这是发送方本地状态,不出现在报文中
一个典型交互帮你理清关系
假设客户端向服务器上传大文件:
- 服务器应用层读取缓慢 → 接收缓冲区堆积 → rwnd 从 64KB 逐步降到 0 → 客户端停止发送(流量控制生效)
- 此时若网络突然拥塞丢包 → 客户端检测到超时或重复 ACK → 主动缩小 cwnd → 即使 rwnd 恢复为 32KB,swnd 仍被 cwnd 压制在更小值(拥塞控制介入)
- 最终 swnd = min(32KB, cwnd),真正决定客户端下一步发多少的,是这两个窗口里更紧的那个


















