TCP连接的发送速率和接收速率是不一致的,接收方处理数据的速度和发送方发送数据的速度可能不匹配,因此若不能使发送方与接收方同步的话,会导致数据的丢包。
滑动窗口能比较好的解决这个问题。滑动窗口的机制是在服务端设置一个接受窗口,接收窗口值由数据接收端指定,以字节数形式存储于TCP报文头,在TCP进行三次握手连接的时候,通知窗口信息,使得发送方的发送窗口与接收方的接收窗口同步。
提问:
TCP如何进行流量控制?
TCP请求连接服务器进行三次握手时,服务器会在响应报文段中将接收窗口值,以字节数形式存储于TCP报文头,客户端接收到此报文段之后根据此信息调整自己的发送窗口。客户端保证自己发送的数据都在发送窗口之内,已发送还未确认的数据也在发送窗口和发送缓冲区中,不在发送窗口的数据不可发送。
服务端保证对于乱序到达的数据存储在接收缓冲区中,使用累积确认,每次收到乱序报文段时,发送一个ACK,表示希望客户端什么样的数据,时刻调整窗口大小。
需要注意:当服务端将rwnd=0的信息通报给客户端之后,客户端将不再发送数据,等待服务端处理完接收缓冲区的数据之后,服务端将rwnd=40的信息通报给客户端,但因为某种原因,该报文段在传输过程中丢失,此时双方则陷入了一个死锁状态,客户端将不再发送数据,而服务端等待接收数据,为了TCP遇到这种情况时,客户端在收到rwnd=0的信息之后,依然会发送一个只有1字节的数据,若缓冲区依然是满的,此报文段会被服务器丢掉,客户端会进行超时重传,若缓冲区有空余,则服务端会响应一个ACK报文段,该报文段的rwnd!=0(我们可以理解为设置了一个定时器)。