Tcp滑动窗口是什么
1. 滑动窗口的工作原理
TCP 是双工协议,通信双方都同时拥有发送窗口和接收窗口。
1.1 发送窗口
发送方的滑动窗口是其发送缓冲区的一部分,用于管理正在发送和等待确认的数据。发送窗口内的数据可以分为四个部分:
- 已发送且已收到 ACK 确认:这部分数据已经成功送达并被接收方确认,发送方不再需要保留。
- 已发送但尚未收到 ACK 确认:这部分数据已经发出,但还在“飞行”途中,或者接收方已经收到但 ACK 还没返回。发送方必须在缓冲区中保留这些数据以备重传。
- 未发送但接收方允许发送:这部分数据位于发送窗口内,可以立即发送。这部分也被称为“可用窗口”。
- 未发送且接收方不允许发送:这部分数据超出了当前发送窗口的范围,暂时不能发送。
当发送方收到接收方发来的 ACK 时,发送窗口就会向右滑动。例如,如果收到了对之前发送的第 1 到 100 字节的确认,那么发送窗口的左边界就会移动到第 101 字节,同时允许发送更多的数据。
1.2 接收窗口
接收方的滑动窗口同样是其接收缓冲区的一部分,用于管理接收到的数据。接收窗口内的数据可分为三类:
- 已接收并已发送确认:这部分数据已经被应用程序读取,缓冲区空间可以被释放。
- 未接收但准备接收:这是接收窗口的主体,表示可以接收的数据序列号范围。
- 已接收但未按序到达:如果接收方收到了一个序列号在窗口内但不是期望的下一个序列号的数据包(例如,先收到了第 201-300 字节,但还在等待 101-200 字节),它会先将这个乱序的数据包缓存起来,等待缺失的数据包到达。
接收窗口的大小取决于应用程序、操作系统和硬件的限制。接收方会通过 TCP 报头中的“窗口大小”字段,将自己当前可用的缓冲区大小(即接收窗口大小)告知发送方。
2. 滑动窗口如何实现流量控制
流量控制的目的是防止发送方发送数据的速度过快,导致接收方来不及处理,从而造成数据丢失。 滑动窗口通过以下方式实现流量控制:
- 接收方通告窗口大小:接收方在每次发送 ACK 时,都会在 TCP 头部捎带上自己当前的接收窗口大小(rwnd)。
- 发送方调整发送速率:发送方根据收到的 rwnd 值来调整自己的发送窗口大小,确保发送的数据量不会超过接收方的处理能力。
- 零窗口与窗口探测:如果接收方的缓冲区满了,它会通告一个大小为 0 的窗口。此时,发送方会停止发送数据,并启动一个持续计时器,定期发送一个小的“窗口探测”包,以查询接收方的窗口是否已经更新。
3. 滑动窗口与拥塞控制
除了点对点的流量控制,滑动窗口也是 TCP 拥塞控制机制的基础。拥塞控制的目的是防止过多的数据注入到网络中,导致网络中的路由器或链路过载。
TCP 引入了一个名为“拥塞窗口”(cwnd)的状态变量。发送方实际的发送窗口大小是 取拥塞窗口(cwnd)和接收方通告的窗口(rwnd)中的较小值。
- 慢启动:连接刚建立时,cwnd 通常被设置为一个较小的值(例如 1 个 MSS),然后随着每个 ACK 的接收呈指数级增长。
- 拥塞避免:当 cwnd 增长到一定阈值(ssthresh)后,其增长方式变为线性,以更慢的速度探测网络带宽。
- 拥塞发生:当网络出现拥塞(例如发生丢包),发送方会减小 cwnd,从而降低发送速率。
通过动态调整拥塞窗口,TCP 能够适应网络状况的变化,有效地避免和缓解网络拥塞。
4. 丢包与重传机制
滑动窗口机制与 TCP 的重传策略紧密结合,确保了数据的可靠传输。
- 超时重传:发送方为每个发送的数据包都设置一个计时器。如果在规定时间内没有收到对应的 ACK,就会认为该数据包已经丢失,并进行重传。
- 快速重传:如果发送方连续收到三个或以上相同的 ACK(重复 ACK),它会判断这个 ACK 对应的序列号之后的数据包很可能已经丢失,于是在超时计时器到期前就立即重传该数据包。