概要

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


发送窗口

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

已发送 但是 未收到对端ACK的未发送 但是 对端允许发送的,这两部分数据称之为发送窗口
send-window-1.jpg
上图中的 提议窗口 就是接收方ACK的时候,通报的窗口。
只有在收到对端的ACK的时候,发送窗口的左边缘才会移动。并且当收到的ACK要求左边缘左移的时候,会被丢弃,因为它是一个重复的确认。
窗口两端的运动会增加或减少窗口的大小。我们使用三个术语描述窗口边缘的左右运动:


接收窗口

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

其中,允许接收数据的部分就是接收窗口。
receive-window.jpg
接收窗口的移动:


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

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


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


参考文档