在前面的文章中《TCP 的交互数据流》我们可以知道,TCP 的成块数据流是在要求传输效率较高的情况下使用,例如 FTP。对于这些要求传输 TCP 最长报文段的应用,TCP 协议采用了滑动窗口协议,使发送端在等待确认前可以连续发送多个分组。
一般来说,发送端发送一个 TCP 数据报,则接收端就应该发送一个 ACK 数据报。但在实际应用中却并非如此,而是发送端将连续发送数据报保存在接受端的缓冲区中,并且尽量使其填满,接受端对这些连续发送的数据报只发送一个 ACK 报文应答,这就是 ACK 的累积特性,这个特性大大减少了发送端和接收端的负担。
滑动窗口
滑动窗口的滑动是以字节为单位的,窗口是在建立 TCP 连接时,通信双方协商好的接收端的窗口。窗口大小本质上是发送端在等待确认之前所发送数据的最大值。如果发送端收到接受端的窗口大小为 0 的 TCP 数据报,则表示发送端将停止发送数据,等到接受端发送窗口大小不为 0 的数据报的到来。
以下是窗口协议中窗口变化的三种情况:
- 窗口合拢,即窗口 左边沿 向 右边沿 靠近。这种现象发生在数据被发送和确认时;
- 窗口张开,即窗口 右边沿 向右移动,此时将允许发送更多的数据。这种现象一般发生在另一端