# TCP 滑动窗口的作用是什么?
7 min read
Table of Contents
TCP 滑动窗口的作用是什么?
TCP 滑动窗口的作用
【核心定义】
TCP 滑动窗口是一种流量控制与拥塞控制机制,它通过动态调整发送方与接收方之间的数据窗口大小,在保证可靠传输的前提下,最大限度地提升网络吞吐量,并避免因发送过快而导致的数据包丢失或网络拥塞。
【关键要点】
- 流量控制:接收方通过
rwnd(接收窗口)告知发送方其缓冲区剩余空间,防止发送方发送数据过快导致接收方缓冲区溢出。 - 拥塞控制:发送方通过
cwnd(拥塞窗口)动态探测网络承载能力,避免过多数据包涌入网络造成拥塞崩溃。 - 提高吞吐量:允许发送方在未收到确认的情况下连续发送多个数据段,将串行的“发送-确认”模式改为并行流水线,显著减少等待时间,充分利用带宽。
- 保证可靠性与顺序性:窗口内的数据按序发送与确认,通过累积确认(ACK)和选择性重传(SACK)机制确保数据完整到达。
【深度推导/细节】
核心矛盾:可靠传输 vs. 传输效率
- 问题:如果每发一个报文段就等待一个ACK(停止-等待协议),RTT(往返时间)将成为性能瓶颈,带宽利用率极低。
- 解决方案:引入滑动窗口,将发送缓冲区划分为四部分:
| 已发送且已确认 | 已发送未确认 | 允许发送但未发送 | 不允许发送 |
- 窗口滑动过程:
- Step 1:发送方根据
min(rwnd, cwnd)确定当前可用窗口大小。 - Step 2:在可用窗口内连续发送数据包。
- Step 3:接收方收到数据后,返回ACK,其中包含:
- 确认号:期望收到的下一个字节序号(累积确认)。
- 窗口大小:更新后的
rwnd。
- Step 4:发送方收到ACK后,窗口向前“滑动”,已确认的数据被移出窗口,新的空间可用于发送后续数据。
- Step 5:如果发生丢包(超时或收到3个重复ACK),触发重传机制,并进入拥塞控制算法(如慢启动、拥塞避免、快速重传、快速恢复)。
- Step 1:发送方根据
关键数字与设计合理性
- MSS(最大报文段长度):通常1460字节(以太网MTU 1500 - 40字节TCP/IP头部)。
- 初始窗口(IW):现代TCP(如RFC 6928)将初始拥塞窗口设为 10个MSS,以加速短连接传输。
- 慢启动阈值(ssthresh):动态调整,初始值通常为接收方窗口大小,用于控制慢启动与拥塞避免的切换点。
【关联/对比】
- TCP vs. UDP:UDP无滑动窗口,不保证可靠性与顺序性,但延迟更低。
- 流量控制 vs. 拥塞控制:
- 流量控制:端到端,基于接收方能力(
rwnd),防止接收缓冲区溢出。 - 拥塞控制:基于网络状况,通过
cwnd避免网络过载,涉及慢启动、拥塞避免、快速重传、快速恢复等算法。
- 流量控制:端到端,基于接收方能力(
- TCP Tahoe/Reno/NewReno/CUBIC:不同TCP实现版本在拥塞控制算法上有差异,如CUBIC采用三次函数而非线性增长,更适合高带宽长延迟网络。
『面试官追问』
-
滑动窗口为0时会发生什么?
- 发送方停止发送数据(除探测报文),接收方在缓冲区有空闲后通过 窗口更新报文(ACK + 新rwnd) 或 零窗口探测报文 重新打开窗口。
-
如果接收方的ACK丢失,发送方会一直等待吗?
- 不会。TCP有 超时重传机制(RTO),同时接收方后续的ACK(确认更大序号)具有累积确认效应,能确认之前的所有数据。
-
滑动窗口与拥塞窗口的关系?
- 实际发送窗口大小 =
min(rwnd, cwnd)。rwnd是接收方的“能力上限”,cwnd是网络“健康上限”,两者共同制约发送速率。
- 实际发送窗口大小 =
-
什么是糊涂窗口综合征?如何避免?
- 当接收方每次只腾出少量缓冲区空间,导致发送方发送很小报文,降低传输效率。
- 避免方法:接收方采用 David D. Clark算法,仅当缓冲区空间 ≥
min(MSS, 缓冲区大小/2)时才通告新窗口;发送方采用 Nagle算法,合并小数据包(但可能增加延迟)。
-
TCP如何保证顺序性?
- 接收方将乱序到达的数据暂存于缓冲区,仅当按序到达的数据才向上层交付,并通过ACK告知发送方期望的下一个序号。
【版本差异】
- 传统TCP:初始cwnd为1-2个MSS,慢启动增长较慢。
- 现代TCP(如Linux默认的CUBIC):初始cwnd为10个MSS,并采用更积极的拥塞避免算法,在高带宽网络中性能更优。
- TCP选择性确认(SACK):允许接收方告知发送方哪些数据块已收到,使发送方仅重传丢失的片段,而非整个窗口,提升重传效率。