1. 程式人生 > >TCP 流量控制和擁塞控制中的重要機制

TCP 流量控制和擁塞控制中的重要機制

TCP 流量控制 擁塞避免

停止等待協議: 放送方發送一個數據包,要收到接收方對該包的確認後,才發送下一個數據包。 缺點:慢,信道利用率低。
ARQ  Automatic Repeat reQuest
接收方采用累加確認的方式,接收方不必對每一個分組進行缺,只需要對按序到達的最後一個分組發送確認。
缺點:當發送方發送了5個分組,中間第3個丟失,那麽接收方只對前兩個分組進行確認。發送方只好把後面的3個分組都重傳一次。這叫做Go-back-N(回退N)
選擇確認 selective ack
接收方對接收到的數據字節流中,若有中間字節塊的缺失,只需要重新傳輸缺失的就可以了,對已經接收到的字節塊無需重傳。
需要在TCP首部的選項中設置 ”允許SACK” 的選項。
TCP流量控制:
讓發送方的發送速率不要太快,要讓接收方來得及接收。端到端的問題。
機制:滑動窗口
S--------------->R
當接收方R 的窗口為0時候,S就不能再發送數據了。當R的窗口不為0時候R會發送一個數據給S來表明當前的窗口大小,但是為了防止S收不到R又有窗口的通告,S啟動一個持續計時器(persistent timer),只要TCP連接的一方接收到對方的零窗口通告,就啟動持續計時器。若持續計時器設置的時間到期,那麽發送一個零窗口的探測報文段。

Nagle算法:
此算法在TCP的實現中廣泛使用。
若發送應用進程把要發送的數據逐個字節地發送到TCP的發送緩存,則發送方就把第一個數據字節先發出去,把後面到達的數據緩存起來。當發送接收到對第一個數據字符的確認後,再把發送緩存中的所有數據組裝成一個報文段發送出去,同時繼續對隨後到達的數據進行緩存。只有收到對前一個報文段的確認後才繼續發送下一個報文段。Nagle算法還規定,當到達的數據已經達到發送窗口的一半或已經達到報文段的最大長度時,就立即發送一個報文。

糊塗窗口綜合癥:
接收方緩存已經滿了,並且一次只從緩存讀取一個字節,所以通告給發送方的窗口只有一個字節,那麽接收方一次只發送一個字節的數據,但是發送效率低,因為一個字節數據要40個字節協議頭部。如果每次發送一個字節的話效率很低,解決方法是:讓接收方等待一段時間,再通告自己的窗口大小給接收方。



TCP擁塞控制:
是整個網絡的問題(全局性的)。

①慢開始和擁塞避免:
    發送方維持一個叫做擁塞窗口CWND(congestion window)的狀態變量。發送方的擁塞窗口等於自己發送窗口。
慢開始:
發送方一開始設置CWND=1,發送一個包,接收到該包確認後,發送方設置CWND=2,發送之後,接收到該包的確認,發送方設置CWND=4 ……以此類推,成倍增長。
千萬註意:窗口大小並不時一次性發送數據的大小,發送方可以根據CWND進行連續幾次的發數據,這連續發送的數據大小不應該超過CWND。

   為了防止cwnd增長過大引起網絡擁塞,還需要設置一個慢啟動開始門限 ssthresh 。
當cwnd等於ssthresh 的時候,cwnd並不在是成倍的增長了,而是逐漸加1

技術分享圖片
當網絡擁塞時候(就是發送方沒有按時接收到確認),那麽就把慢開始門限值設置成當前的CWND的一半,接著將cwnd設置為1,執行慢開始算法。

②快重傳和快恢復:
快重傳要求接收方收到一個失序報文段後立即發送重復確認(目的是讓發送方盡早知道數據段沒到達),而不要等到自己發送確認數據時候後捎帶。
發送方發送5個報文,第3個缺失,收到第四個報文時候立即發送對第2個的重復確認,接收到第4個、第五個報文時候也發送對第2個的重復確認。只要發送方一連收到3個重復確認就應該重發接收發未收到的報文,而不必等到第3個報文的重傳計時器過期才重發。
因此,使用快重傳可以提高整個網絡的吞吐量。

技術分享圖片

快恢復與快重傳配合使用:
當發送方連續接收到3個重復確認,就執行“乘法減小”算法,把慢開始門限值ssthresh設置為當前CWND的一半,同時,將此時的CWND=新的ssthresh值,接下去並不執行慢開始算法。
因為收到3個重復報文並不時意味著網絡出現問題,可能僅僅就是那個包缺失了,所以ssthresh減半後,cwnd在ssthresh的基礎上逐漸加1。

技術分享圖片

TCP 流量控制和擁塞控制中的重要機制