TCP协议主要依赖不断调整窗口大小来保证数据收发吞吐率。在三次握手时,客户端会告诉服务器自己一次能接收数据量的大小,这就对应客户端的接收窗口以及服务器的发送端口。同理服务器也会告知客户端它一次能接收的数据量,这就成为客户端的发送窗口以及服务器端的接收窗口。
TCP数据发送的灵活之处在于,发送窗口或接收窗口可以根据数据收发的情况不断调整。我们看一种具体情况,假设服务器一次能接收360字节,当客户端把数据发送到服务器时,服务器需要采取两个动作,一是回发ACK包,告知对方接收到数据,二是把数据从缓冲区中推送给上层应用,问题在于第二步往往会有延迟,这就使得服务器不是每次都能接收360字节的数据,于是他就得告诉客户端调整数据发送量以免发送数据过多造成服务器的缓冲区溢出。
数据发送双方根据当前接收缓冲区大小不断调整接收窗口的过程就叫数据流控制,这种控制对数据收发效率非常重要,它能让双方按照对方当前容量来调整数据量大小从而保障数据传输效率,窗口调整以保证数据传输率的过程可如下图所示:
如图所示,服务器一次能接收360字节,因此客户端将它的发送窗口大小设置为360,第一次它向服务器发送140字节,服务器接收到数据后由于它本身还要忙于处理其他请求,因此不能及时将接收的140字节数据全部传递给上层应用程序。假设它只来得及将40字节的数据传递给上层应用,因此缓冲区中还存有100字节,可用空间就是260,于是他回复ACK包时要告知客户端此时服务器的接收窗口是260,于是客户端下次发送数据时就会保证数据大小不超过260.
接下来客户端继续向服务器发送180字节数据,于是服务器的缓冲区又消耗掉180字节,只剩下80字节,于是回复给客户端的ACK包中要告知对方接收窗口调整为80字节。然后客户端再次发送80字节数据,服务器接收后缓冲区全部用尽,此时它不能继续接收新数据,这种情况就叫接收窗口关闭。
假设服务器接收到140字节,此时由于服务器内存紧缺,因此需