首页 > 代码库 > TCP拥塞控制 (1)
TCP拥塞控制 (1)
Basic:
TCP,传输控制协议,是目前网络中应用最广泛的传输协议。SMTP、SSH、FTP、HTTP等因特网底层协议均是TCP。
TCP面向连接,提供端到端的数据可靠传输。连接时三次握手,断开是四次挥手。具体表现为:
1、 TCP对传输的数据做了序号标记,其中序号标记安装字节数增长。TCP对端在接收到数据后发出一个ACK给对端(ACK中就包含序列号)。TCP使用确认和超时重传机制保障了数据的可靠性传输。
2、 由于发送和接收端的数据处理能力不同,为了避免数据发送过快而超过了对端的接收能力。TCP采用了流量控制机制,即在数据包的包头通告自身的接收窗口(能够最多接收的数据包)。
转折
TCP看上去已经很完美,而且TCP开始应用与互联网,直到:
1986年10月,一件事情的发生使得TCP开启了一个新领域,从美国LBL到UC Berkeley的数据吞吐量从32Kbps下降到40bps,具体可以参见V. Jacobson的论文“Congestion Avoidance and Control”
WHY:为啥数据吞吐量下降得如此离谱?
原来TCP的控制机制只考虑了接收端的接收能力,并未意识到网络本身的传输能力也有痛点,从而导致整个网络的崩溃。
拥塞
网络中的有限资源被多个用户使用,而且网络本身并无约束能力。而且互联网的爆棚发展,不弄点东西协调受限的资源,结果就是大家都没法用。
做个啥呢
当然是能避则避,若是躲不了就勇敢面对。即,拥塞控制算法包括拥塞避免和拥塞控制。打预防针,避免网络进入拥塞状态,尽量使得网络保持在高吞吐量和低延迟的状态;一旦生病,可以打吊瓶,使网络从拥塞状态中恢复出来,重新进入高吞吐量和低延迟的状态。
拥塞控制算法
Jacobson 在1988年的论文中提出的TCP的拥塞控制由慢启动算法和拥塞避免组成,后 来加入了快速重传和快速恢复算法,而后还有大大小小的改进(略)。
TCP的拥塞控制主要依赖于拥塞窗口(cwnd),窗口值的大小就代表能够发送出去的但还没有收到ACK的最大数据报文段。显然窗口越大那么数据发送的速度也就越快,但是也有越可能使得网络出现拥塞;如果窗口值为1,每发送一个数据,数据传输效率低下。
TCP的拥塞控制算法就是要选取权衡点,选取合适的拥塞窗口值,从而在不产生拥塞的情况下使得网络吞吐量最大化。
慢启动算法:
新建立的连接并不会一开始就发送大量的数据包,而是根据网络状况逐步递增每次发送的数量。cwnd每次的增量为一个MSS,cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长。当cwnd的值大于慢启动门限(ssthresh,一般为65535)后,慢启动过程结束,进入拥塞避免阶段。
事实上,慢启动的速度一点也不慢,只是起点低。
拥塞避免:
拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升,开始加法增加,这样就可以避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。
实际中,既要考虑拥塞控制,又要兼顾流量控制。因此,TCP真正的发送窗口是拥塞窗口和接收窗口的最小值。
那有个问题就是TCP如何确定网络进入了拥塞状态呢?
当TCP数据包的定时器超时,且无ACK信号确认,TCP就会进行重传,此时出现拥塞的可能性就很大。TCP的反应:
A、 把门限值ssthresh降低为窗口值cwnd的一半。
B、 把窗口重新置为一个MSS
C、 整个状态又回到了起点---慢启动过程
准则:AIMD原则,和式增加,积式减少。因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有足够的空间,从而保证整个的公平性。
快速重传
TCP在收到乱序到达包时就会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,此时进行快速重传,快速重传做的事情有:
A、 把门限值ssthresh降低为窗口值cwnd的一半。
B、 把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3)
C、 重新进入拥塞避免阶段
快速恢复
快速恢复算法是建立在快速重传的前提下。当收到3个重复ACK时,TCP最后进入的不是拥塞避免阶段,而是快速恢复阶段。
快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包。(如果发送方收到一个重复的ACK,那么根据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd递增)。
快速恢复的主要步骤:
1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh+3,然后重传丢失的报文段。
2.再收到重复的ACK时,拥塞窗口增加1。
3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,再次进入拥塞避免状态。
TCP的缺陷:
Internet得到迅猛发展,从100Mbps到1Gbps到10Gbps,TCP的传统的拥塞控制算法根本无法适应。不仅窗口太小,而且将包的丢失解释为网络发生了拥塞,这在高速网络根本无法成立。
So ,怎么破?接着下一篇。。。
参考:http://www.cnblogs.com/fll/archive/2008/06/10/1217013.html