1. 程式人生 > 其它 >TCP 流量控制 和擁塞控制

TCP 流量控制 和擁塞控制

TCP 流量控制

  1. 一條TCP連線的每一側主機都為該連線設定了接收快取。
  2. 當TCP連線收到正確、按序的位元組後,它就將資料放入接收快取。
  3. 相關聯的應用程序會從該快取中讀取資料,但不必是資料剛一到達就立即讀取。
  4. TCP為它的應用程式提供流量控制服務,以消除傳送方使接收方應用快取溢位的可能性。
  5. 假設TCP接收方丟棄失序的報文段。

TCP讓傳送方維護一個稱為 接收視窗 的變數(2B)
接收視窗給傳送方一個提示: 該接收方還有多少可用的快取空間,接收快取用RcvBuffer表示其大小。

LastByteRcv - lastByteRead <= rcvBuffer
主機A輪流跟蹤兩個變數LastByteSent和LastByteAcked,主機A傳送到連線中但是還未被確認的資料量。
主機A在連線的整個生命過程中需要保證 LastByteSent - LastByteAcked <= rwnd。
當cwnd == 0當時候,主機A繼續傳送只有一個位元組資料的報文段,這些報文段會被接收方進行確認。

TCP 擁塞控制

擁塞: congestion
在一個傳送方中未被確認的資料量會小於 min(cwnd, rwnd)
TCP擁塞控制演算法包括3個主要部分: 1. 慢啟動 2. 擁塞避免 3. 快速恢復

1. 慢啟動

當一條TCP連線開始時,cwnd的值通常初始值置為一個MSS的較小值, 使初始傳送速率為MSS/RTT
假設MSS=500B,RTT=200ms,那麼傳送速率約為220kbps,遠小於頻寬,TCP希望傳送方迅速找到可用頻寬的數量。
慢啟動: cwnd的值以1個MSS開始,並且每當傳輸的報文段首次被確認就增加一個MSS。
比如一個發過去了,然後下一次發了2個,然後收到2個,然後就會發4個MSS。
這個過程是指數增長的。

何時結束這種指數增長?

  1. 存在一個由超時指示的丟包事件
    TCP傳送方將cwnd=1,並重新開始慢啟動過程
    將ssthresh = cwnd/2,將監測到擁塞時將ssthresh設定為擁塞視窗的一半
  2. 與ssthresh相關聯,cwnd = ssthresh 時
    結束慢啟動,將TCP轉移到擁塞避免模式
    當TCP處於擁塞避免模式時,TCP會更為謹慎的增加cwnd。
  3. 當監測到3個冗餘ACK時,這時TCP執行一種快速重傳
    由慢啟動狀態進入到快速恢復狀態

2. 擁塞避免

當進入到擁塞避免狀態時,cwnd的值大約變為上次遇到擁塞值時的一半,距離擁塞可能並不遙遠。
TCP無法每過一個RTT將cwnd的值提高一倍,每個RTT只將cwnd的值增加一個MSS。完成方式有:

  1. 對於TCP傳送方無論何時到達的一個確認,就將cwnd增加一個MSS * (MSS/cwnd)位元組。
    假設MSS = 1460B, CWND= 14600B, 則在一個RTT內傳送10個報文段。每個到達ACK增加(1/10) *MSS的擁塞視窗長度。
    何時結束擁塞避免的線性增加?
  2. 出現超時時
    ssthresh = cnwd/2
    cwnd = 1, 然後進入慢啟動過程
  3. 當監測到3個ACK時,cwnd也要收到3個MSS,
  4. TCP Tahoe版本: ssthresh變為cwnd 的一半, cwnd = 1 ->進入慢啟動狀態
  5. TCP Reno版本: ssthresh 變為cwnd的一半,cwnd = ssthresh + 3 -> 快速恢復版本->進入擁塞避免狀態

3. 快速恢復

對於引起TCP進入快速恢復狀態的缺失報文段,對收到的每個冗餘的ACK,cwnd的值增加一個MSS。
最終,當對丟失報文段的一個ACK到達時,TCP在降低cwnd後進入擁塞避免狀態。