1. 程式人生 > >TCP連線擁塞控制四種方法總結(詳細簡單,穩的一批)

TCP連線擁塞控制四種方法總結(詳細簡單,穩的一批)

擁塞控制的一般原理

在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路的效能就要變換,叫做擁塞

擁塞控制和流量控制的區別:

擁塞控制往往是一種全域性的,防止過多的資料注入到網路之中,而TCP連線的端點只要不能收到對方的確認資訊,猜想在網路中發生了擁塞,但並不知道發生在何處,因此,流量控制往往指點對點通訊量的控制,是端到端的問題。

當提供的負載繼續增大到某一數值時,網路的吞吐量就下降到零,網路無法工作,產生所謂的死鎖。

 

擁塞控制可以分為開環控制和閉環控制

1.開環控制,在設計網路時把因素考慮到

2.閉環控制,基於反饋環路,使用擁塞的資訊來進行調整網路

---------------------------------------------------------------------------------------------------------------------

幾種擁塞控制方法

總共四種:慢開始,擁塞避免,快重傳,快恢復

1.慢開始和擁塞避免

傳送方維持一個叫做擁塞視窗cwnd,根據網路來進行動態的調整大小,網路擁塞的時候,路由器會丟棄報文,當傳送方沒有按時收到確認報文,那麼就知道網路發生了擁堵。

現在結合擁塞視窗cwnd的變化來看一下上述兩個方法

慢開始的“慢”指的是,初始cwnd=1(此時表示的是報文段的個數,而不是真正傳輸時使用的位元組流)

我們來簡單的論一下這個過程:

1.開始時傳送方cwnd=1,傳送報文段M1,如果收到確認M1,那麼此時增大cwnd=2,併發送M2,M3

2.要注意,傳送方每收到一個確認報文段,cwnd+1(不包括缺失重傳的確認)

也就是說,每經過一個傳輸倫次(RTT時間),cwnd加倍。

但是,為了防止擁塞視窗cwnd增長過大而引起網路擁塞,設定一個慢開始門限ssthresh。

1.當cwnd<ssthresh,使用上述的慢開始演算法

2.當cwnd>ssthresh,停止使用慢開始,使用擁塞避免演算法

3.當cwnd==ssthresh,兩者都可以使用

那麼理所當然的,現在我們要來看一下擁塞避免演算法。

擁塞避免演算法的思路是讓擁塞視窗cwnd緩慢增大,即每經過一個往返時間RTT就把傳送方的擁塞視窗cwnd+1,而不是加倍(也就是收到兩個,四個確認,仍然+1),這樣cwnd就按線性增大

 

 

此時我們假設ssthresh為16,也就是超過這個值就要轉化為擁塞避免演算法,並且假設到24的時候,網路出現擁堵。

此時我們注意兩個詞:

1.乘法減小:也就是說,當擁塞避免演算法增長到24之後,我們更新ssthresh=24/2=12,之後再重新執行之前的兩個演算法。乘法減小,指的就是ssthresh減半

2.加法增大:指的是,執行擁塞避免演算法之後,cwnd線性的進行增長,防止很快就遇到網路擁塞狀態

2.快重傳和快恢復

快重傳的核心:

當接收方收到了一個失序的報文,馬上報告給傳送方,我沒收到,趕緊重傳(天下武功唯快不破),加入M2收到了,M3沒有收到,之後的M4,M5,M6又傳送了,此時接收方一共連續給傳送方反饋了4個M2確認報文。那麼快重傳規定,傳送方只要連續收到3個重複確認,立即重傳對方發來的M3

 

那麼我們再來看一下快恢復

兩個要點:

1.當傳送方連續收到三個重複確認,執行乘法減小,ssthresh減半

2.由於傳送方可能認為網路現在沒有擁塞,因此與慢開始不同,把cwnd值設定為ssthresh減半之後的值,然後執行擁塞避免演算法,線性增大cwnd

 其實呢,對於接收方也是用限額的,有一個rwnd,也就是接收視窗,那麼實際上,傳送方視窗的上限=min(rwnd,cwnd)

大哥們,我也就是回顧總結一下本科時《計算機網路》這裡所說,如有不周,歡迎指正