傳輸層TCP(流量控制和擁塞控制)

轉載自:https://blog.csdn.net/zgege/article/details/80445324

內容 關鍵字
流量控制 窗口大小,窗口擴大因子M,機理,窗口探測數據段
擁塞控制 擁塞窗口,慢啓動,閾值

流量控制概念

接收端處理數據的速度是有限的,如果發送方的速度太快,就會把緩衝區u打滿。這個時候如果繼續發送數據,就會導致丟包等一系列連鎖反應。

所以TCP支持根據接收端能力來決定發送端的發送速度。這個機制叫做流控制。


窗口大小

(接收端向發送端主機通知自己可以接受數據的大小,這個大小限制就叫做窗口大小)

窗口擴大因子M

接收端如何把窗口大小告訴發送端呢? 回憶我們的TCP首部中, 有一個16位窗口字段, 就是存放了窗口大小信息;那麼問題來了, 16位數字最大表示65535, 那麼TCP窗口最大就是65535字節麼?實際上, TCP首部40字節選項中還包含了一個窗口擴大因子M,
實際窗口大小是 窗口字段的值左移 M 位;


機理

接收端將自己可以接收的緩衝區大小放入 TCP 首部中的 “窗口大小” 字段, 通過ACK端通知發送端;窗口大小字段越大, 說明網絡的吞吐量越高;
接收端一旦發現自己的緩衝區快滿了, 就會將窗口大小設置成一個更小的值通知給發送端;發送端接受到這個窗口之後, 就會減慢自己的發送速度;

如果接收端緩衝區滿了, 就會將窗口置爲0; 這時發送方不再發送數據, 但是需要定期發送一個窗口探測數據段, 使接收端把窗口大小告訴發送端

如圖
這裏寫圖片描述

當接收端收到從3001號開始的數據段後其緩衝區擠滿。不得不暫時停止發送數據,之後窗口收到更新通知後才得以繼續進行。如果這個通知在途中丟失了,可能導致無法繼續通信。所以發送方會是不是發送一個窗口探測的數據段。此數據端僅含一個字節來獲取最新的窗口大小。


擁塞控制

雖然TCP有了滑動窗口這個大殺器, 能夠高效可靠的發送大量的數據. 但是如果在剛開始階段就發送大量的數據, 仍然可能引發問題.因爲網絡上有很多的計算機, 可能當前的網絡狀態就已經比較擁堵. 在不清楚當前網絡狀態下, 貿然發送大量的數據, 是很有可能引起雪上加霜的.TCP引入 慢啓動 機制, 先發少量的數據, 探探路, 摸清當前的網絡擁堵狀態, 再決定按照多大的速度傳輸。
這裏寫圖片描述

此處引入一個概念程爲擁塞窗口,擁塞窗口發送開始的時候, 定義擁塞窗口大小爲1;每次收到一個ACK應答, 擁塞窗口加1;

每次發送數據包的時候, 將擁塞窗口和接收端主機反饋的窗口大小做比較, 取較小的值作爲實際發送的窗口;像上面這樣的擁塞窗口增長速度, 是指數級別的. “慢啓動” 只是指初使時慢, 但是增長速度非常快.爲了不增長的那麼快, 因此不能使擁塞窗口單純的加倍.此處引入一個叫做慢啓動的閾值。
當擁塞窗口超過這個閾值的時候, 不再按照指數方式增長, 而是按照線性方式增長

當TCP開始啓動的時候, 慢啓動閾值等於窗口最大值;在每次超時重發的時候, 慢啓動閾值會變成原來的一半, 同時擁塞窗口置回1;少量的丟包, 我們僅僅是觸發超時重傳; 大量的丟包, 我們就認爲網絡擁塞;

這裏寫圖片描述

當TCP通信開始後, 網絡吞吐量會逐漸上升; 隨着網絡發生擁堵, 吞吐量會立刻下降;擁塞控制, 歸根結底是TCP協議想盡可能快的把數據傳輸給對方, 但是又要避免給網絡造成太大壓力的折中方案.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章