TCP的滑动窗口和拥塞控制

一、滑动窗口协议

1.简述

TCP以1个段为单位,每发一个段进行一次确认应答的处理。这样的传输方式有一个缺点:包的往返时间越长通信性能就越低。为了解决这个问题,TCP引入了窗口这个概念。即使在往返时间较长的情况下,它也能控制网络性能的下降。因此确认应答不再是以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度缩短。也就是说,发送端主机,在发送了一个段以后不必要一直等待确认应答,而是继续发送。窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。

2.发送窗口和接收窗口

发送窗口是发送缓存中的一部分,是可以被TCP协议发送的那部分,其实应用层需要发送的所有数据都被放进了发送者的发送缓冲区;发送窗口中相关的有四个概念:已发送并收到确认的数据(不在发送窗口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之中)、允许发送但尚未发送的数据以及发送窗口外发送缓冲区内暂时不允许发送的数据;每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送。

3.通过一个例子来理解

TCP建立连接的初始,B会告诉A自己的接收窗口大小,比如为‘20’:

字节31-50为发送窗口

 A发送11个字节后,发送窗口位置不变,B接收到了乱序的数据分组:

   只有当A成功发送了数据,即发送的数据得到了B的确认之后,才会移动滑动窗口离开已发送的数据;同时B则确认连续的数据分组,对于乱序的分组则先接收下来,避免网络重复传递:

二、重发控制

使用窗口控制时,如果出现段丢失怎么办?

1.ACK在返回的路途中丢失
在这种情况下,数据包已经到达了对端,实际上不需要再被重新发送了。在没有使用窗口控制的情况下,没有收到确认应答的数据会不断地重新发送,而在使用窗口控制的情况下,即使某些数据包的ACK被丢失也没有影响! 如下图所示,发送端收到了ACK 2001,就会说说明ACK1001已经被接受端返回了!!就没有必要再等待ACK1001了。

2.某个数据包丢失的情况
 在这种情况下,如下图所示,如果发送端的1001-2000个字节(第二个数据包)丢失,接受端在接受到第3个数据包时,会提醒发送端:“我想要接受的是1001开始的数据段”,即发送ACK1001。如果接受端收到第4个数据段时,还没有收到第2个段,则继续发送ACK1001.  接受端连续收到ACK1001,会确认第2个包丢失,然后就会赶紧重发第2个数据包。 一般地,当发送端连续3次接受到ACK1001时,就会断定需要重发,不必继续等待设置的重传计时器时间了。

这种方式比较高效,因此也被称作高速重发控制

三、流量控制

通信过程中,如果接受端处于高负荷情况,导致其不能接受数据,会导致发送端重新发送数据包,为避免这种无端的流浪浪费,TCP提供了流控制的机制: 让发送端根据接受端的实际能力来控制发送的数据量。

具体操作是,接受端自动向发送端发送自己可以接受的数据的大小,从而 发送端不会发送超过这个限度的数据。该限度被称为窗口大小。TCP的首部中,专门有一个字段来通知窗口大小。接收主机可以将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。

不过,接收端的这个缓冲区一旦面临数据溢出时,窗口大小的值也会随之被设置为一个更小的值发给发送端,从而控制数据的发送量。下图为根据窗口大小控制流量过程的示例

如图所示,当接收端收到从3001号开始的数据段后其缓冲区即满,不得不暂时停止接收数据。之后,在收到发送窗口更新通知后才得以继续进行。如果这个窗口的更新通知在传送途中丢失,可能会导致无法继续通信。为避免此类问题的发送,发送端主机会时不时的发送一个叫窗口探测的数据段,此数据段仅含一个字节以获取最新的窗口大小信息。

四、拥塞控制

1.为什么要有拥塞控制?
在某段时间,若对网络资源的需求超过了该资源所能提供的可用部分,网络的性能就要变化,这种情况叫做拥塞。在TCP的窗口控制下,发送端一次发送的数据量为窗口大小,在网络状态不好的情况下,一下子发送过多的数据,可能会导致网络瘫痪。TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对发送数据量进行控制。

2.拥塞窗口
为了在发送端调节所要发送数据的量,定义了一个叫“拥塞窗口”的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段发送数据,之后每收到一次确认(ACK)应答,拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小的那个值,发送比其还要小的数据量。如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。不过随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,如下图

上图中的轮次,指的是 一个窗口内的所有数据包被全部回复 称为一轮,所以每轮过后cwnd值翻倍,指数增长。

但是拥堵状况如果激增可能导致网络拥塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超出这个阀值,在每收到一次确认应答时,只允许以下面这种比例放大拥塞窗口。1个数据段的字节数/拥塞窗口(字节)*1个数据段的字节数。

拥塞窗口大小变化图:

(1)TCP的通信开始时,并没有设置相应的慢启动阀值。而是在超时重发时,才会设置为当时拥塞窗口一半的大小,并且此时窗口大小又回到刚开始的大小以指数增长。当增长到阀值的时候,拥塞窗口大小就以线性增长。
(2)当触发重复确认应答机制(快重传)时,这时把阀值大小设置为当时窗口大小的一半。然后将窗口的大小设置为该慢启动阀值+3个数据段的大小。之后拥塞窗口大小线性增长(因为已经超过阀值了)。
有了这样一种控制,TCP的拥塞窗口如上图所示发送变化。由于窗口的大小会直接影响数据被转发时的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页