Linux TCP滑动窗口机制本质是用“可发未确认的数据量”动态协调发送节奏,其发送窗口大小swnd=min(rwnd,cwnd),rwnd由接收方通告、cwnd由发送方根据网络状况调节,窗口随ACK推进和网络变化伸缩滑动。

Linux TCP 数据传输中的滑动窗口机制,本质是用“可发未确认的数据量”来动态协调发送节奏,既不让接收方缓冲区溢出,也不让链路空闲。它不是固定大小的盒子,而是一段随ACK推进、随网络状况伸缩的字节区间。
滑动窗口怎么决定能发多少数据
发送窗口大小(swnd)由两个值取小决定:
- 接收窗口(rwnd):接收方在每个ACK报文中通告的剩余缓冲区空间,反映其真实处理能力;
- 拥塞窗口(cwnd):发送方根据网络反馈(丢包、延迟等)自主调节的上限,体现链路承载力。
即:swnd = min(rwnd, cwnd)。只要这个值大于0,发送方就能持续发包;一旦为0,就暂停普通数据发送(仅允许发1字节探测包或紧急数据)。
窗口是怎么“滑动”的
滑动不是整块移动,而是基于序列号的左边界前移:
- 发送方维护一个发送缓冲区,记录已发未确认的数据起始序号(Sbase)和窗口右边界(Sbase + swnd);
- 收到ACK确认某个序号之前的所有数据后,Sbase向前推进,窗口“滑”过已确认区域;
- 新数据填入腾出的空间,只要窗口内还有空间,就继续发送,无需等待单个ACK。
这种机制把多个往返时间(RTT)重叠起来,显著提升吞吐率,尤其在高延迟链路上效果明显。
Linux内核里怎么调这个窗口
关键参数位于/proc/sys/net/ipv4/下,运行时可调整:
- net.ipv4.tcp_window_scaling=1:启用窗口缩放,突破65535字节原始限制,支持更大窗口(如Gbps网络必需);
- net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem:分别控制接收/发送缓冲区的最小、默认、最大值(单位字节),直接影响rwnd和cwnd的初始与上限;
- 窗口实际大小在TCP三次握手时协商,缩放因子(scale factor)随SYN包交换确定。
丢包时窗口怎么应对
滑动窗口本身不直接重传,但为重传机制提供基础支撑:
- 若某段数据丢失,后续ACK仍会重复携带相同确认号(如期望序号1001),触发“快重传”——收到3个冗余ACK,立即重发该段,不等超时;
- 重传发生后,cwnd通常减半(Reno算法),避免加剧拥塞;
- 窗口大小随之收缩,发送速率自动下降,直到网络恢复稳定。


















