概述

tcp-header.jpg

TCP 的 Window 表头用于指定滑动窗口的大小,单位是字节。因为 Window 占 16 位,所以 TCP 的标准滑动窗口最大为 2^16-1=65535 个字节。另外,Options 表头包含滑动窗口的扩大因子。滑动窗口的主要作用有:


发送窗口

在任何时刻,TCP 会话的发送方的缓冲区中的数据都可以分为四类:

已发送但是未收到对端 ACK 的未发送但是对端允许发送的,这两部分数据被称为发送窗口

send-window-1.jpg

上图中的提议窗口就是接收方 ACK 时通报的窗口。

只有在收到对端的 ACK 时,发送窗口的左边缘才会移动。并且当收到的 ACK 要求左边缘左移的时候,会被丢弃,因为它是重复的确认。

窗口两端的运动会增加或减少窗口的大小。我们使用三个术语描述窗口边缘的左右运动:

send-window-2.jpg

如果窗口的左边缘和右边缘重合,就称它为“零窗口”。它将停止发送者传输任何数据。


接收窗口

在任一时刻,TCP 会话的接收方的缓冲区,可以分为三部分:

其中,允许接收数据的部分就是接收窗口。

receive-window.png

接收窗口的移动:


发送窗口和接收窗口的关系

TCP 是全双工的,可以同时传送和接收数据,因此 TCP 会话的两端各自维护一个接收窗口和发送窗口。其中,接收窗口的大小受限于应用程序、硬件、系统等;而发送窗口的大小则取决于对端通告的接收窗口。


滑动窗口和 Socket 缓冲区的关系


参考文档