TCP的滑动窗口与拥塞窗口

TCP的滑动窗口与拥塞窗口

因此我们先了解一下16位的窗口大小究竟有什么作用。

窗口分为滑动窗口和拥塞窗口。

滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的。

那么对于数据的发送端就是拥塞窗口了,拥塞窗口不代表缓存,拥塞窗口指某一源端数据流在一个RTT内可以最多发送的数据包

一、滑动窗口
滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
 
对ACK的再认识,ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息:
一是期望接收到的下一字节的序号n,该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接 收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是 2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。
 
二是当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方,假定当前发送方已发送到第x字节,则可以发送的字节数就是y=m-(x-n).这就是滑动窗口控制流量的基本原理.
滑动窗口协议如图所示:
TCP的滑动窗口与拥塞窗口


在这个图中,我们将字节从1至11进行 标号。接收方通告的窗口称为提出的窗口,它覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,且通告窗口大小为6。我们知 道窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两 个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述窗口左右边沿的运动:
  • 称窗口左边沿向右边沿靠近为窗口合拢。这种现象发生在数据被发送和确认时。
  • 当窗口右边沿向右移动时将允许发送更多的数据,我们称之为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了T C P的接收缓存时。
  • 当右边缘向左移动时,称之为窗口收缩。

二、拥塞窗口

2.1 慢启动 - (Slow Start) 和 拥塞避免 - (Congestion Avoidance)

慢启动: 
  发送方维护一个拥塞窗口cwind的状态变量。拥塞窗口的大小取决于网络的拥塞程度,动态变化。通过逐渐增加cwind的大小来探测可用的网络容量,防止连接开始时采用不合适的发送量导致网络拥塞。 
  -[1]. 当主机开始发送数据时,如果通过较大的发送窗口立即将全部数据字节都注入到网络中,由于不清楚网络情况,有可能引起网络拥塞; 
  -[2]. 较好方法是试探,从小到达逐渐增大发送端拥塞控制窗口的cwind数值; 
  -[3]. 开始发送报文段时,先将拥塞窗口cwind设置为一个最大报文段MSS值。每收到一个对新报文段的ACK确认后,将拥塞窗口cwind增加至多一个MSS的数值。当rwind足够大的时候,为防止拥塞窗口cwind的增长引起网络拥塞,还需要另外一个变量,慢开始门限ssthresh。 
    当 cwind < ssthresh时,使用上述慢启动算法; 
    当 cwind > ssthresh时,停止使用慢启动算法,改用拥塞避免算法;

 慢启动局限性: 
[1]. 需要获得网络内部流量分布的信息,浪费可用的网络容量,额外开销; 
[2]. 估算合理的ssthresh值并不容易,可能耗时较长;

  慢启动的“慢”并不是指cwind的增长速度慢,而是指在TCP开始发送报文段时先设置cwind=1,使得发送方在开始时只发送一个报文段(目的是探测一下网络的拥塞情况),然后再逐渐增大cwind。

拥塞避免: 
  让拥塞窗口cwind缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwind加1,而不是加倍。这样拥塞窗口cwind线性缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。 
  无论慢启动开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢启动门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwind重新设置为1,执行慢启动算法。目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

控制过程: 
  -[1]. TCP连接初始化,将拥塞窗口cwind设置为1个报文段,即cwind=1; 
  -[2]. 执行慢开始算法,cwind按指数规律增长,直到cwind == ssthresh时,开始执行拥塞避免算法,cwind按线性规律增长; 
  -[3]. 当网络发生拥塞,把ssthresh值更新为拥塞前ssthresh值的一半,cwind重新设置为1,再按照 [2] 执行。

TCP的滑动窗口与拥塞窗口

说明:由指数增长拉低到线性增长,降低出现拥塞的可能。“拥塞避免”并非指完全能够避免拥塞,利用以上的措施要完全避免网络拥塞还是不可能的。 
  慢开始算法只是在TCP连接建立和网络出现超时时才使用。

2.2 快重传 - (Fast Retransmission) 和 快恢复 - (Fast Recover)

之前提到过,重传是在两种情况下发生: 
  1)如果RTO(重传超时时间)超时,那么存在非常严重的拥塞的可能性;包可能已在网络中丢失。 
  在这种情况下,TCP做出强烈的反应。 
  a.设置阈值为cwnd的一半。 
  b.重新设置cwnd为1。 
  c.启动慢速启动阶段。

  2)如果收到3个相同的ACK,那么存在着轻度拥塞的可能性。TCP在收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传。 
在这种情况下,TCP做出轻度的反应。 
  a.设置阈值为cwnd的一半。 
  b.设置cwnd为阈值(有些实现是阈值加上3) 
  c.启动拥塞避免阶段。

TCP的滑动窗口与拥塞窗口

说明:新的 TCP Reno 版本在快重传之后采用快恢复算法而不是采用慢启动算法。从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收窗口rwind 。

两者简单比较:

相同:提高网络性能。 
不同: 
  [1].流量控制:在TCP连接上实现对发送流量的控制,考虑点对点之间对通信量的控制,端到端,即:控制发送端的数据发送速率,使接收端可以来得及接收,保证网络高效稳定运行。 
  [2].拥塞控制:处理网络拥塞现象,考虑网络能够承受现有的网络负荷,全局性变量,涉及所有的路由器、主机以及与降低网络传输性能有关的因素。防止过多的数据注入到网络,使网络中的路由器或链路不致过载,确保通信子网可以有效为主机传递分组。