滑动窗口
1. 基本概念
- “窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;
- “滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。
TCP滑动窗口是TCP协议实现流量控制的核心机制,它通过动态调整窗口大小来控制发送方的发送速率,确保接收方能够及时处理到达的数据包,同时避免网络拥塞。
滑动窗口的大小意味着接收方还有多大的缓冲区(内存占用)可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。
作用与优势
- 流量控制:防止发送方发送速率过快导致接收方缓冲区溢出
- 提高效率:允许连续发送多个数据包而不必等待单个确认
- 全双工通信:支持双向数据传输,各自维护发送和接收窗口
- 自适应:根据网络状况和接收方处理能力动态调整
拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。
拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。
为了进行拥塞控制,TCP发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。
拥塞的标志
- 重传计时器超时
- 接收到三个重复确认
工作机制
-
慢开始
慢开始不是指cwnd的增长速度慢(指数增长),而是指TCP开始发送设置cwnd=1。
-
初始阶段:当TCP连接刚建立或检测到超时重传时,拥塞窗口(cwnd)被初始化为1个最大报文段(MSS)
-
指数增长:每收到一个有效ACK确认,cwnd增加1个MSS
- 第1个RTT:发送1个报文 → cwnd=1 → 收到1个ACK → cwnd=2
- 第2个RTT:发送2个报文 → 收到2个ACK → cwnd=4
- 第3个RTT:发送4个报文 → 收到4个ACK → cwnd=8
-
增长限制:当cwnd达到慢开始阈值(ssthresh)时,转入拥塞避免阶段
-
-
拥塞避免
-
触发条件:当cwnd ≥ ssthresh时进入该阶段
-
线性增长:每个往返时延(RTT)只将cwnd增加1个MSS
- 实现方式:每收到一个ACK,cwnd增加1/cwnd
- 例如:cwnd=10时,收到10个ACK后,cwnd=11
-
持续监测:保持这种保守的增长方式直到检测到拥塞
-
-
快重传
- 重复ACK检测:当发送方连续收到3个相同的ACK(即第4个相同ACK)时
- 立即重传:不等超时定时器触发,立即重传疑似丢失的报文段
- 判定依据:重复ACK表示接收方收到了乱序报文,暗示可能有报文丢失
-
快恢复
- 阈值调整:将ssthresh设置为当前cwnd的一半(但不小于2个MSS)
- 窗口调整:设置cwnd = ssthresh + 3*MSS(补偿网络中已存在的3个报文)
- 阶段转换:进入拥塞避免阶段而非慢开始阶段
- 持续传输:继续发送新数据(如有)而非完全停止
拥塞控制与流量控制的区别
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。拥塞窗口解决数据通信的网络性能。
流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。滑动窗口解决 发送方和接收方 / 客户端和服务端 本身的问题。