概述
簡介
為了防止網路的擁塞現象,TCP提出了一系列的擁塞控制機制。最初由V. Jacobson在1988年的論文中提出的TCP的擁塞控制由“慢啟動(Slow start)”和“擁塞避免(Congestion avoidance)”組成,後來TCP Reno版本中又針對性的加入了“快速重傳(Fast retransmit)”、“快速恢復(Fast Recovery)”算法,再後來在TCP Newreno中又對“快速恢復”算法進行了改進,近些年又出現了選擇性應答( selective acknowledgement,SACK)算法,還有其他方面的大大小小的改進,成為網路研究的一個熱點。協定
在TCP/IP中,快速重傳和恢復(fast retransmit and recovery,FRR)是一種擁塞控制算法,它能快速恢復丟失的數據包。沒有FRR,如果數據包丟失了,TCP將會使用定時器來要求傳輸暫停。在暫停的這段時間內,沒有新的或複製的數據包被傳送。有了FRR,如果接收機接收到一個不按順序的數據段,它會立即給傳送機傳送一個重複確認。如果傳送機接收到三個重複確認,它會假定確認件指出的數據段丟失了,並立即重傳這些丟失的數據段。有了FRR,就不會因為重傳時要求的暫停被耽誤。 當有單獨的數據包丟失時,快速重傳和恢復(FRR)能最有效地工作。當有多個數據信息包在某一段很短的時間內丟失時,它則不能很有效地工作。快速重傳快速恢復算法是在4.3BSD Reno中提出的,並在RFC 2001和RFC2581中描述。 FRR也指誤拒絕率(false rejection rate),一個在生物安全系統中使用的術語。具體算法
內容
(1) 當傳送端收到連續三個重複的 ACK 時,就重新設定慢開始門限 ssthresh。(2) 與慢開始不同之處是擁塞視窗 cwnd 不是設定為 1,而是設定為 ssthresh + 3 ` MSS。
(3) 若收到的重複的 ACK 為 n 個(n> 3),則將 cwnd 設定為 ssthresh + n` MSS。
(4) 若傳送視窗值還容許傳送報文段,就按擁塞避免算法繼續傳送報文段。
(5) 若收到了確認新的報文段的 ACK,就將 cwnd 縮小到 ssthresh。
擁塞視窗
其中:擁塞視窗 cwnd如果收到3個相同的ACK。TCP在收到亂序到達包時就會立即傳送ACK,TCP利用3個相同的ACK來判定數據包的丟失,此時進行快速重傳,快速重傳做的事情有:
1.把ssthresh設定為cwnd的一半
2.把cwnd再設定為ssthresh的值(具體實現有些為ssthresh+3)
3.重新進入擁塞避免階段。
後來的“快速恢復”算法是在上述的“快速重傳”算法後添加的,當收到3個重複ACK時,TCP最後進入的不是擁塞避免階段,而是快速恢復階段。快速重傳和快速恢復算法一般同時使用。快速恢復的思想是“數據包守恆”原則,即同一個時刻在網路中的數據包數量是恆定的,只有當“老”數據包離開了網路後,才能向網路中傳送一個“新”的數據包,如果傳送方收到一個重複的ACK,那么根據TCP的ACK機制就表明有一個數據包離開了網路,於是cwnd加1。如果能夠嚴格按照該原則那么網路中很少會發生擁塞,事實上擁塞控制的目的也就在修正違反該原則的地方。
具體來說快速恢復的主要步驟是:
1.當收到3個重複ACK時,把ssthresh設定為cwnd的一半,把cwnd設定為ssthresh的值加3,然後重傳丟失的報文段,加3的原因是因為收到3個重複的ACK,表明有3個“老”的數據包離開了網路。
2.再收到重複的ACK時,擁塞視窗增加1。
3.當收到新的數據包的ACK時,把cwnd設定為第一步中的ssthresh的值。原因是因為該ACK確認了新的數據,說明從重複ACK時的數據都已收到,該恢復過程已經結束,可以回到恢復之前的狀態了,也即再次進入擁塞避免狀態。
快速重傳算法首次出現在4.3BSD的Tahoe版本,快速恢復首次出現在4.3BSD的Reno版本,也稱之為Reno版的TCP擁塞控制算法。
可以看出Reno的快速重傳算法是針對一個包的重傳情況的,然而在實際中,一個重傳逾時可能導致許多的數據包的重傳,因此當多個數據包從一個數據視窗中丟失時並且觸發快速重傳和快速恢復算法時,問題就產生了。因此NewReno出現了,它在Reno快速恢復的基礎上稍加了修改,可以恢復一個視窗內多個包丟失的情況。具體來講就是:Reno在收到一個新的數據的ACK時就退出了快速恢復狀態了,而NewReno需要收到該視窗內所有數據包的確認後才會退出快速恢復狀態,從而更一步提高吞吐量。