常見的tcp擁塞控制有哪幾種演算法

時間 2021-12-24 05:30:46

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

如果頻寬為w,那麼經過rtt*log2w時間就可以佔滿頻寬。

擁塞避免:從慢啟動可以看到,cwnd可以很快的增長上來,從而最大程度利用網路頻寬資源,但是cwnd不能一直這樣無限增長下去,一定需要某個限制。tcp使用了一個叫慢啟動門限(ssthresh)的變數,當cwnd超過該值後,慢啟動過程結束,進入擁塞避免階段。

對於大多數tcp實現來說,ssthresh的值是65536(同樣以位元組計算)。擁塞避免的主要思想是加法增大,也就是cwnd的值不再指數級往上升,開始加法增加。此時當視窗中所有的報文段都被確認時,cwnd的大小加1,cwnd的值就隨著rtt開始線性增加,這樣就可以避免增長過快導致網路擁塞,慢慢的增加調整到網路的最佳值。

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

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

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

2.把cwnd重新設定為1

3.重新進入慢啟動過程。

從整體上來講,tcp擁塞控制視窗變化的原則是aimd原則,即加法增大、乘法減小。可以看出tcp的該原則可以較好地保證流之間的公平性,因為一旦出現丟包,那麼立即減半退避,可以給其他新建的流留有足夠的空間,從而保證整個的公平性。

其實tcp還有一種情況會進行重傳:那就是收到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需要收到該視窗內所有資料包的確認後才會退出快速恢復狀態,從而更一步提高吞吐量。

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

tcp/ip採用什麼方法進行擁塞控制

2樓:

tcp window機制

常見的咖啡有哪幾種,咖啡都分哪幾種?

滿腦子都是油 1 拿鐵咖啡 caff latte 拿鐵是由一小杯濃縮和一杯牛奶製作而成與卡布奇諾一樣,拿鐵咖啡中牛奶多而咖啡少,因為含有大量牛奶適合在早餐飲用,比卡布奇諾多了鮮奶味道,味道也更香醇。卡布奇諾是一種加入以同量的義大利特濃咖啡和蒸汽泡沫牛奶相混合的義大利咖啡。傳統的卡布奇諾咖啡是三分之一...

招標方式有幾種,常見的招標方式有哪幾種

一 招標方式有幾種。1 招標分為公開招標和邀請招標。公開招標是指招標人以招標公告的方式邀請不特定法人或者其他組織投標 邀請招標是指招標人以投標邀請書的方式邀請特定法人或者其他組織投標。2 法律依據 中華人民共和國招標投標法 第一條。為了規範招標投標活動,保護國家利益 社會公共利益和招標投標活動當事人...

常見植物有哪幾大科,植物有哪幾種

哈哈 這個問我就對了。蘭科,松科,柏科,百合科,木蘭,石竹科,薔薇科。 植物首先分成藻類植物 地衣植物 苔蘚植物 蕨類植物 種子植物幾大類!其中的種子植物可以分成裸子植物和被子植物兩個亞門。被子植物又分為雙子葉植物和單子葉植物兩個綱。其中雙子葉植物可以分成四十多個目,因為分類系統的不同還有區別,木蘭...