TCP协议的安全机制——滑动窗口

网络出现堵塞一般有两种情况:

  1. 网络内部出现瓶颈,这个问题TCP协议有专门的解决方法,具体请看:TCP拥塞控制
  2. 接收方容量太小,因此就需要进行流量控制,也就是本文的重点:滑动窗口

      流量控制的原理很简单,如果发送方发送的数据量远大于接收方的容量,就会出现阻塞,对此可以维护一个接收窗口大小,接收方每次告诉发送方:这是我的窗口大小,不要发多了。

      那为什么叫滑动窗口呢?接下来我们就来看一看“滑动”具体体现在哪儿呢,我们暂且先这么叫着。

     tcp协议是全双工的通信协议,因此接收端和发送端各有一个滑动窗口,一个叫发送端滑动窗口(用于发送数据),一个叫接收端滑动窗口(用于接收数据)。首先我们说一下滑动窗口的原理。

  1. 接收方会对收到的报文进行确认,其确认号是希望下次所期待的字节(即表示之前的都收到了)
  2. 发送方表示:在没有收到B的确认的情况下,A可以把窗口内的数据都发送出去。凡是已经发送出去的数据,在未收到确认之前都必须暂时保留,以便超时重传时使用。
  3. 当发送方收到接收方的确认之后,则释放发送方滑动窗口中的数据,滑动窗口发送后边的数据(逻辑上看起来就是滑动窗口向后移动一段举例继续发送)

举个例子如下:
 

       对于上图,我们很明显滑动窗口为1.只有当收到对这一个数据确认之后才可以发送下一个数据。对此我们可以假设一下有大量的数据,在滑动窗口很小的情况下就会发送大量的确认信息,这就导致很大的延迟。也许你会说,那将滑动窗口定大一点不就行了,那么问题又来了,定多大合适呢?我们再假设将滑动窗口定到100,但是接收方一次只能处理50个数据,发送方下次还是发送100个数据,接收方还是只能处理50个数据,这就导致发送了大量不必要的数据拥塞了我们的网络。

      滑动窗口定小了定大了都不合适,接下来我们看看滑动窗口是怎么做的,举个例子:

  • 首先第一次发送数据时,窗口大小由链路带宽的大小来定。我们假设是3,这时候我们希望接收方在接收到数据之后对数据进行确认,并告诉发送方下次希望得到的数据是多少
  • 可以看到,接收方发送的确认号是3,这就说明接收方下次希望从3开始发,也说明第一次发送的数据接收方只收到了2个,因此将滑动窗口定位2发送给发送方,此时第一次发送的数据3就被丢弃了

  • 上文提到过,在没有收到确认之前,为被确认的数据依然在滑动窗口中缓存,此时只收到了3之前的数据,则可以清除滑动窗口中3之前的数据(即滑动窗口向前移两个单位),然后从数据3开始发送2个数据

这就是滑动窗口的机制,并不会一次性定好滑动窗口的大小,会随着链路的变化进行调整。此时我们来回顾一下“滑动是如何体现的”。只有当接收方的滑动窗口向前滑动时(即发送了确认),发送窗口才能向前滑动,收发窗口按照上述规律不停的往前滑动。

猜你喜欢

转载自blog.csdn.net/qq_41727218/article/details/88317970
今日推荐