流量控制 滑动窗口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YL970302/article/details/88568490

1. 流量控制    

      我们都知道当网络上数据流量超过网络硬件负荷时就会出现网络拥塞,就是我们平常遇到的网络缓慢的现象。对应影响网络速度的原因主要有网络传输设备的性能和传输的数据多少,网络传输设备包含发送接收主机、路由器、传输线路等。为了解决这个问题,TCP引入了流量控制,顾名思义,就是采用某种方法,控制收发端传输数据的速度,从而维持网络数据传输的平衡。针对收发主机的处理速度,TCP使用滑动窗口来控制数据流量,减轻网络压力。

2. 滑动窗口

  • 什么是滑动窗口

    通过我们对TCP连接的建立和终止以及对TCP报文的学习,我们知道TCP连接是全双工的,即可以双向通信。TCP报文段首部中主要有序列号、确认号、标志字段、窗口等其他字段属性,其中的窗口字段就是用来实现滑动窗口的。该字段表示发送该窗口字段信息的通信方为即将到来的数据预留的存储空间大小,也就是它能接收的数据大小。另一方受到这个窗口值后,就会动态发送数据。窗口字段长度为16个字节,可以表示最大65535的值,即窗口最大为65535字节。

  • 滑动窗口的工作原理

    TCP连接中有发送方和接收方,发送方会维护一个发送窗口,接收方会维护一个接收窗口。

    先来分析发送窗口,窗口结构如下。

image

        在发送方一侧会将要发送的数据组成一个队列,依次发送队列里的数据。队列里面的数据包含几个部分,有已经发送且已经确认的数据、已经发送但未确认的数据、即将发送的数据、现在还不能发送的数据这四个部分,其中的数字标号是数据序列号。在通信连接建立和每次传递数据时,收发两方会交换各自窗口大小,表面自己能接收的数据大小,一般以字节为单位。上图中提供的窗口即对方通告的窗口大小,可以看出为6个字节,同时窗口的左边界为3,表明在序列号3及之前的数据已经发送并完成确认,则可以算出窗口的右边界为9。同时我们可以知道有多少已经发送但未收到确认的数据,总共有3个字节,则发送边界为6,所以最后我们可知可用窗口,即马上能发送的数据序列号范围为7-9。

     随着时间的推移,当我们收到已经发送的数据的ACK时,滑动窗口的左边界就能右移,如果窗口大小未发生改变,那么窗口的右边界也会右移,相当于整个窗口右移。其中在窗口的变化过程中有三个运动状态:

  • 关闭: 窗口左边界右移。发生在收到已发送数据的ACK时。
  • 打开: 窗口右边界右移。发生在接收方已处理接收到的数据,使得接收方缓存变大,会给发送方通告新的变大的窗口值。
  • 收缩: 窗口有边界左移。发生再糊涂窗口中。

     TCP报文的头部中有两个字段,一个是ACK确认号,一个是Window窗口值,在每次数据传递过程中,收发两方都会传递这两个字段,ACK表示对方已对小于ACK-1的报文进行确认,发送方能够以此动态调整窗口的左边界,Window窗口字段表示对方能接受的数据大小,发送方能够据此动态调整窗口的右边界。这样就形成了窗口的向前滑动,所以形象地称之为滑动窗口。

     当ACK确认号增大,而窗口变小,即窗口的左右边界靠拢,最后左右边界相等,此时窗口大小为0,表示不能发送数据,称之为0窗口。出现0窗口时,当接收端可接受空间变大时,会给发送端发送一个窗口更新ACK,使得发送端能够继续发送数据。但我们知道我们并未对ACK进行确认,那么ACK也有可能丢失。为了解决这个问题,发送端一般会采用TCP持续计时器见隔一段时间对接收端窗口进行探测,要求接收端返回自己的窗口大小,发送端随时准备发送数据。

     接收方也会维护一个窗口。保存已经接收到的数据状态。

image

     相比发送端维护的窗口,接收端维护的窗口就简单很多了。只有已经接收并被确认,能接收数据的空间和不能接收的数据。当到达的数据序列号小于左边界时,代表收到的是重复数据,因为这些数据已经被接收并已经被确认,接收端会选择放弃这些数据。当收到的数据序列号大于右边界时,代表该数据已超过了发送端处理范围,也会被抛弃。只有收到的数据序列号再左边界和右边界之间时,才会接收保存,这样窗口才会向前移动。

猜你喜欢

转载自blog.csdn.net/YL970302/article/details/88568490