Sunday面试指南

TCP 流量控制和拥塞控制有什么区别?滑动窗口控制的是什么?

🧑‍💻 面试官:TCP 窗口变小,是不是接收方处理不过来?

🙋‍♂️ 我:对,窗口告诉发送方还能发多少。

🧑‍💻 面试官:如果接收方空闲,可中间网络已经堵住呢?

🙋‍♂️ 我:还得靠拥塞窗口限制。

🧑‍💻 面试官:那 rwnd 和 cwnd 同时存在,真正能继续发多少怎么判断?

流量控制保护接收方,拥塞控制保护网络路径。发送还要看两者限制,以及已经发出但未确认的数据。

面试速答(60 秒版)

TCP 流量控制主要根据接收方通告的窗口 rwnd,避免发送过量让接收缓冲承受不了。拥塞控制由发送方维护 cwnd,根据网络反馈调整发送规模,避免持续把网络压满。

发送时,未确认数据量要受两者的较小限制约束。能再发多少,还要减去已经在途的未确认数据,不能把 min(rwnd, cwnd) 直接当成新增发送额度。

滑动窗口让发送方可以连续发送一定范围内的数据,不必每段都等 ACK;确认推进后,窗口可继续向前。

慢启动、拥塞避免和恢复是经典机制,实际系统也可能使用 CUBIC、BBR 等算法。排查时先分清接收慢、网络反馈和应用供数慢,不把所有吞吐低都叫拥塞。

接收窗口和拥塞窗口分别限制发送,简化新增额度还须扣除未确认数据

知识点详解:两种窗口,分别在保护谁

接收方窗口,先回答还能装多少

假设接收端应用暂时忙,读取 socket 缓冲的速度下降。TCP 接收缓冲里的数据增多,接收方可能通告更小的窗口。

发送方据此减少新数据,避免不断把对方装不下的数据发过去。窗口为零时还有探测等机制,等待对方重新有空间;它不是直接把连接判定成永久失败。

这是接收能力反馈。接收端机器配置很强,也可能因为应用迟迟不读而出现这个问题。

拥塞窗口,回答网络能承受多大在途量

接收方有空间,中间路由与链路也可能排队或丢包。发送方利用 ACK、丢包、ECN 或不同算法关注的反馈调整 cwnd。

经典慢启动会在有利反馈下较快增长,拥塞避免则采用更保守的增长;遇到丢失后的行为还依赖具体恢复算法和事件。

这里讲的是基础模型,不能声称所有现代 TCP 都严格按同一幅锯齿曲线变化,也不能把丢包唯一归因于拥塞。

额度要减掉已经发出去的部分

假设 rwnd 是 64 KB,cwnd 是 32 KB,已经有 20 KB 发出但尚未确认。按简化窗口模型,新数据空间约为 12 KB,而不是 32 KB。

ACK 推进已确认的范围,窗口就能向前滑动。发送方还可能受到 pacing、应用是否有数据等其他约束,所以这个算式是解释限制,不是实际发送速率计算器。

窗口控制的是在途范围或数量,不能直接等同“每秒可以发多少”。速率还受到往返时延等影响。

从监控现象,回到哪一方限制

如果接收窗口持续很小,先看对端读取与缓冲;如果拥塞窗口小、重传多,再看网络路径及算法反馈。应用自己供数不足、服务端磁盘慢,也会表现为网络吞吐低。

高延迟路径下,只增加带宽未必提高一个窗口受限连接的吞吐。需要结合 RTT、在途量、发送与接收缓冲判断,而不是盲目关闭拥塞机制。

性能测试也不能只在本机回环做一次。不同延迟和丢包环境下的行为,才能说明系统是否满足真实传输需求。

本题机制参考:TCP 窗口、经典拥塞控制、CUBIC。

面试官继续追问

接收窗口大,发送方就可以无限发吗?

不能,仍受 cwnd、未确认数据以及发送调度等限制。

滑动窗口就是拥塞窗口吗?

不是同义词。滑动窗口描述序号范围推进的机制,接收窗口和拥塞窗口有不同信息来源与目的。

慢启动为什么不一定真的慢?

它是从初始规模逐步探测,而不是固定低速;经典阶段在 ACK 反馈下增长很快,实际表现看算法和网络。

面试速记卡

  • rwnd:接收方可接收能力。
  • cwnd:发送方根据网络反馈维护的限制。
  • 新额度:简化看 min(rwnd,cwnd) 减未确认数据。
  • 滑动:ACK 推进范围,不逐包停等。
  • 排查:接收、网络、应用供数分别找证据。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历