滑动窗口引入
IP层协议属于不可靠的协议,IP层并不关系数据是否发送到了对端,TCP通过确认机制来保证数据传输的可靠性,在比较早的时候使用的是send–wait–send的模式,其实这种模式叫做stop-wait模式,发送数据方在发送数据之后会启动定时器,但是如果数据或者ACK丢失,那么定时器到期之后,收不到ACK就认为发送出现状况,要进行重传。这样就会降低了通信的效率,这种方式被称为 positive acknowledgment with retransmission (PAR)
滑动窗口
我们要解决PAR的缺点也就是让发送端并不是只有在接收到ACK的时候才会去发送下一个数据包。那么我们就会使用滑动窗口来解决这个问题
窗口
我们在TCP头上有一个数据是窗口大小, 其实就是接收端告诉我们的发送端 他目前能够承受的数据量的大小。这个时候在发送端这边就会出现一个滑动窗口的概念,如下图:
上图中:
- Sent and Acknowledged:这些数据表示已经发送成功并已经被确认的数据,比如图中的前31个bytes,这些数据其实的位置是在窗口之外了,因为窗口内顺序最低的被确认之后,要移除窗口,实际上是窗口进行合拢,同时打开接收新的带发送的数据
- Send But Not Yet Acknowledged:这部分数据称为发送但没有被确认,数据被发送出去,没有收到接收端的ACK,认为并没有完成发送,这个属于窗口内的数据。
- Not Sent,Recipient Ready to Receive:这部分是尽快发送的数据,这部分数据已经被加载到缓存中,也就是窗口中了,等待发送,其实这个窗口是完全有接收方告知的,接收方告知还是能够接受这些包,所以发送方需要尽快的发送这些包
- Not Sent,Recipient Not Ready to Receive: 这些数据属于未发送,同时接收端也不允许发送的,因为这些数据已经超出了接收端所接收的范围
通过上面的滑动窗口,我们可以持续的发送数据,直到窗口数据都已经被发送,如果有数据被ack了那么窗口可以右滑动。