TCP是最常用的傳輸層協議之一,為上層協議提供面向連線的可靠傳輸服務。 為了提供盡可能大的吞吐量,TCP採用滑動視窗和擁塞視窗機制來控制在某個時間點傳送到網路的資料量,從而盡可能多地占用可用頻寬,不造成擁塞。 網路中通常存在瓶頸,資料包積壓甚至丟棄。 因此,TCP流量控制的關鍵是控制瓶頸處的報文積壓,過快的積壓會導致擁塞。 擁堵是如何形成的?什麼原因導致擁堵?發件人如何看待擁堵?如何緩解擁堵?
byte in flight
在開始本文之前,我們先介紹一下飛行中的位元組的概念 “傳輸中的位元組數”1 的更形象的翻譯是指已傳送但尚未收到 ACK 確認的位元組數,這大約等於當前在網路中傳輸和積壓的資料包位元組數的總和。 傳輸中的位元組大小對瓶頸處的資料包積壓有直接影響。 根據滑動視窗的概念,可以知道飛行中的位元組大小受到傳送視窗2的限制(飛行中的位元組<=傳送視窗),並形成擁塞。
擁堵是如何形成的?看似簡單的問題,其實並不是每個人腦海中的清晰畫面。 簡而言之,擁塞的主要原因是資料傳送者向網路傳遞的資料超出了網路的承載能力。 就像水管的流量取決於最小的部分一樣,網路的承載能力取決於網路上可用頻寬最小的路徑,即存在瓶頸的地方。 網路裝置介面往往有緩衝區,多餘的資料無法從瓶頸路徑傳送,所以它們不得不在緩衝區排隊,緩衝區的大小是有限的,積壓的資料量超過緩衝區的大小,就會發生丟棄,這就像漏斗裡澆水一樣。
擁塞可能由於以下原因而發生:
網路中存在吞吐量小於節點每單位時間傳送的資料量的瓶頸。
接收緩衝區大於瓶頸處的可用緩衝區。
1. 什麼是網路擁塞?
是指當分組交換網路中傳輸的報文數量過大時,由於儲存節點資源有限,導致網路傳輸效能下降的情況。 當網路擁塞時,資料丟失、延遲增加、吞吐量下降,嚴重時甚至會出現擁塞崩潰。 通常,當網路上的負載過度增加時,就會發生網路擁塞,從而導致網路效能下降。
擁堵原因:
2.交換節點的快取是有限的。
3.節點的處理能力有限。
歸根結底,當我們訴諸於對>可用資源的需求時,就會發生網路擁塞。
2. TCP如何處理網路擁塞?
其實要解決以上問題,我們只需要保證兩點,第一,我們傳送的IP資料包不會丟失,第二,我們必須保證傳送速度最大化。
滑動視窗:TCP處理網路擁塞,主要涉及動態變化的視窗(擁塞視窗,也可以稱為滑動視窗),視窗的數量與網路擁塞程度有關,當網路情況良好時,擁塞視窗繼續增加,傳送方的視窗自然增加,但接收方的接收能力有限, 當傳送方的視窗達到一定大小時,它不會改變。在通用TCP協議中,擁塞視窗數為65536,小於此值時,採用慢啟動演算法增加傳送的IP報文數,當大於等於該值時,採用擁塞控制演算法增加傳送的IP報文數。
發件人如何確定擁塞
當我們傳送資料包時,如果我們在一段時間內沒有收到確認資料包,那麼我們可以假設網路擁塞。
慢啟動演算法:
當傳送方開始傳送資料報時,如果立即將大量資料注入網路,則可能會發生擁塞。 慢啟動演算法在傳送方首次開始傳送資料報時檢測網路狀態,如果網路狀況良好,傳送方每次傳送訊息時都能正確接受確認訊息。 然後將擁塞視窗的大小從小到大增加,即增加傳送的 IP 資料包數量。 通常,傳送的 IP 資料包數量通過電源到電源而增加。 例如,如果傳送方設定 cwnd(擁塞視窗)= 1 傳送第乙個資料包段 m1,則在接收方收到 m1 後,傳送方收到接收方的確認並將 cwnd 增加到 2,則傳送方傳送 m2 和 m3,傳送方收到接收方傳送的確認後 cwnd 增加到 4。
擁塞控制演算法:
就是讓CWND緩慢增加而不是增加一倍,每經歷一次往返時間,CWND增加1而不是翻倍,這樣CWND增長緩慢,比慢啟動慢得多。
擁塞規避:如上所述,擁塞視窗數(ssthresh)的閾值一般為65536,因此有如下演算法:
1.當CWND
3.,當 cwnd = ssthresh 時,兩種演算法都很好。
當出現網路擁塞時,將閾值 ssthresh 的數量減半,然後將 cwnd 的數量改為 1,然後使用慢啟動演算法,快速減少向網路傳輸資料的主機數量,使擁塞的路由器可以處理佇列中堆積的資料包。
示例:例如,如果我們的 CWND(即我們要傳送的 IP 資料包數)為 1,那麼我們的閾值為 16。
1.慢啟動演算法開始時,CWND的初始值為1,傳送方每收到一次ACK,擁塞視窗就會增加1,當SSTHRESH = CWND時,會啟動擁塞控制演算法,擁塞視窗會按規律增加。
快速重傳演算法要求接收方在收到無序資料包段後立即傳送重複的確認,而不是等待接收方傳送資料後再捎帶確認。 接收方成功接收了傳送方的 M1 和 M2 並傳送 ACK 給 ACK,但現在接收方沒有收到 M3,而是接收 M4,顯然接收方無法確認 M4,因為 M4 是亂序報文段。 如果接收方按照可靠傳輸的原則什麼都不做,而是按照快速重傳演算法,在接收到M4、M5等資料包段時,重複向傳送方傳送M2的ACK,如果接收方連續收到三個重複的ACK,傳送方就不必等待重傳定時器到期, 因為傳送方會盡快重新傳輸未確認的資料包段。
第四,快速恢復。
1.當傳送方連續收到三次確認時,執行乘法約簡演算法將慢啟動閾值(ssthresh)降低一半,但接下來不執行慢啟動演算法。
2.此時,不要執行慢啟動演算法,而是將cwnd設定為ssthresh的一半,然後執行擁塞規避演算法,使擁塞視窗緩慢增加。