TCP 協(xié)議 の 流量控制

簡介

流量控制是一個 ** 速度匹配服務(wù) ** (匹配發(fā)送方的發(fā)送速率與接收方的讀取速率),因?yàn)榘l(fā)送方發(fā)送數(shù)據(jù)的速率和接收方處理數(shù)據(jù)的速率不一定匹配,當(dāng)發(fā)送方發(fā)送速率大于接收方的處理速率時,就有可能因接收方來不及接收數(shù)據(jù)而導(dǎo)致數(shù)據(jù)丟失。所以 ** 流量控制就是一種用于控制發(fā)送方的數(shù)據(jù)發(fā)送速率以使得接收方能夠來得及接收數(shù)據(jù)的機(jī)制 ** 。

在通信過程中,接收方根據(jù)自己接收緩存的大小,動態(tài)地調(diào)整發(fā)送方的發(fā)送窗口大小,這就是 ** 接收窗口 rwnd **,即調(diào)整 TCP 報文段首部中的“窗口”字段值,來限制發(fā)送方向網(wǎng)絡(luò)注入報文的速率。同時,發(fā)送方會根據(jù)其對當(dāng)前網(wǎng)絡(luò)擁塞程度的估計而確定一個窗口值,稱為 ** 擁塞窗口 cwnd ** ,其大小與網(wǎng)絡(luò)的帶寬和時延密切相關(guān)。最后實(shí)際在網(wǎng)絡(luò)中傳輸?shù)膱笪臄?shù)應(yīng)該rwnd 和 cwnd 中的較小者。

控制算法 -- 滑動窗口協(xié)議

TCP 報文頭部有一個窗口字段,這個字段用于控制發(fā)送方能夠發(fā)送的數(shù)據(jù)量。每發(fā)送一個TCP 報文段,發(fā)送方就能夠通過這個字段就能夠告訴對方當(dāng)前我的接收窗口(rwnd)的大小(也就是我能夠接收的最大字節(jié)數(shù)),然后接收方就應(yīng)該調(diào)整自己的數(shù)據(jù)發(fā)送量不大于該值。
rwnd > 0:表示數(shù)據(jù)接收方所能夠接收的 ** 字節(jié)數(shù) ** ;
rwnd = 0:表示數(shù)據(jù)接收方的緩存區(qū)已滿,不想接收數(shù)據(jù)了,此時發(fā)送方不應(yīng)向網(wǎng)絡(luò)中發(fā)送任何數(shù)據(jù),直至接收方重新發(fā)送一個 rwnd > 0 的 TCP 報文告訴發(fā)送方可以接收數(shù)據(jù)為止。
** 互相等待的死鎖局面 ** :當(dāng)接收方設(shè)置了一個 rwnd = 0 的窗口后,發(fā)送方會停止發(fā)送數(shù)據(jù),等待接收方重新控制接收窗口的大小。然后接收方可以繼續(xù)接收數(shù)據(jù)時,向發(fā)送方發(fā)送一個重新控制窗口的報文段,然后等待發(fā)送方繼續(xù)發(fā)送數(shù)據(jù)。然而可能很不幸地丟失了這個重設(shè)窗口的報文,那么收發(fā)雙方都將處于等待對方傳送數(shù)據(jù)的狀態(tài),由此也就進(jìn)入了收發(fā)雙方相互等待的死鎖局面。
** 解決策略 ** :為了解決收發(fā)雙方均可能出現(xiàn)相互等待的死鎖局面的問題,TCP 為每一個連接均設(shè)有一個 ** 持續(xù)計時器 ** (persistence timer)。只要 TCP 連接的一方收到對方的零窗口通知,就啟動持續(xù)計時器。若持續(xù)計時器設(shè)置的時間到期,就發(fā)送一個 ** 零窗口探測報文段 ** (攜 1 字節(jié)的數(shù)據(jù)),而對方就在確認(rèn)這個探測報文段時給出當(dāng)前的窗口值。若窗口仍然為 0,則收到該報文段的一方就重設(shè)持續(xù)計時器。若窗口不為0,則發(fā)送方就可以根據(jù)該窗口值繼續(xù)發(fā)送報文。

TCP 報文發(fā)送時機(jī)

應(yīng)用程序?qū)?shù)據(jù)發(fā)送到 TCP 的發(fā)送緩沖區(qū)后,剩下的發(fā)送過程就交給 TCP 來控制了,所以為了盡可能提高傳輸速率,就需要采用不同的發(fā)送機(jī)制來控制 TCP 報文的發(fā)送時機(jī)。

  1. TCP 維持一個變量,該變量等于最大報文段長度 MSS。只要緩存中存放的數(shù)據(jù)達(dá)到MSS 字節(jié),就組裝成一個 TCP 報文段發(fā)送出去。
  2. 由發(fā)送方的應(yīng)用進(jìn)程指明要求發(fā)送的報文段長度,即 TCP 支持的推送( push )操作。
  3. 發(fā)送方設(shè)置一個計時器,當(dāng)發(fā)送方的一個計時器期限到期時,就將已有的緩存數(shù)據(jù)裝入報文段(但長度不能超過 MSS )發(fā)送出去。

*** Nagle 算法 ***
若發(fā)送應(yīng)用進(jìn)程把要發(fā)送的數(shù)據(jù)逐個字節(jié)地送到 TCP 的發(fā)送緩存,則發(fā)送方就把第一個數(shù)據(jù)字節(jié)先發(fā)送出去,把后面到達(dá)的數(shù)據(jù)字節(jié)都緩存起來。當(dāng)發(fā)送方接收對第一個數(shù)據(jù)字符的確認(rèn)后,再把發(fā)送緩存中的所有數(shù)據(jù)組裝成一個報文段再發(fā)送出去,同時繼續(xù)對隨后到達(dá)的數(shù)據(jù)進(jìn)行緩存。只有在收到對前一個報文段的確認(rèn)后才繼續(xù)發(fā)送下一個報文段。當(dāng)數(shù)據(jù)到達(dá)較快而網(wǎng)絡(luò)速率較慢時,用這樣的方法可明顯地減少所用的網(wǎng)絡(luò)帶寬。Nagle 算法還規(guī)定:當(dāng)?shù)竭_(dá)的數(shù)據(jù)已達(dá)到發(fā)送窗口大小的一半或已達(dá)到報文段的最大長度時,就立即發(fā)送一個報文段。

*** 糊涂窗口綜合證 ***
TCP 接收方的緩存已滿,而交互式的應(yīng)用進(jìn)程一次只從接收緩存中讀取 1 字節(jié)(這樣就使接收緩存空間僅騰出 1 字節(jié)),然后向發(fā)送方發(fā)送確認(rèn),并把窗口設(shè)置為 1 個字節(jié)(但發(fā)送的數(shù)據(jù)報為 40 字節(jié)的的話)。接著,發(fā)送方又發(fā)來 1 個字節(jié)的數(shù)據(jù)(發(fā)送方的 IP 數(shù)據(jù)報是 41 字節(jié),40 字節(jié)頭部)。接收方發(fā)回確認(rèn),仍然將窗口設(shè)置為 1 個字節(jié)。這樣,網(wǎng)絡(luò)的效率很低。要解決這個問題,可讓接收方等待一段時間,等到接收緩存有足夠空間容納一個最長的報文段,或等到接收方緩存已有一半空閑的空間時,接收方才發(fā)回確認(rèn)報文,并向發(fā)送方通知當(dāng)前的窗口大小。此外,發(fā)送方也不要發(fā)送太小的報文段,而是把數(shù)據(jù)報積累成足夠大的報文段,或達(dá)到接收方緩存的空間的一半大小再發(fā)送。

上述兩種算法可以配合使用,使得在發(fā)送方不發(fā)送很小的報文段的同時,接收方也不至于在接收緩存還不夠大時就急忙通知發(fā)送方發(fā)送數(shù)據(jù),從而盡可能提高網(wǎng)絡(luò)帶寬利用率和數(shù)據(jù)吞吐量。

滑動窗口協(xié)議與停止等待協(xié)議的區(qū)別

*** 停止等待協(xié)議 ***
發(fā)送方每發(fā)送完一個報文段后就停止發(fā)送,等待接收方的確認(rèn)報文,在收到確認(rèn)報文段后再繼續(xù)發(fā)送數(shù)據(jù)。

*** 連續(xù)ARQ協(xié)議 ***
發(fā)送方維持一個發(fā)送窗口,位于發(fā)送窗口中的數(shù)據(jù)都可以連續(xù)發(fā)送出去,而無需等待對方的確認(rèn),以此提高信道利用率。每收到一個確認(rèn)報文,發(fā)送方就將滑動窗口向前滑動一個分組長度。接收方則一般采用 ** 累計確認(rèn) ** 的方式,即接收方不必對收到的報文段逐個確認(rèn),而是在收到幾個分組后,只對按序到達(dá)的最后一個分組發(fā)送確認(rèn)報文,表明到該分組為止的所有報文均已正確收到。 ** 優(yōu)點(diǎn) ** :實(shí)現(xiàn)簡單,即便確認(rèn)報文丟失也不必重傳; ** 缺點(diǎn) ** :接收方無法向發(fā)送方全面反映自己已經(jīng)接收到的正確報文情況。

滑動窗口協(xié)議與停止等待協(xié)議的區(qū)別:

  1. 滑動窗口協(xié)議中,允許發(fā)送方發(fā)送多個分組(當(dāng)有多個分組可用時), 而不需等待確認(rèn),但它受限于在流水線中未確認(rèn)的分組數(shù)不能超過某個最大允許數(shù) N。
  2. 滑動窗口協(xié)議是 TCP 使用的一種控制流量的方法,此協(xié)議能夠加速數(shù)據(jù)的傳輸。 只有在接收窗口向前滑動時(與此同時也發(fā)送了確認(rèn)), 發(fā)送窗口才有可能向前滑動。收發(fā)兩端的窗口按照以上規(guī)律不斷地向前滑動,因此這種協(xié)議稱為滑動窗口協(xié)議。
  3. 當(dāng)發(fā)送窗口和接收窗口的大小都等于 1 時,就是停止等待協(xié)議。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容