開發

TCP之 流量控制與擁塞控制

廣告
廣告

今天跟大家分享TCP之 流量控制與擁塞控制的知識。

1 流量控制

什么是流量控制?流量控制的目的?

如果發送者發送數據過快,接收者來不及接收,那么就會有分組丟失。為了避免分組丟失,控制發送者的發送速度,使得接收者來得及接收,這就是流量控制。流量控制根本目的是防止分組丟失,它是構成TCP可靠性的一方面。

如何實現流量控制?

由滑動窗口協議(連續ARQ協議)實現。滑動窗口協議既保證了分組無差錯、有序接收,也實現了流量控制。主要的方式就是接收方返回的 ACK 中會包含自己的接收窗口的大小,并且利用大小來控制發送方的數據發送。

流量控制引發的死鎖?怎么避免死鎖的發生?

當發送者收到了一個窗口為0的應答,發送者便停止發送,等待接收者的下一個應答。但是如果這個窗口不為0的應答在傳輸過程丟失,發送者一直等待下去,而接收者以為發送者已經收到該應答,等待接收新數據,這樣雙方就相互等待,從而產生死鎖。為了避免流量控制引發的死鎖,TCP使用了持續計時器。每當發送者收到一個零窗口的應答后就啟動該計時器。時間一到便主動發送報文詢問接收者的窗口大小。若接收者仍然返回零窗口,則重置該計時器繼續等待;若窗口不為0,則表示應答報文丟失了,此時重置發送窗口后開始發送,這樣就避免了死鎖的產生。

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

擁塞控制:擁塞控制是作用于網絡的,它是防止過多的數據注入到網絡中,避免出現網絡負載過大的情況;常用的方法就是:( 1 )慢開始、擁塞避免( 2 )快重傳、快恢復。

流量控制:流量控制是作用于接收者的,它是控制發送者的發送速度從而使接收者來得及接收,防止分組丟失的。

3 擁塞控制的算法

我們在開始假定:1、數據是單方向傳遞,另一個窗口只發送確認;2、接收方的緩存足夠大,因此發送方的大小的大小由網絡的擁塞程度來決定。

(一)慢開始算法:

發送方維持一個叫做擁塞窗口cwnd(congestion window)的狀態變量。擁塞窗口的大小取決于網絡的擁塞程度,并且動態地在變化。發送方讓自己的發送窗口等于擁塞窗口,另外考慮到接受方的接收能力,發送窗口可能小于擁塞窗口。

慢開始算法的思路就是,不要一開始就發送大量的數據,先探測一下網絡的擁塞程度,也就是說由小到大逐漸增加擁塞窗口的大小。

這里用報文段的個數作為擁塞窗口的大小舉例說明慢開始算法,實際的擁塞窗口大小是以字節為單位的。如下圖:

從上圖可以看到,一個傳輸輪次所經歷的時間其實就是往返時間RTT,而且沒經過一個傳輸輪次(transmission round),擁塞窗口cwnd就加倍。

為了防止cwnd增長過大引起網絡擁塞,還需設置一個慢開始門限ssthresh狀態變量。ssthresh的用法如下:當cwnd<ssthresh時,使用慢開始算法。當cwnd>ssthresh時,改用擁塞避免算法。當cwnd=ssthresh時,慢開始與擁塞避免算法任意

注意,這里的“慢”并不是指cwnd的增長速率慢,而是指在TCP開始發送報文段時先設置cwnd=1,然后逐漸增大,這當然比按照大的cwnd一下子把許多報文段突然注入到網絡中要“慢得多”。

(二)擁塞避免算法:

擁塞避免算法讓擁塞窗口緩慢增長,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口按線性規律緩慢增長。

無論是在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞(其根據就是沒有按時收到確認,雖然沒有收到確認可能是其他原因的分組丟失,但是因為無法判定,所以都當做擁塞來處理),就把慢開始門限ssthresh設置為出現擁塞時的發送窗口大小的一半(但不能小于2)。然后把擁塞窗口cwnd重新設置為1,執行慢開始算法。這樣做的目的就是要迅速減少主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。

整個擁塞控制的流程如下圖:

(1)擁塞窗口cwnd初始化為1個報文段,慢開始門限初始值為16 (2)執行慢開始算法,指數規律增長到第4輪,即cwnd=16=ssthresh,改為執行擁塞避免算法,擁塞窗口按線性規律增長 (3)假定cwnd=24時,網絡出現超時(擁塞),則更新后的ssthresh=12,cwnd重新設置為1,并執行慢開始算法。當cwnd=12=ssthresh時,改為執行擁塞避免算法

關于 乘法減小(Multiplicative Decrease)和加法增大(Additive Increase):

“乘法減小”指的是無論是在慢開始階段還是在擁塞避免階段,只要發送方判斷網絡出現擁塞,就把慢開始門限ssthresh設置為出現擁塞時的發送窗口大小的一半,并執行慢開始算法,所以當網絡頻繁出現擁塞時,ssthresh下降的很快,以大大減少注入到網絡中的分組數。“加法增大”是指執行擁塞避免算法后,使擁塞窗口緩慢增大,以防止過早出現擁塞。常合起來成為AIMD算法。

注意:“擁塞避免”并非完全能夠避免了阻塞,而是使網絡比較不容易出現擁塞。

(三)快重傳算法:

快重傳要求接收方在收到一個失序的報文段后就立即發出重復確認(為的是使發送方及早知道有報文段沒有到達對方,可提高網絡吞吐量約20%)而不要等到自己發送數據時捎帶確認。快重傳算法規定,發送方只要一連收到三個重復確認就應當立即重傳對方尚未收到的報文段,而不必繼續等待設置的重傳計時器時間到期。如下圖:

(四)快恢復算法:

快重傳配合使用的還有快恢復算法,有以下兩個要點:

當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半(為了預防網絡發生擁塞)。但是接下去并不執行慢開始算法 考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh減半后的值,然后執行擁塞避免算法,使cwnd緩慢增大。如下圖:TCP Reno版本是目前使用最廣泛的版本。

注意:在采用快恢復算法時,慢開始算法只是在TCP連接建立時和網絡出現超時時才使用

參考來源:https://zhuanlan.zhihu.com/p/37379780
我還沒有學會寫個人說明!

如何為開源軟件做出貢獻

上一篇

基于HBase構建千億級文本數據相似度計算與快速去重系統

下一篇

你也可能喜歡

TCP之 流量控制與擁塞控制

長按儲存圖像,分享給朋友

ITPUB 每周精要將以郵件的形式發放至您的郵箱


微信掃一掃

微信掃一掃
重庆快乐10分苹果版本 河南快赢481 个人怎样炒房赚钱 刷游戏单赚钱的软件有哪些 6场半全场 加盟酸奶赚钱吗 雪缘园欧洲杯赔率 什么游戏好搬砖赚钱吗 中国竞彩比分足球比分直播 雷速体育进球图片 写好字能赚钱吗 雀魂手游 官方网站 湖北快三 供销金融超市赚钱吗 兴动哈尔滨麻将漏技巧 上海时时彩 泰国进口水果赚钱吗