我们知道TCP协议中有一个确认应答机制,每发送一个数据段,就需要有一个ACK来响应,如果这样一收一发的话,会让数据传输的效率变得很低。滑动窗口就是用来解决这个问题的,也就是我们一次发送多条数据。例如现在不需要等待确认应答可以发送数据的最大值为4000个字节,我们将4000个字节分为四个数据段来进行发送。在发送前四个数据段的时候,我们不需要等待任何的ACK应答,可以直接发送。当收到第一个数据段的ACK之后,滑动窗口就会向后移动一个单元,再继续发送第五段数据,然后依次类推。
发送缓冲区
操作系统为了维护滑动窗口,会开辟一个发送缓冲区来记录当前有哪些数据没有被应答,只有确认应答过的数据,才会从缓冲区中删除掉。
也就是当发送端发送一个窗口大小的几段数据时,会将数据先保存在发送缓冲区中,如果收到了相应的ACK确认序号,就会将发送缓冲区中对应序列号的数据删除。如果没有收到ACK,就会根据相应情况重新发送数据段。通过发送缓冲区,可以有效地帮助发送端来解决数据的丢包问题。
接收缓冲区
保存数据和序号,用来告诉发送缓冲区应该删除哪些数据。
丢包问题
1.1 ACK丢失
ACK丢包也就是发送端将数据发送到服务端,服务端此时响应会一个ACK应答,但是这个ACK在中途丢失,并没有返回到发送端。不过在滑动窗口机制中,如果接收到一个ACK应答,根据返回的确认序号,可以知道接收端确认接收到数据的一个情况。
例如我们还是4000个字节,分为四个数据段发送。第一个数据段的ACK应答应该告诉发送端,我已经接收到了序列号1-1000的数据段,下一个发送数据应该是1001开始。假设这第一个ACK数据报在返回到发送端的中途丢失了,但是没关系,发送端可以根据第二个数据段响应的ACK来进行确认。就是说第二个数据段返回的ACK,其中会告诉发送端,我已经接收到了1-2000的数据,下一个发送数据应该是从2001开始发送。
1.2 数据包丢失
当发送端发送的某一个报文段丢失之后,就会连续收到该报文段对应起始序号的ACK,好比在提醒发送端,“我需要接下来的这个数据段“。如果发送端连续三次收到同样的应答,就会从发送缓冲区中将对应的数据段再次发送。这种机制被称为“高速重发控制”,也叫“快重传”。