TCP 流量控制 和擁塞控制
TCP 流量控制
- 一條TCP連線的每一側主機都為該連線設定了接收快取。
- 當TCP連線收到正確、按序的位元組後,它就將資料放入接收快取。
- 相關聯的應用程序會從該快取中讀取資料,但不必是資料剛一到達就立即讀取。
- TCP為它的應用程式提供流量控制服務,以消除傳送方使接收方應用快取溢位的可能性。
- 假設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。
這個過程是指數增長的。
何時結束這種指數增長?
- 存在一個由超時指示的丟包事件
TCP傳送方將cwnd=1,並重新開始慢啟動過程
將ssthresh = cwnd/2,將監測到擁塞時將ssthresh設定為擁塞視窗的一半 - 與ssthresh相關聯,cwnd = ssthresh 時
結束慢啟動,將TCP轉移到擁塞避免模式
當TCP處於擁塞避免模式時,TCP會更為謹慎的增加cwnd。 - 當監測到3個冗餘ACK時,這時TCP執行一種快速重傳
由慢啟動狀態進入到快速恢復狀態
2. 擁塞避免
當進入到擁塞避免狀態時,cwnd的值大約變為上次遇到擁塞值時的一半,距離擁塞可能並不遙遠。
TCP無法每過一個RTT將cwnd的值提高一倍,每個RTT只將cwnd的值增加一個MSS。完成方式有:
- 對於TCP傳送方無論何時到達的一個確認,就將cwnd增加一個MSS * (MSS/cwnd)位元組。
假設MSS = 1460B, CWND= 14600B, 則在一個RTT內傳送10個報文段。每個到達ACK增加(1/10) *MSS的擁塞視窗長度。
何時結束擁塞避免的線性增加? - 出現超時時
ssthresh = cnwd/2
cwnd = 1, 然後進入慢啟動過程 - 當監測到3個ACK時,cwnd也要收到3個MSS,
- TCP Tahoe版本: ssthresh變為cwnd 的一半, cwnd = 1 ->進入慢啟動狀態
- TCP Reno版本: ssthresh 變為cwnd的一半,cwnd = ssthresh + 3 -> 快速恢復版本->進入擁塞避免狀態
3. 快速恢復
對於引起TCP進入快速恢復狀態的缺失報文段,對收到的每個冗餘的ACK,cwnd的值增加一個MSS。
最終,當對丟失報文段的一個ACK到達時,TCP在降低cwnd後進入擁塞避免狀態。