TCP中滑动窗口的作用:

  1. 流量控制
  2. 拥塞控制
  3. 提高传输效率

流量控制

接收端窗口大小,代表接收端缓冲区还有多少大小,从而控制发送端发送大小,达到流量控制的目的。

拥塞控制

拥塞控制也就是考虑当前的网络环境,动态调整窗口大小,没有发生拥塞情况,则窗口增大,拥塞了窗口减小,如此往复,最终应该接近与接收端的窗口大小。

慢启动和拥塞避免:

在开始发送信息时,由于不知道具体的网络环境,为避免大量信息造成的拥塞现象,此时的拥塞窗口以最小值(即拥塞窗口和接收端窗口中的较小值)进行数据发送,并设定门限值作为慢启动算法和拥塞避免算法的分割点。慢启动是指以最小的拥塞窗口按照指数形式递增,达到门限值后,以拥塞避免算法,即线性递增方式增大拥塞窗口(这里递增时间间隔为一个往返时间RTT)。在上述过程中,无论是窗口大小指数递增或者线性递增,当发生拥塞现象,则门限值更新为当前窗口大小的一半,拥塞窗口大小变为最小值,重复上述递增过程(此时属于网络环境限制,所以在接收端和拥塞窗口两个限制条件中选择拥塞窗口作为限制)。

强化学习滑动窗口_接收端

提高传输效率

在确认应答机制中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段。这样做有一个比较大的缺点,就是性能较差。尤其是数据往返时间较长的时候。那么我们可不可以一次发送多个数据段呢:滑动窗口。

强化学习滑动窗口_数据_02


强化学习滑动窗口_滑动窗口_03


如图,假设窗口大小为4000。那么就是是说图上1001-5001之间的数据是可以一次性全部发送,并且不需要等待ACK响应的。当发送完这4000的数据后,此时等待。等到ACK响应中确认收到1001-2000的数据时,滑动窗口右移。

强化学习滑动窗口_数据_04


以此类推。滑动窗口内部的数据都是已经发送但是没有收到ACK应答的数据,滑动窗口左侧都是已经收到了ACK应答的数据,滑动窗口右侧是未发送的数据。发送端发送的数据丢包:

强化学习滑动窗口_接收端_05


这里1001-2000的数据报文丢失,此时发送端并不知道,继续发送滑动窗口内的报文。这时候接收到了三条重复的ACK响应(TCP协议规定,收到三条相同的ACK响应就出发重传)。此时重传1001-2000的数据报文。重传完毕后,等待接收端的响应。此时接收端响应为下一条是6001的数据报文,也就是说在2001-6000的报文都接收到了,这段报文被放到了接收端的接收缓冲区中。那么此时滑动窗口继续移动,发送端继续发送。接收端ACK响应丢包:

强化学习滑动窗口_数据_06


接连三条的ACK响应都丢包,但是第四条ACK响应到达。此时并不会影响发送端的发送。因为ACK响应的是下一条数据包是4001,这意味着接收端已接收到前面的所有报文数据。所以接收端ACK响应丢包其实对发送端发送的影响并不是那么大,后续的ACK响应能够处理好这个问题。