前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库TCP 滑动窗口 流量控制 零窗口
计算计算机网络传输与协议

TCP 滑动窗口如何实现流量控制,零窗口时会发生什么

TCP滑动窗口流量控制的核心是接收方用rwnd限制发送方在途数据量,当rwnd减到0时发送方暂停数据发送,转而靠窗口探测周期询问,防止双方死等。

前端进阶之旅 · 一题精讲更新于 2026.09.05
计算机网络#传输与协议#网络协议#算法
先看核心答案
理解线索

rwnd限速与零窗口恢复

  1. rwnd含义接收方通告可用缓冲区字节数
  2. 滑动限制发送未确认数据不超过rwnd
  3. 零窗口探测持续计时器发1字节查询窗口

流量控制只依据rwnd,不混入cwnd

核心回答

先记住这个答案

接收方通过TCP报文头部窗口字段通告剩余缓冲区大小即rwnd,发送方把已发送未确认的字节数控制在这个值内,从而让接收方的处理速度反作用于发送速率。当rwnd降为0,发送方被禁止发送任何业务数据,同时启动持续计时器;计时器到点后发送一个携带1字节数据的窗口探测报文,接收方仍会回ACK并附带最新rwnd,若已恢复非零则继续发送,否则以更长间隔再次探测。该机制不依赖窗口更新报文的可靠传递,有效避免双方互相等死。

  • 接收窗口只由接收缓冲区空闲量决定
  • 零窗口时发送方不发数据只发窗口探测
  • 窗口更新报文丢失靠探测兜底

滑动窗口用rwnd限速与死锁风险

接收进程读取速度决定缓冲区空余量。TCP每段头部Window字段通告rwnd,发送方将已发送未确认字节数控制在rwnd内。当缓冲区填满,接收方通告rwnd=0,发送方停止发送业务数据。若仅靠数据ACK传递窗口,则窗口更新报文可能丢失,发送方将无限等待,形成死锁。

解决方式是持续计时器。发送方开启persist timer,间隔采用指数退避,到点时发送仅带1字节数据的窗口探测报文。探测报文因有新数据必须被ACK,接收方回复ACK并携带当前rwnd;若仍为0则重置计时器,若大于0则发送方按新窗口恢复发送。这样即使窗口更新报文丢失,也能及时感知并打破死锁。

接收应用处理缓慢导致零窗口

条件:接收缓冲区64KB,发送方有持续大数据流待发,rwnd初值64KB。应用读取速率降至1KB/s,发送方连续发送40KB后缓冲区占用40KB,应用只读了5KB,于是剩余空闲为29KB,即rwnd=29KB;随后发送方再发送29KB,期间应用又读走1KB,rwnd降至1KB;发送方最后发出1KB且应用未读,缓冲区满,rwnd变为0。此时发送方停发,并启动持续计时器。

计时器1秒后发送1字节窗口探测,接收方回ACK仍为0。计时器2秒、4秒后重复,应用缓慢读走2KB后,探测ACK中rwnd=2048。发送方恢复发送,但为避免再次立刻填满堆积小报文,采用窗口阈值策略:只在rwnd达到一个全尺寸报文段(如MSS)时才发送,否则继续等待,防止糊涂窗口综合症。最终数据在约5秒内随应用处理速度分批送出。

零窗口机制的失效条件与代价

零窗口死锁的解除依赖持续计时器,这在TCP可靠传输下稳定,但若接收方不复用连接而是直接关闭,发送方会收到RST终止,而非继续探测。探测报文若因网络丢包而丢失,TCP重传机制能保证探测不会永久丢失。但探测本身会消耗带宽与接收方处理:即使rwnd长期为0,每个退避间隔仍会唤醒接收方一次。

另一种失效是接收方宣告的rwnd远小于MSS,发送方频繁启动停止会产生大量小报文,浪费40字节头部开销。业界建议用socket选项开启窗口收缩限制与延迟ACK,并在接收方通过动态调整缓冲区大小或预先提高SO_RCVBUF来减少零窗口概率。若延迟敏感,应用应监控吞吐骤降,而不能只依赖TCP被动等待。

回答前,多想一步

容易答错的地方

把零窗口当拥塞窗口为0
零窗口是接收方缓冲区空余不足,rwnd=0;拥塞窗口为0表示网络拥塞,cwnd初始较小但不会因接收方变0。两者主体和触发原因不同,实际发送窗口取二者较小值,但零窗口场景只应讨论rwnd。
窗口探测可以不带数据
探测必须携带1字节新数据,这样它作为数据报文才能被可靠确认并携带新rwnd;若为空ACK序列,无法保证对端回应且可能被延迟确认合并,导致长时间无法获知窗口状态。
试着用自己的话回答

面试官还会怎么问?

持续计时器的超时值如何计算?

默认基本值通常为1秒,之后指数退避并设最大间隔(如60秒,具体依赖实现),窗口探测使用数据重传保证,超时变化只影响恢复速度,不破坏可靠性。

如果接收方进程一直不读,发送会永远阻塞吗?

在连接有效期内发送方会无限次探测,但TCP设了用户超时和保活机制,最终可能在数百秒后判定连接异常并终止。零窗口本身不是错误,它只是接收方繁忙的信号。

窗口通告值的单位是什么?

单位是字节。TCP首部的16位窗口字段以字节计数,最大65535字节;启用窗口缩放选项后可扩大到更大值,缩放因子由握手协商确定。

从一道题,走向一组知识

把知识连起来

传输与协议

TCP 通过哪些机制保证可靠传输

同属「传输与协议」专题,接着看 TCP 可靠传输 机制 在具体场景中的处理方式。

传输与协议

TCP 的 SACK 选择性确认解决了什么问题

同属「传输与协议」专题,接着看 TCP SACK 选择性确认 在具体场景中的处理方式。

参考资料

  • HTTP: Hypertext Transfer Protocol

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 滑动窗口用rwnd限速与死锁风险
  3. 接收应用处理缓慢导致零窗口
  4. 零窗口机制的失效条件与代价
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑