谈谈TCP控制那些事( 四 )


注意,这里的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,然后逐渐增大,这当然比按照大的cwnd一下子把许多报文段突然注入到网络中要“慢得多” 。
拥塞避免算法拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍 。这样拥塞窗口按线性规律缓慢增长 。
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半(但不能小于2) 。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法 。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕 。

  1. 拥塞窗口cwnd初始化为1个报文段,慢开始门限初始值为16
  2. 执行慢开始算法,指数规律增长到第4轮,即cwnd=16=ssthresh,改为执行拥塞避免算法,拥塞窗口按线性规律增长
  3. 假定cwnd=24时,网络出现超时(拥塞),则更新后的ssthresh=12,cwnd重新设置为1,并执行慢开始算法 。当cwnd=12=ssthresh时,改为执行拥塞避免算法
乘法减小(Multiplicative Decrease)和加法增大(Additive Increase)
“乘法减小”指的是无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半,并执行慢开始算法,所以当网络频繁出现拥塞时,ssthresh下降的很快,以大大减少注入到网络中的分组数 。“加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞 。常合起来成为AIMD算法 。
注意:“拥塞避免”并非完全能够避免了阻塞,而是使网络比较不容易出现拥塞 。
长肥管道一个连接的时延带宽积可表示为:capacity(b)=bandwidth(b/s)×round-triptime(s) 。也可称它为两端的管道大小 。具有大的带宽时延乘积的网络被称为长肥网络(LongFatNetwork,即LFN),而一个运行在LFN上的TCP连接被称为长肥管道 。使用长肥管道会遇到多种问题 。
  1. TCP首部中窗口大小为16bit,因此窗口大小最大为65535字节,这就将发送方发送但未被确认的数据的总长度限制到了65536字节 。对于LFN管道,这可能会出现所有的数据都还未到达接收方,但是发送方已受限于窗口大小而不能继续发送的情形,这就极大的降低了网络的吞吐量 。扩大窗口选项可以解决这个问题 。
  2. 根据TCP的拥塞控制,丢失分组会导致连接进行拥塞控制,即便是由于冗余ACK而进入了快速恢复,也会使得拥塞窗口降低一半,而如果是由于超时进入了慢启动,则拥塞窗口会变为1,无论是哪一种情形,发送方允许被发送的数据量都大量减小了,这会导致网络吞吐量降低 。选择确认(SACK)可以用来部分避免该问题,采用该技术使得接收方可以有选择的对无序到达的报文段进行确认而不是采用累积确认,这样被确认的报文段就不会超时,也不会有冗余的ACK 。
  3. TCP并不对每个报文段进行RTT测量 。在一个长肥网络LFN上需要更好的RTT测量机制 。
  4. TCP对每个字节数据使用一个32bit无符号的序号来进行标识 。TCP定义了最大的报文段生存时间(MSL)来限制报文段在网络中的生存时间 。但是在LFN网络上,由于序号空间是有限的,在已经传输了4294967296个字节以后序号会被重用 。如果网络快到在不到一个MSL的时候序号就发生了回绕,网络中就会有两个具有相同序号的不同的报文段,接收方将无法区分它们的顺序 。在一个千兆比特网络(1000Mb/s)中只需要34秒就可以完成4294967296个字节的发送 。使用TCP的时间戳选项的PAWS(ProtectionAgainstWrappedSequencenumbers)算法(保护回绕的序号)可以解决该问题 。
快重传算法:快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认 。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期 。如下图:
SACK 方法另外一种更好的方式叫:Selective Acknowledgment (SACK)(参看RFC 2018),这种方式需要在TCP头里加一个SACK的东西,ACK还是Fast Retransmit的ACK,SACK则是汇报收到的数据碎版 。参看下图:


推荐阅读