目錄
- 1、TCP重傳機制
- 超時重傳
- 快速重傳
- 2、滑動窗口
- 3、流量控制
- 4、擁塞控制
- 1、慢啟動
- 2、擁塞避免
- 3、擁塞發生
1、TCP重傳機制
TCP 針對數據包丟失的情況,會用重傳機制解決。
超時重傳
就是在發送數據時,設定一個定時器,當超過指定的時間還沒有收到對方的 ACK 確認應答報文,就會重發該數據。
RTT往返時延是數據包的往返時間,超時重傳時間的值應該略大于報文往返 RTT 的值。
快速重傳
不以時間為驅動,而是以數據驅動重傳。
快速重傳的工作方式是當收到三個相同的 ACK 報文時,會在定時器過期之前,重傳丟失的報文段。
比如A給B發了1、2、3、4、5個報文,B收到1后應答2表示希望收到2,但是2丟失了,后面B收到3、4、5時都返回2,A收到了三個 Ack = 2 的確認,知道了 Seq2 還沒有收到,就會在定時器過期之前,重傳丟失的 Seq2。
【它依然面臨著另外一個問題。發送方并不清楚這連續的 ACK2 是接收方收到哪個報文而回復的,是重傳一個,還是重傳所有的報文。】
選擇性確認
在 TCP 頭部「選項」字段里加一個 SACK數據,它可以將已收到的數據的信息發送給「發送方」,這樣發送方就可以知道哪些數據收到了,哪些數據沒收到,知道了這些信息,就可以只重傳丟失的數據。
2、滑動窗口
我們都知道 TCP 是每發送一個數據,都要進行一次確認應答。當上一個數據包收到了應答了, 再發送下一個。這種方式的效率比較低。
所以TCP引入了窗口這個概念,窗口大小就是指無需等待確認應答,而可以繼續發送數據的最大值。窗口實際上是操作系統開辟的一個緩存空間,發送方主機在等到確認應答返回之前,必須在緩沖區中保留已發送的數據。如果按期收到確認應答,此時數據就可以從緩存區清除。而且還會有累計應答,只要發送方收到了 ACK xx 確認應答,就意味著 xx 之前的所有數據「接收方」都收到了,這樣即使之前有應答丟失了也沒事。
3、流量控制
發送方不能無腦的發數據給接收方,要考慮接收方處理能力。如果一直無腦的發數據給對方,但對方處理不過來,導致網絡流量的無端的浪費。TCP 提供一種機制可以讓「發送方」根據「接收方」的實際接收能力控制發送的數據量。
- TCP流量控制的主要機制是通過滑動窗口實現的。發送方根據接收方的窗口大小和網絡情況動態調整自己的發送窗口大小。
4、擁塞控制
流量控制是避免「發送方」的數據填滿「接收方」的緩存
擁塞控制是避免「發送方」的數據填滿整個網絡
擁塞窗口cwnd是發送方根據網絡的擁塞程度而動態維護的一個的變量。
發送窗口的值 是擁塞窗口和接收窗口中的最小值。
擁塞控制三個階段:慢啟動-》擁塞避免-》擁塞發生
1、慢啟動
有個ssthresh慢啟動門限的變量
TCP 在剛建立連接完成后,首先是有個慢啟動的過程,一點一點的提高發送數據包的數量,發包的個數是指數性的增長,也就是擁塞窗口1、2、4、8這樣。
當 擁塞窗口cwnd 超過 ssthresh慢啟動門限 時,開始「擁塞避免算法」。
2、擁塞避免
進入擁塞避免算法后,每當收到一個 ACK 時,擁塞窗口cwnd 增加 1,也就是變成了線性增長。所以還是增長階段,只是增長速度緩慢了一些。
3、擁塞發生
一直增長后,網絡就會慢慢進入擁塞的狀況,于是就會出現丟包現象,需要對丟失的數據包進行重傳。
我們知道,重傳一般也就超時重傳和快速重傳。
- 當發生了「超時重傳」,則就會使用擁塞發生算法。
ssthresh慢啟動門限 設為 擁塞窗口的一半,擁塞窗口重置為 1(初始值),然后重新進入慢啟動階段。
這種方式太激進,反應也很強烈,會造成網絡卡頓。 - 當發生了「快速重傳」,使用快速恢復算法。
快速恢復算法是認為,你還能收到 3 個重復 ACK 說明網絡也不那么糟糕。此時慢啟動門限和擁塞窗口都設為原擁塞窗口的一半,然后重新進入擁塞避免階段;
TCP擁塞控制是傳輸控制協議(TCP)中用于防止網絡擁塞的一種機制。當網絡中的流量過多時,可能會導致數據包丟失和延遲增加,擁塞控制的目的是避免這種情況的發生。TCP擁塞控制主要基于以下四個算法:
慢啟動(Slow Start):
慢啟動是TCP開始發送數據時的初始階段,此時擁塞窗口(Congestion Window, cwnd)從1個最大報文段(MSS)開始,每收到一個確認(ACK),cwnd 就增長1個MSS,直到達到一個閾值(ssthresh),之后切換到擁塞避免算法。
擁塞避免(Congestion Avoidance):
當cwnd超過ssthresh后,擁塞避免算法開始工作。此時,cwnd的增長速率會減慢,每經過一個往返時間(RTT),cwnd增長1個MSS。這種增長方式是線性的,而不是指數級的。
快重傳(Fast Retransmit):
當接收方檢測到失序的報文段時,它會立即發送重復ACK(Duplicate ACK),而不是等待自己的數據發送時才進行確認。當發送方接收到三個相同的重復ACK時,會立即重傳該報文段,而不是等待重傳計時器到期。
快恢復(Fast Recovery):
快恢復是與快重傳配合使用的算法。當發送方接收到三個重復ACK時,會將ssthresh設置為當前cwnd的一半,并將cwnd設置為ssthresh加3個MSS,然后進入擁塞避免狀態,而不是慢啟動。
選擇性確認(Selective Acknowledgments, SACK):
SACK是TCP的一個選項,允許接收方明確告訴發送方哪些數據已經被成功接收,哪些需要重傳。這可以減少不必要的重傳,提高網絡效率。
延遲確認(Delayed Acknowledgments):
延遲確認是接收方為了減少發送ACK的數量而采取的一種策略,它會等待一段時間或直到收到一定數量的數據后再發送ACK。
窗口縮放(Window Scaling):
窗口縮放允許TCP窗口大小超過64KB的限制,這對于高速網絡來說是非常有用的,可以顯著提高傳輸效率。
擁塞窗口全開(Congestion Window Full, CWnd Full):
當cwnd達到最大窗口大小時,TCP會根據網絡的反饋來調整數據的發送速率,以避免網絡擁塞。
TCP擁塞控制的這些算法共同工作,以確保網絡中的流量得到合理分配,減少數據包丟失,提高網絡的整體性能和穩定性。然而,擁塞控制算法的選擇和調整通常依賴于具體的網絡環境和應用需求。
擁塞窗口全開(Congestion Window Full,簡稱CWND Full)并不是一個標準的TCP擁塞控制算法,而是對TCP擁塞窗口(Congestion Window,簡稱CWND)在達到最大值時行為的一種描述。在TCP擁塞控制中,CWND是一個重要的參數,用于控制發送端可以連續發送的數據量,而不受接收端接收能力的限制。
以下是CWND全開的一些概念和行為:
CWND增長:在TCP連接建立初期,CWND從1個最大報文段(MSS)開始,隨著數據的成功傳輸,CWND會逐漸增長。
慢啟動階段:CWND按照指數方式增長,直到達到慢啟動閾值(ssthresh),此時進入擁塞避免階段。
擁塞避免階段:CWND的增長速度會減慢,通常每經過一個往返時間(RTT),CWND增加1個MSS,增長方式為線性增長。
達到最大值:當CWND增長到一個預設的最大值(例如,由操作系統或網絡環境決定的值)時,CWND就被認為是"全開"的。此時,CWND不再增長,發送端將根據這個窗口大小來控制數據的發送速率。
擁塞信號:在CWND全開的情況下,如果發生丟包或其他擁塞信號,TCP會采取措施減少CWND的大小,以避免進一步的擁塞。這通常涉及到將ssthresh設置為當前CWND的一半,并將CWND重置為1個MSS,然后重新進入慢啟動階段。
自適應調整:在某些情況下,TCP可能會使用自適應算法來調整CWND的最大值,以更好地適應網絡條件。例如,使用自適應擁塞控制算法(如Vegas)的TCP變種會根據網絡反饋來調整CWND的增長和減少策略。
網絡環境影響:CWND全開的行為會受到網絡環境的影響,例如帶寬、延遲、丟包率等。在高帶寬、低延遲的網絡環境中,CWND可能會增長到較大值,而在擁塞嚴重的網絡中,CWND的增長可能會受到限制。
CWND全開是一個動態的過程,它依賴于網絡條件和TCP擁塞控制算法的實現。正確地管理CWND的大小對于優化網絡性能和避免擁塞至關重要。