1. 程式人生 > >TCP慢啟動、擁塞避免、快速重傳、快速回復

TCP慢啟動、擁塞避免、快速重傳、快速回復

為了防止網路的擁塞現象,TCP提出了一系列的擁塞控制機制。最初由V. Jacobson在1988年的論文中提出的TCP的擁塞控制由“慢啟動(Slow start)”和“擁塞避免(Congestion avoidance)”組成,後來TCP Reno版本中又針對性的加入了“快速重傳(Fast retransmit)”、“快速恢復(Fast Recovery)”演算法,再後來在TCP NewReno中又對“快速恢復”演算法進行了改進,近些年又出現了選擇性應答( selective acknowledgement,SACK)演算法,還有其他方面的大大小小的改進,成為網路研究的一個熱點。

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

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

      慢啟動:
最初的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啟動擁塞避免快速快速

為了防止網路的擁塞現象,TCP提出了一系列的擁塞控制機制。最初由V. Jacobson在1988年的論文中提出的TCP的擁塞控制由“慢啟動(Slow start)”和“擁塞避免(Congestion avoidance)”組成,後來TCP Reno版本中又針對性的加入了“快速重傳(Fast retransm

淺談TCP/IP四種計時器啟動擁塞避免快速快速恢復

持續計時器 假設一種場景:A給B傳送資料,如果B告訴A自己的緩衝區已滿,於是A停止傳送資料,等待一段時間後,B的緩衝區出現了富餘,於是給A傳送報文告訴rwnd大小為400,但是這個報文不幸丟失了,於是就出現A等待B的通知,B等待A傳送資料的死鎖狀態,為了處理這

啟動擁塞避免超時快速快速恢復滑動視窗

流量控制 因為資料的傳送方和接收方並不一定具有相同的資料處理能力,為了避免資料傳送方的資料傳送過快,而導致其超過了接受端的資料處理能力,TCP採用了流量控制機制,接收方在TCP的包頭裡面採用16位RWND,通告發送方自己的接收視窗,也就是還能夠接收的最多的資料

TCP擁塞控制:啟動擁塞避免快速快速恢復

擁塞控制的目的:為了提高網路利用率,降低丟包率,並保證網路資源對每條資料流的公平性擁塞控制最終是控制了什麼?:傳送端向網路一次連續寫入的資料量,即SWND(傳送視窗)。慢啟動:當主機開始傳送資料時,如果立即將大量資料注入網路,就容易引起網路擁塞。而慢啟動演算法就是先給定一個較

TCP快速快速恢復原理分析

轉自 http://blog.csdn.net/zhangskd/article/details/7174682 超時重傳是TCP協議保證資料可靠性的一個重要機制,其原理是在傳送一個數據以後就開啟一個計時器,在一定時間內如果沒有得到傳送資料報的ACK報文,那麼就重新發送資

TCP快速快速恢復機制

超時重傳是TCP協議保證資料可靠性的一個重要機制,其原理是在傳送一個數據以後就開啟一個計時器, 在一定時間內如果沒有得到傳送資料報的ACK報文,那麼就重新發送資料,直到傳送成功為止。這是資料 包丟失的情況下給出的一種修補機制。一般來說,重傳發生在超時之後,但是如果傳送端接

快速快速恢復

2.2 快重傳和快恢復     如果傳送方設定的超時計時器時限已到但還沒有收到確認,那麼很可能是網路出現了擁塞,致使報文段在網路中的某處被丟棄。這時,TCP馬上把擁塞視窗 cwnd 減小到1,並執行慢開始演算法,同時把慢開始門限值ssthresh減半。這是不使用快重傳的

TCP擁塞控制-啟動擁塞避免啟動

計時 有一個 如果 即將 需求 不知道 算法 停用 連續 一般原理:發生擁塞控制的原因:資源(帶寬、交換節點的緩存、處理機)的需求>可用資源。 作用:擁塞控制就是為了防止過多的數據註入到網絡中,這樣可以使網絡中的路由器或者鏈路不至於過載。擁塞控制要做的都有一個前提:就

超時啟動擁塞控制快速及恢復

1、超時重傳 1、引言 TCP提供可靠的運輸層。它使用的方法之一就是確認從另一端收到的資料。但資料和確認都有可能會丟失。TCP通過在傳送時設定一個定時器來解決這種問題。如果當定時器溢位時還沒有收到確認,它就重傳該資料。對任何實現而言,關鍵之處就在於超時和重傳

TCP擁塞控制——開始與擁塞避免演算法

1.引言 計算機網路中的頻寬、交換結點中的快取和處理機等,都是網路的資源。在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就會變壞。這種情況就叫做擁塞。 擁塞控制就是防止過多的資料注入網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控

11.TCP停止等待超時滑動視窗擁塞控制和快恢復

TCP超時與重傳機制TCP協議是一種面向連線的可靠的傳輸層協議,它保證了資料的可靠傳輸,對於一些出錯,超時丟包等問題TCP設計的超時與重傳機制。其基本原理:在傳送一個數據之後,就開啟一個定時器,若是在這個時間內沒有收到傳送資料的ACK確認報文,則對該報文進行重傳,在達到一定次

【圖解】你還在為 TCP 滑動視窗流量控制擁塞控制發愁嗎?看完圖解就不愁了

每日一句英語學習,每天進步一點點: 前言 前一篇「硬不硬你說了算!近 40 張圖解被問千百遍的 TCP 三次握手和四次揮手面試題」得到了很多讀者的認可,在此特別感謝你們的認可,大家都暖暖的。 來了,今天又來圖解 TCP 了,小林可能會遲到,但不會缺席。 遲到的原因,主要是 TCP 巨複雜,它為了保證

tcp slowstart (TCP 啟動)

狀態 阻塞 算法 設置 最好 基礎上 比較 計算 每一個 tcp slowstart (TCP 慢啟動) 慢啟動定義 慢啟動,是傳輸控制協議使用的一種擁塞控制機制。慢啟動也叫做指數增長期。慢啟動是指每次TCP接收窗口收到確認時都會增長。增加的大小就是已確認段的數目。這種

TCP流量控制和擁塞避免

流量 第一次 操作 recovery 報文段 規律 進入 等於 長度 TCP的流量控制 所謂的流量控制就是讓發送方的發送速率不要太快,讓接收方來得及接受。利用滑動窗口機制可以很方便的在TCP連接上實現對發送方的流量控制。TCP的窗口單位是字節,不是報文段,發送方的

TCP可靠傳輸:校驗和,控制,序號標識,滑動窗口確認應答

控制 增加 接受 方向 技術分享 一個數 應用程序 text 成了 Tcp通過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸 應答碼:ACK TCP的滑動窗口機制 TCP這個協議是網絡中使用的比較廣泛,他是一個面向連接的可靠的傳輸協議。既然是一個

例項理解擁塞視窗和開始和擁塞避免

問題: 設tcp的擁塞視窗的慢開始門限值初始為8,當擁塞視窗上升到12時網路發生超時,那麼第13次傳輸時的擁塞視窗大小為多少? 解答: 慢開始:0->1->2->4->8(傳輸4次) 到達慢開始門限8,進入擁塞避免: 8->9->10->11

tcp 啟動 slow start

如果在傳送端和接收端間存在較慢的鏈路,而傳送端僅根據接收端的快取而一次性的傳送大量分組,中間路由可能會記憶體溢位,會嚴重的降低網路的吞吐量。 慢啟動採取的機制是,傳送新分組的速率應該和接受到應答的速率應一致。 慢啟動維護一個阻塞視窗(congestion window)cwn

啟動擁塞窗體

fix 總結 流量 ont 大於 ews net div edit 在局域網中,發送方一開始便向網絡發送多個報文段,直至達到接收方通告的窗體大小為止。可是。假設收發兩方不在同一個局

R: data.frame 生成操作數組。命名

方案 ram IE bsp isn form 刪除 影響 必須 ################################################### 問題:生成、操作數據框 18.4.27 怎麽生成數據框 data.frame、,,及

TCP連線管理機制-確認應答,超時,滑動視窗,擁塞控制,流量控制,延遲應答

TCP通過確認應答和超時重傳可以保證資料可靠傳輸 使用滑動視窗完成流量控制和擁塞控制 使用延遲應答來保證滑動視窗足夠大 接下來對這些機制進行詳細的介紹 確認應答(ACK)機制 TCP將每個位元組的資料都設定了序列號,每一個ACK都帶有對應的確認序列號,告訴傳送者