TCP協議 擁塞控制演算法

2021-08-09 12:04:30 字數 2358 閱讀 3817

網路擁塞控制演算法:

tcp的擁塞控制主要原理依賴於乙個擁塞視窗來控制,在之前我們還討論過tcp還有乙個對端通告的接收視窗用於流量控制。視窗值得大小就代表能夠傳送出去的但還沒有接收到ack的最大資料報文段,顯然視窗越大那麼資料傳送的速度也就越快,但是也有越可能使得網路出現擁塞,如果視窗值為1,那麼就簡化為乙個停等協議,每傳送乙個資料,都要等到對方的確認才能傳送第二個資料報,顯然資料傳輸效率低下。tcp的擁塞控制演算法就是要在這兩者之間權衡,選取最好的cwnd值,從而使得網路吞吐量最大化且不產生擁塞。

由於需要考慮擁塞控制和流量控制兩個方面的內容,因此tcp得真正的傳送視窗=min(rwnd,cwnd)。但是rwnd是由對端確定的,網路環境對其沒有影響,所以在考慮擁塞控制的時候我們一般不考慮rwnd的值,我們暫時只討論如何確定cwnd值的大小。關於cwnd的單位,在tcp中是以位元組來做單位的,我們假設tcp每次傳輸都是按照mss大小來傳送資料的,因此你可以認為cwnd按照資料報個數來做單位也可以理解,所以有時我們說cwnd增加1也就是相當於位元組數增加1個mss大小。

1、慢啟動

最初的tcp在連線建立成功後會向網路中傳送大量的資料報,這樣很容易導致網路中路由器快取空間耗盡,從而發生擁塞。因此新建立的連線不能夠一開始就大量傳送資料報,而只能根據網路情況逐步增加每次傳送的資料量,以避免上述現象的發生。具體來說,當新建連線時,cwnd初始化為1個最大報文段(mss)大小,傳送端開始按照擁塞視窗大小傳送資料,每當有乙個報文段被確認,cwnd就增加1個mss大小。這樣cwnd的值就隨著網路往返時間(round trip time,rtt)呈指數級增長,事實上,慢啟動的速度一點也不慢,只是它的起點比較低一點而已。我們可以簡單計算下:

開始 —> cwnd = 1

經過1個rtt後 —> cwnd = 2*1 = 2

經過2個rtt後 —> cwnd = 2*2= 4

經過3個rtt後 —> cwnd = 4*2 = 8

上面討論的兩個機制都是沒有檢測到擁塞的情況下的行為,那麼當發現擁塞了cwnd又該怎樣去調整呢?

首先來看tcp是如何確定網路進入了擁塞狀態的,tcp認為網路擁塞的主要依據是它重傳了乙個報文段。上面提到過,tcp對每乙個報文段都有乙個定時器,稱為重傳定時器(rto),當rto超時且還沒有得到資料確認,那麼tcp就會對該報文段進行重傳,當發生超時時,那麼出現擁塞的可能性就很大,某個報文段可能在網路中某處丟失,並且後續的報文段也沒有了訊息,在這種情況下,tcp反應比較「強烈」:

1.把ssthresh降低為cwnd值的一半

2.把cwnd重新設定為1

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需要收到該視窗內所有資料報的確認後才會退出快速恢復狀態,從而更一步提高吞吐量。

sack就是改變tcp的確認機制,最初的tcp只確認當前已連續收到的資料,sack則把亂序等資訊會全部告訴對方,從而減少資料傳送方重傳的盲目性。比如說序號1,2,3,5,7的資料收到了,那麼普通的ack只會確認序列號4,而sack會把當前的5,7已經收到的資訊在sack選項裡面告知對端,從而提高效能,當使用sack的時候,newreno演算法可以不使用,因為sack本身攜帶的資訊就可以使得傳送方有足夠的資訊來知道需要重傳哪些包,而不需要重傳哪些包。

tcp擁塞控制演算法 WebRTC擁塞控制原理解析

webrtc包含三種擁塞控制演算法,gcc bbr和pcc。其中,bbr一開始是針對tcp的擁塞控制提出來的。它的輸入為ack sack,輸出為擁塞視窗 congestion window 傳送速度 pacing rate bbr是怎樣運用到udp,甚至運用到實時流 傳輸之上的?拜讀一下在webrt...

TCP協議中的擁塞控制

tcp擁塞控制作用就是提高網路利用率 降低丟包率 並保證網路資源對每條資料流的公平性。擁塞控制有四部分組成,慢啟動 擁塞避免 快速重傳 快速恢復。擁塞控制的最終受控變數是傳送端向網路一次連續寫入 收到第乙個資料的確認之前 的資料量 我們稱之為 swnd 傳送視窗 傳送端最終以tcp報文段來傳送資料,...

TCP擁塞控制

擁塞控制就是防止過多的資料注入到網路中,這樣可以使網路中的路由器或鏈路不致過載,擁塞控制要做的都有個前提,就是網路能夠承受現有的網路負荷。擁塞控制是個全域性性的過程。幾種擁塞控制方法 慢開始 擁塞避免 快重傳 快恢復 1.慢開始和擁塞避免 傳送方維持乙個叫做擁塞視窗的狀態變數,擁塞視窗取決於網路的擁...