1、TCP拥塞控制:Tahoe、 Reno、 NewReno与SACK算法概述与比较刘娟2011.12.12拥塞的发生 Source rate = bps If W too small then rate capacityIf W too big then rate capacity= congestion Knee point after which Throughput 增加非常缓慢 Delay 迅速增加 Cliff point after which Throughput 迅速减少到 0(congestion collapse) Delay 接近正无穷LoadLoadThroughputDe
2、layknee cliffcongestioncollapsepacketlossRTTM SSW Congestion Control vs. Congestion Avoidance Congestion control goal Stay left of cliff Congestion avoidance goal Stay left of kneeLoadThroughputknee cliffcongestioncollapsePossible Choices( AIMD算法) Additive increase, multiplicative decrease aI0, bI=1
3、, aD=0, 0= ssthreshcwnd = 1cwnd = 2cwnd = 4cwnd = 8Congestion Avoidance Slow down “Slow Start” If cwnd ssthresh theneach time a segment is acknowledged increment cwnd by 1/cwnd (cwnd += 1/cwnd). So cwnd is increased by one only if all segments have been acknowlegded. Congestion avoidance and slow st
4、art are independentalgorithms with different objectives. In practice they are implemented together. Slow Start/Congestion Avoidance Example Assume that ssthresh = 8c w n d = 1c w n d = 2c w n d = 4c w n d = 8c w n d = 9c w n d = 1 002468101214t=0 t=2 t=4 t=6Roundtrip timesCwnd(in segments)ssthreshPu
5、tting Everything Together:TCP Pseudocode(伪码)Initially:cwnd = 1;ssthresh = infinite;New ack received:if (cwnd ssthresh) /* Slow Start*/cwnd = cwnd + 1;else/* Congestion Avoidance */cwnd = cwnd + 1/cwnd;Timeout:/* Multiplicative decrease */ssthresh = cwnd/2;cwnd = 1;while (next unack + win)transmit ne
6、xt packet;where win = min(cwnd, flow_win);unack nextwinseq #Packet Loss Packet loss detected by Retransmission timeouts (RTO timer) Duplicate ACKs (at least 3)1 2 3 4 5 61 2 3PacketsAcknowledgements3 373Fast Retransmit Immediately retransmits after 3 dupACKs without waiting for timeout (fast retrans
7、mit) Adjusts ssthresh ssthresh max(flightsize/2, 2*SMSS) flightsize: The amount of data that has been sent but not yet acknowledged. Enter Slow Start (cwnd = 1) Assumption: loss indicates congestion (buffer overflow) The fast retransmit algorithm first appeared in the 4.3BSD Tahoe release, and it wa
8、s followed by slow start. Summary: Tahoe Basic ideas Gently probe network for spare capacity Drastically reduce rate on congestion Windowing: self-clocking() Other functions: round trip time estimation, error recoveryfor every ack if W ssthresh then W + (ss)else W += 1/W (ca) for every loss ssthresh
9、 := W/2W := 1 TCP Tahoe 注:无论慢启动阶段还是拥塞避免阶段,只要发送端发现拥塞,根据是 没有按时接收到 ACK或收到重复 ACK就要将慢启动的门限 ssthresh设置为出现拥塞时的发送窗口的一半 ,然后将拥塞窗口值 cwnd重新设置为 1。 注 : Tahoe引入快速重传机制 ,即当接受者收到几个对同一 TCP报文的相同应答时,发送方就推断已经发生了丢包,而 没有必要的等到重传定时器超时 ,并且重传相应的包,提高了信道的利用率。 Tahoe 算法存在着不足之处: 在收到 3 个重复 ACK 或在超时的情况下, Tahoe 置 cwnd 为 1,然后进入慢启动阶段。这一
10、方面会引起网络的激烈振荡,另一方面大大降低了网络的利用率。TCP Reno TCP Reno在 TCP Tahoe之后 ,加入 了快速恢复 ,所以可以认为TCP Reno是 TCP Tahoe的改进版。 在快速重传之后进入快速恢复 (而不是 TCP Tahoe采用的慢启动)。 VJ给出的原因是, 接收方发送重复确认不仅仅意味着有报文段丢失了,还意味着有(其它的)报文段离开了网络,到达了接收方的缓冲区( self-clocking),也就是说, 网络“管道”空出了新的位置,这样 TCP可以继续发送新的报文段(当然 cwnd应该减小一些)。 它有效地避免了当前网络拥塞状况不够严重时,采用“慢启动”
11、算法容易造成发送窗口减小的幅度过大的问题, 避免了在快速重传后通道为空的现象 。TCP Reno (Jacobson 1990) Slow start, congestion avoidance, fast retransmit Addition: fast recovery Most widely used version of TCP todaysstimewindowcass: slow startca: congestion avoidanceFast recovery Motivation: prevent pipe from emptying after fast retransm
12、it Enter FR/FR after 3 dupACKs Set ssthresh max(flightsize/2, 2*SMSS) Retransmit lost packet Set cwnd ssthresh + 3(window inflation) Each time another duplicate ACK arrives, cwnd += MSS. Transmit a packet, if allowed by the new value of cwnd. On non-dup ACK (1 RTT later), set cwnd ssthresh (window d
13、eflation) Enter CAExample: FR/FR Fast retransmit Retransmit on 3 dupACKs Fast recovery Inflate(扩大 ) window while repairing loss to fill pipe The fast recovery algorithm appeared in the 4.3BSD Reno release. 1 2 timeStimeD3 4 5 6 87 10 0 070 0990 00 111?Exit FR/FRRTT8Summary: Reno Basic ideas Fast rec
14、overy avoids slow start dupACKs: fast retransmit + fast recovery Timeout: fast retransmit + slow start ? At steady state, cwnd oscillates(振荡) around the optimal window size.slow start retransmitcongestion avoidance FR/FR dupACKstimeoutTCP Reno但 TCP Reno算法仍有不足 首先 ,源端在检测到拥塞后 ,要 重传自数据包丢失到检测到丢失时发送的全部数据包
15、 (即 Go-back-n算法 ),而这中间有些数据包是正确传到接收端 ,不必重传的 . TCP Reno在一个窗口中的 多个报文段同时丢失 的情况下会出现性能问题: 因为此时引起 TCP退出快速恢复的“确认了新数据的 ACK”没有确认 进入快速重传之前丢失的所有报文段 。 其它丢失的报文段会使得 TCP不断执行快速重传和快速恢复,而 cwnd和 ssthresh亦会多次被减半,大大降低了吞吐量。 针对以上缺点 ,近年来又提出了一些改进算法 ,其中 New Reno和 SACK都是改进版 . TCP New Reno是 1996年由 Floyd等人提出。它针对 一个发送窗口丢失多个数据包的情况
16、,尽力避免了 Reno在快速恢复阶段的许多重传超时: 利用一个 ACK确认部分发送窗口 ,立即重传余下的数据包。 显然, New-Reno只需修改发送端代码。 在 Reno中,发送方收到一个不重复的应答后就退出“快速恢复”状态, 而在 New Reno中,只有全部的丢包都被重传确认后才退出“快速恢复”状态TCP New RenoTCP New Reno TCP NewReno修改了 TCP Reno的快速恢复算法,以处理一个窗口中的多个报文段同时丢失时出现的“部分确认” partial ACKs,它在快速恢复阶段到达并且确认了新数据,但它只确认了进入快速重传之前发送的一部分数据; 在这种情况下
17、, TCP Reno会退出快速恢复状态,等待重传定时器溢出或者 dup ACKs的到达。 但是 TCP NewReno并不退出快速恢复状态,而是: 重传紧接着那个 partial ACK之后的报文段, cwnd-=partial ACK确认的新数据 ,cwnd+=SMSS, ? 对第一个(另一个建议是每一个) partial ACK,复位重传定时器。TCP New Reno New Reno 做了一个变化,即当多包丢弃时, 去掉了 Reno的等待重传定时器 ,在快速恢复的阶段,当发送端收到一个部分应答来表征一些包而不是所有包,在这个阶段的起始时间没有被成功传送。 在 Reno中,部分包通过减少
18、可用窗口至拥塞窗口大小以使 TCP退出快速恢复。 在 New Reno 中,部分应答的包已经丢失,需要重传。 New Reno 的恢复不需要重传超时,每个往返时间重传一个包直到所有的数据包被传完。 New Reno 保持在快速恢复状态,直到在快速恢复阶段初始化未被成功传送的数据全被响应。Example: NewReno On 3 dupACKs, receiver has packets 2, 4, 6, 8, cwnd=8? ,retransmits pkt 1, enter FR/FR Next dupACK increment cwnd to 9? After a RTT, ACK ar
19、rives for pkts 1 & 2, exit FR/FR, cwnd=5, 8 unacked pkts No more ACK, sender must wait for timeout1 2 timeStimeD3 4 5 6 87 18?FR/FR090 0 0 0 09?8 unackd pkts25?3timeoutTCP SACK 前面这几种算法,在单包丢弃时,效果是不错的,但如果在同一个窗口下同一个数据窗口下,它们的性能都有比较大的局限性。 SACK用 tcp rem tthresh判断拥塞是否发生 . 基于选择应答( sack)的算法,较好的解决了在同一个数据包丢失的问
20、题,这种算法的基本原理是这样的: SACK算法中,有一个称作 选择域( option) 的数据段; SACK的选择域的数据段, ACK中的 SACK域包含一定数量的 SACK块,每一个 SACK块都记录了信宿端接收或缓存的 非连续分组 。 SACK块的多少因应用和需要的不同而有所不同。 与 Reno相似,当发送端收到 prexmtthresh( 3)个重复的 ACK时, 重发 丢失的分组,并将 拥塞窗口减半,进入快速恢复过程 。TCP SACK 使用“管道” (pipe)变量表示在发送路径上损失的数据包的数量: 期间, SACK维护了一个称为“ pipe”的变量用来估计出现在网络中的分组数。
21、当“ pipe”小于拥塞窗口的大小时,发送端发送新的或需要重发的分组,并将变量“ pipe”加一。 当发送端接收了一个带 SACK选项的重复 ACK,表明新分组已被接收端接收, pipe变量减一。 Pipe变量的使用将何时发送与发送哪一个分组有效的解偶。 当发送端被许可发送分组时,依次将发送丢失列表中记录的分组。 如果没有这样的分组,而接收端的通报窗口又足够大,则发送端将发出新的数据分组。TCP SACK SACK算法 是在 Reno基础上进行扩展 ,对数据包进行有选择地确认和重传(选择确认策略) .这样 ,源端就能准确地知道哪些数据包正确地传到接收端 ,从而避免不必要地重传 ,减少时延 ,提
22、高网络吞吐量 . 当目的端缓存队列出现 序号不连续 的数据时,向源端发送承载有 SACK选项的重复 ACK,实现源端有选择的重传丢失的数据包,提高了 TCP的性能。 当重传分组本身被丢弃后, SACK用重传超时来探测丢失,再次重传后进入慢启动过程,在确认了所有出现在进入快速恢复阶段的分组后,发送端将从快速恢复中退出。 TCP SACK 与 TCP Reno最主要的区别 是在多个数据包丢失的情况下进行拥塞避免的方式的不同。TCP SACK 文献 【 14】 通过仿真对 Tahoe,Reno,New Reno和 SACK四种TCP的拥塞控制机制进行了研究 ,并分别讨论了在丢失 1个 ,2个 ,3个 ,4个数据包情况下它们的性能 . 结果表明 :Reno优于 Tahoe, New Reno和 SACK则优于 Tahoe和Reno. 由于 SACK不像 New Reno一次全部重传已发送包 ,而是有选择重传 ,所以在一个窗口中数据包大量丢失情况下 , SACK的性能优于 New Reno,但 SACK的最大缺点在于要修改 TCP协议 .