tcp 滑動(dòng)窗口(Sliding Window)

背景

將TCP與UDP這樣的簡(jiǎn)單傳輸協(xié)議區(qū)分開來(lái)的是它傳輸數(shù)據(jù)的質(zhì)量聘萨。TCP對(duì)于發(fā)送數(shù)據(jù)進(jìn)行跟蹤缚柏,這種數(shù)據(jù)管理需要協(xié)議有以下兩大關(guān)鍵功能:
可靠性:保證數(shù)據(jù)確實(shí)到達(dá)目的地个绍。如果未到達(dá)掀潮,能夠發(fā)現(xiàn)并重傳骄呼。
數(shù)據(jù)流控:管理數(shù)據(jù)的發(fā)送速率共苛,以使接收設(shè)備不致于過(guò)載。+

要完成這些任務(wù)蜓萄,整個(gè)協(xié)議操作是圍繞滑動(dòng)窗口確認(rèn)機(jī)制來(lái)進(jìn)行的隅茎。因此,理解了滑動(dòng)窗口嫉沽,也就是理解了TCP辟犀。

滑動(dòng)窗口

IP層協(xié)議屬于不可靠的協(xié)議,IP層并不關(guān)系數(shù)據(jù)是否發(fā)送到了對(duì)端绸硕,TCP通過(guò)確認(rèn)機(jī)制來(lái)保證數(shù)據(jù)傳輸?shù)目煽啃浴?/p>

假設(shè)A和B之間新建立了一條TCP連接堂竟。設(shè)備A需要傳送一長(zhǎng)串?dāng)?shù)據(jù)流,但設(shè)備B無(wú)法一次全部接收玻佩,所以它限制設(shè)備A每次發(fā)送分段指定數(shù)量的字節(jié)數(shù)出嘹,直到分段中已發(fā)送的字節(jié)數(shù)得到確認(rèn)。之后咬崔,設(shè)備A可以繼續(xù)發(fā)送更多字節(jié)税稼。每一個(gè)設(shè)備都對(duì)發(fā)送,接收及確認(rèn)數(shù)據(jù)進(jìn)行追蹤垮斯。
如果我們?cè)谌我粫r(shí)間點(diǎn)對(duì)于這一過(guò)程做一個(gè)“快照”娶聘,那么我們可以將TCP buffer中的數(shù)據(jù)分為以下四類,并把它們看作一個(gè)時(shí)間軸:

  1. 已發(fā)送已確認(rèn)數(shù)據(jù)流中最早的字節(jié)已經(jīng)發(fā)送并得到確認(rèn)甚脉。這些數(shù)據(jù)是站在發(fā)送設(shè)備的角度來(lái)看的丸升。如下圖所示,31個(gè)字節(jié)已經(jīng)發(fā)送并確認(rèn)牺氨。
  2. 已發(fā)送但尚未確認(rèn) 已發(fā)送但尚未得到確認(rèn)的字節(jié)狡耻。發(fā)送方在確認(rèn)之前,不認(rèn)為這些數(shù)據(jù)已經(jīng)被處理猴凹。下圖所示14字節(jié)為第2類夷狰。
  3. 未發(fā)送而接收方已Ready 設(shè)備尚未將數(shù)據(jù)發(fā)出 ,但接收方根據(jù)最近一次關(guān)于發(fā)送方一次要發(fā)送多少字節(jié)確認(rèn)自己有足夠空間郊霎。發(fā)送方會(huì)立即嘗試發(fā)送沼头。如圖,第3類有6字節(jié)。
  4. 未發(fā)送而接收方Not Ready 由于接收方not ready进倍,還不允許將這部分?jǐn)?shù)據(jù)發(fā)出土至。
    四種類型TCP buffer的數(shù)據(jù)

發(fā)送窗口與可用窗口
整個(gè)過(guò)程關(guān)鍵的操作在于接收方允許發(fā)送方一次能容納的未確認(rèn)的字節(jié)數(shù)。這稱為發(fā)送窗口猾昆,有時(shí)也稱為窗口陶因。該窗口決定了發(fā)送方允許傳送的字節(jié)數(shù),也是2類和3類的字節(jié)數(shù)之和垂蜗。因此楷扬,最后兩類(接收方準(zhǔn)備好而尚未發(fā)送,接收方未準(zhǔn)備好)的分界線在于添加了從第一個(gè)未確認(rèn)字節(jié)開始的窗口贴见。本例中烘苹,第一個(gè)未確認(rèn)字節(jié)是32,整個(gè)窗口大小是20片部。+

可用窗口的定義是:考慮到正在傳輸?shù)臄?shù)據(jù)量镣衡,發(fā)送方仍被允許發(fā)送的數(shù)據(jù)量。實(shí)際上等于第3類的大小吞琐。左邊界就是窗口中的第一個(gè)字節(jié)(字節(jié)32)捆探,右邊界是窗口中最后一個(gè)字節(jié)(字節(jié)51)。概念的詳細(xì)解釋看下圖站粟。

發(fā)送窗口與可用窗口示意圖

窗口滑動(dòng)過(guò)程

初始狀態(tài)
關(guān)于窗口的滑動(dòng)過(guò)程:初始狀態(tài)假設(shè)如下圖所示黍图,即當(dāng)上圖中第三類的6字節(jié)立即發(fā)送之后,這6字節(jié)從第3類轉(zhuǎn)移到第2類奴烙。字節(jié)變?yōu)槿缦拢?/p>

  1. 已發(fā)送已確認(rèn)字節(jié)1至31助被。
  2. 已發(fā)送但尚未確認(rèn)字節(jié)32至51。
  3. 未發(fā)送而接收方已Ready字節(jié)為0切诀。
  4. 未發(fā)送而接收方Not Ready字節(jié)52至95揩环。

初始狀態(tài)

傳輸過(guò)程
例如,假設(shè)已發(fā)送未確認(rèn)字節(jié)(32至45)分為4段傳輸:32-34幅虑,35-36丰滑,37-41,42-45倒庵。第1褒墨,2,4段已經(jīng)到達(dá)擎宝,而3段沒(méi)有收到郁妈。接收方只會(huì)發(fā)回32-36的確認(rèn)信息。接收方會(huì)保留42-45但不會(huì)確認(rèn)绍申,因?yàn)榇_認(rèn)42-45會(huì)表示接收方已經(jīng)收到了37-41(默認(rèn)采用累加的確認(rèn)方式)噩咪。這是很必要的顾彰,因?yàn)門CP的確認(rèn)機(jī)制是累計(jì)的,只使用一個(gè)數(shù)字來(lái)確認(rèn)數(shù)據(jù)胃碾。這一數(shù)字是自上一次成功接收后的最長(zhǎng)字節(jié)數(shù)涨享。假設(shè)目標(biāo)設(shè)備同樣將窗口設(shè)為20字節(jié)。
調(diào)整窗口
當(dāng)發(fā)送設(shè)備接收到確認(rèn)信息书在,則會(huì)將一部分第2類字節(jié)轉(zhuǎn)移到第1類灰伟,因?yàn)樗鼈円呀?jīng)得到了確認(rèn)拆又。由于5個(gè)字節(jié)已被確認(rèn)儒旬,窗口大小沒(méi)有改變,允許發(fā)送方多發(fā)5個(gè)字節(jié)帖族。結(jié)果栈源,窗口向右滑動(dòng)5個(gè)字節(jié)。同時(shí)5個(gè)字節(jié)從第二類移動(dòng)到第1類竖般,5個(gè)字節(jié)從第4類移動(dòng)至第3類甚垦,為接下來(lái)的傳輸創(chuàng)建了新的可用窗口。因此涣雕,在接收到確認(rèn)信息以后艰亮,看起來(lái)如下圖所示。字節(jié)變?yōu)槿缦拢?p>

  1. 已發(fā)送已確認(rèn)字節(jié)1至36挣郭。
  2. 已發(fā)送但尚未確認(rèn)字節(jié)37至51迄埃。
  3. 未發(fā)送而接收方已Ready字節(jié)為52至56。
  4. 未發(fā)送而接收方Not Ready字節(jié)57至95兑障。
滑動(dòng)后的窗口

處理丟失確認(rèn)信息
但是丟失的42-45如何處理呢侄非?在接收到第3段(37-41)之前,接收設(shè)備不會(huì)發(fā)送確認(rèn)信息流译,也不會(huì)發(fā)送這一段之后字節(jié)的確認(rèn)信息逞怨。發(fā)送設(shè)備可以將新的字節(jié)添加到第3類之后,即52-56福澡。但是發(fā)送設(shè)備之后會(huì)停止發(fā)送叠赦,窗口停留在37-41。
TCP包括一個(gè)傳輸及重傳的計(jì)時(shí)機(jī)制革砸。對(duì)于丟失的seg3除秀,如果超過(guò)一定時(shí)間,TCP就會(huì)重新傳送(重傳機(jī)制)业岁,重傳成功會(huì)seg3 seg4一塊被確認(rèn)鳞仙,不成功,seg4也將被丟棄笔时。TCP重傳丟失的片段棍好,但有一個(gè)缺陷是:因?yàn)樗粫?huì)對(duì)每一個(gè)片段分別進(jìn)行確認(rèn),這可能會(huì)導(dǎo)致其他實(shí)際上已經(jīng)接收到的片段被重傳(比如42至45)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末借笙,一起剝皮案震驚了整個(gè)濱河市扒怖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌业稼,老刑警劉巖张肾,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苛萎,居然都是意外死亡缎浇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門熔号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稽鞭,“玉大人,你說(shuō)我怎么就攤上這事引镊‰蹋” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵弟头,是天一觀的道長(zhǎng)吩抓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赴恨,這世上最難降的妖魔是什么疹娶? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮嘱支,結(jié)果婚禮上蚓胸,老公的妹妹穿的比我還像新娘。我一直安慰自己除师,他們只是感情好沛膳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汛聚,像睡著了一般锹安。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倚舀,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天叹哭,我揣著相機(jī)與錄音,去河邊找鬼痕貌。 笑死风罩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舵稠。 我是一名探鬼主播超升,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼入宦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了室琢?” 一聲冷哼從身側(cè)響起乾闰,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盈滴,沒(méi)想到半個(gè)月后涯肩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巢钓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年病苗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竿报。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铅乡,死狀恐怖继谚,靈堂內(nèi)的尸體忽然破棺而出烈菌,到底是詐尸還是另有隱情,我是刑警寧澤花履,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布芽世,位于F島的核電站,受9級(jí)特大地震影響诡壁,放射性物質(zhì)發(fā)生泄漏济瓢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一妹卿、第九天 我趴在偏房一處隱蔽的房頂上張望旺矾。 院中可真熱鬧,春花似錦夺克、人聲如沸箕宙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柬帕。三九已至,卻和暖如春狡门,著一層夾襖步出監(jiān)牢的瞬間陷寝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工其馏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凤跑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓叛复,卻偏偏與公主長(zhǎng)得像仔引,于是被迫代替她去往敵國(guó)和親鹏控。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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