TCP可靠傳輸

??再介紹TCP可靠傳輸之前,先對(duì)之前的兩種可靠傳輸協(xié)議(GBN協(xié)議恨胚、SR協(xié)議)未介紹完的內(nèi)容介紹完。

1 GBN協(xié)議中滑動(dòng)窗口長(zhǎng)度

??窗口的長(zhǎng)度越長(zhǎng),發(fā)送方可以不需等待確認(rèn)就發(fā)送的分組就越多秧了,信道利用率也就高,但是窗口的長(zhǎng)度不能是無(wú)限的序无。若采用n位比特表示序號(hào)验毡,那么發(fā)送窗口的尺寸大小W應(yīng)滿足:1 ≤ W ≤ 2n - 1。因?yàn)榘l(fā)送窗口過(guò)大帝嗡,就會(huì)使得接收方無(wú)法區(qū)分新的分組和舊的分組晶通。

??假設(shè)采用2位來(lái)表示序號(hào),則序號(hào)的范圍就是[0 , 3]哟玷,根據(jù)上面的公式狮辽,發(fā)送窗口的最大尺寸是22 - 1 = 3。現(xiàn)在如果取發(fā)送窗口的大小為4,如下圖所示喉脖。

發(fā)送方發(fā)送分組0~3椰苟,接收方在接收到4個(gè)分組后,返回ACK 3(表示收到這4個(gè)分組了)树叽,但是確認(rèn)分組在傳送的過(guò)程中丟失了尊剔,發(fā)送方在等待一段時(shí)間后,計(jì)時(shí)器超時(shí)菱皆,重新發(fā)送分組0~3须误,這時(shí)接收方就不清楚這四組數(shù)據(jù)是新的數(shù)據(jù)還是舊的數(shù)據(jù)。

2 SR協(xié)議中發(fā)送窗口和接收窗口

??在SR協(xié)議中仇轻,同樣存在窗口大小的問(wèn)題京痢,在SR協(xié)議中發(fā)送窗口最好和接收窗口大小相等。如果發(fā)送窗口過(guò)大篷店,會(huì)導(dǎo)致接收窗口溢出祭椰,過(guò)小同樣也不好。

??對(duì)于采用n位比特表示序號(hào)疲陕,那么發(fā)送窗口和接收窗口的尺寸大小WTmax方淤、WRmax 應(yīng)滿足:WTmax = WRmax = 2(n-1)甲雅。

??假設(shè)采用2位來(lái)表示序號(hào)嘱丢,則序號(hào)的范圍就是[0 , 3],根據(jù)上面的公式雕蔽,發(fā)送窗口和接收窗口的最大尺寸是22-1 = 2∽缪遥現(xiàn)在如果取發(fā)送窗口的大小為3讳苦。

??如下圖所示,發(fā)送方發(fā)送分組0~3吩谦,接收方接收了3個(gè)分組并返回了分組的確認(rèn)鸳谜,但是三個(gè)確認(rèn)分組在傳送過(guò)程中都是丟失了,接收方在計(jì)時(shí)器超時(shí)后會(huì)重發(fā)三個(gè)分組式廷,現(xiàn)在僅考慮分組0咐扭。


??如下圖所示,發(fā)送方發(fā)送分組0~3滑废,接收方接收了3個(gè)分組并返回了分組的確認(rèn)蝗肪,發(fā)送方接收到了確認(rèn)后將窗口向前滑動(dòng),此時(shí)發(fā)送方亂序發(fā)送分組0策严。

??從上帝視角來(lái)看穗慕,雖然接收方接收的都是分組0,但是第一種情況分組0是舊的數(shù)據(jù)妻导,而第二種情況是新的數(shù)據(jù)逛绵。即如果窗口的大小設(shè)置為3時(shí)怀各,如果接收某個(gè)時(shí)刻接收到分組0,接收方并不能分清接收的是超時(shí)重傳的分組還是一個(gè)新的分組术浪,從而產(chǎn)生歧義瓢对。所以窗口大小并不是無(wú)限制的

3 TCP可靠傳輸

??前面提過(guò)胰苏,網(wǎng)絡(luò)層是不可靠的硕蛹。IP不保證數(shù)據(jù)報(bào)的交付,不保證數(shù)據(jù)報(bào)的按序交付硕并,也不保證數(shù)據(jù)報(bào)中數(shù)據(jù)的完整性法焰。

??TCP在IP不可靠的盡力服務(wù)之上創(chuàng)建了一種可靠數(shù)據(jù)傳輸服務(wù)。TCP可靠傳輸服務(wù)確保一個(gè)進(jìn)程從其接受緩存中讀出的數(shù)據(jù)流時(shí)無(wú)損壞倔毙、無(wú)間隔埃仪、非冗余和按序的數(shù)據(jù)流。即該字節(jié)流和發(fā)送方發(fā)出的字節(jié)流是完全一樣的陕赃。

??(1) TCP使用流水線機(jī)制卵蛉,使得發(fā)送方在任意時(shí)刻都可以有多個(gè)發(fā)出但還未確認(rèn)的報(bào)文段存在。

??(2) TCP使用累積確認(rèn)機(jī)制么库。

??(3) TCP使用單一重傳定時(shí)器傻丝。TCP只重傳具有最小序號(hào)的還未被確認(rèn)的報(bào)文段(即超時(shí)重傳只重傳一個(gè)報(bào)文段)。只是每次TCP重傳時(shí)都會(huì)將下一次的超時(shí)間隔設(shè)置為原來(lái)的兩倍诉儒。

例如葡缰,假設(shè)當(dāng)定時(shí)器第一次過(guò)期時(shí),與最早的未被確認(rèn)的報(bào)文段相關(guān)聯(lián)的過(guò)期時(shí)間是0.75秒允睹。TCP就會(huì)重傳該報(bào)文段运准,并把新的過(guò)期時(shí)間設(shè)置為1.5s。如果1.5秒后定時(shí)器又過(guò)期了缭受,則TCP重傳該報(bào)文段,并把過(guò)期時(shí)間設(shè)置為3.0秒该互。因此米者,超時(shí)間隔在每次重傳后呈指數(shù)型增長(zhǎng)。

定時(shí)器過(guò)期很有可能是由網(wǎng)絡(luò)擁塞引起的宇智,即太多的分組在傳輸路徑的一臺(tái)(或多臺(tái))路由器的隊(duì)列中蔓搞,造成分組丟失或長(zhǎng)時(shí)間的排隊(duì)時(shí)延。在這種情況下報(bào)文段的時(shí)延就會(huì)增大很多随橘,原來(lái)本可以在重傳時(shí)間內(nèi)就可以收到確認(rèn)報(bào)文的報(bào)文段喂分,由于網(wǎng)絡(luò)擁塞而沒有收到確認(rèn),所以就會(huì)重傳報(bào)文段机蔗。網(wǎng)絡(luò)本來(lái)就擁塞了蒲祈,如果此時(shí)發(fā)送端持續(xù)的重傳甘萧,就會(huì)導(dǎo)致?lián)砣母鼑?yán)重。所以TCP發(fā)送方重傳都是經(jīng)過(guò)越來(lái)越長(zhǎng)的時(shí)間間隔后進(jìn)行的梆掸。

??(4) TCP使用冗余確認(rèn)技術(shù)(快速重傳)

超時(shí)觸發(fā)重傳存在一個(gè)問(wèn)題:超時(shí)周期可能較長(zhǎng)扬卷。當(dāng)一個(gè)報(bào)文段丟失時(shí),需要等超時(shí)時(shí)間間隔后才能重發(fā)報(bào)文段酸钦,因而就增加了端到端的時(shí)延怪得。所以,TCP通常在超時(shí)事件發(fā)生前通過(guò)冗余ACK來(lái)檢測(cè)丟包的情況卑硫,這樣就可以讓發(fā)送方盡早知道發(fā)生了個(gè)別報(bào)文段的丟失徒恋。

??冗余ACK(duplicate ACK)就是再次確認(rèn)某個(gè)報(bào)文段的ACK,而發(fā)送方先前已經(jīng)收到對(duì)該報(bào)文段的確認(rèn)欢伏。如果發(fā)送方連續(xù)收到3個(gè)冗余的ACK入挣,說(shuō)明跟在這個(gè)已經(jīng)被確認(rèn)過(guò)3次的報(bào)文段之后的那個(gè)報(bào)文段已經(jīng)丟失了,TCP會(huì)立即執(zhí)行快速重傳颜懊。即在該報(bào)文段的定時(shí)器過(guò)期事前重傳丟失報(bào)文段财岔。

??如下圖所示,當(dāng)分組2丟失后河爹,后面的分組到達(dá)接收方時(shí)匠璧,接收方會(huì)連續(xù)發(fā)送確認(rèn)分組1報(bào)文段,當(dāng)發(fā)送方接收到3個(gè)冗余ACK(即ACK 1)咸这,就知道了分組1之后的分組即分組2丟失了夷恍,所以會(huì)立即重傳分組2。
??

??這里為什么是3個(gè)冗余的ACK媳维,而不可以是1個(gè)或2個(gè)冗余的ACK酿雪?

(1) 如果是一個(gè)冗余的ACK根本就不知道這個(gè)冗余的ACK是由于網(wǎng)絡(luò)路由選擇報(bào)文段丟失還是報(bào)文段的亂序到達(dá)哪個(gè)引起的侄刽。
(2) 假定接收方已經(jīng)接收了N-1號(hào)報(bào)文段指黎,發(fā)送方也已經(jīng)收到ACK N-1。則考慮下面接收端報(bào)文段到達(dá)幾種情況:
??1) N - 1 ?? N ?? N + 1 ?? N + 2——> 接收到1個(gè)ACK N州丹。
??2) N - 1 ?? N ?? N + 2 ?? N + 1——> 接收到1個(gè)ACK N醋安。
??3) N - 1 ?? N + 1 ?? N ?? N + 2——> 接收到2個(gè)ACK N。
??4) N - 1 ?? N + 1 ?? N + 2 ?? N——> 接收到3個(gè)ACK N墓毒。
??5) N - 1 ?? N + 2 ?? N ?? N + 1——> 接收到2個(gè)ACK N吓揪。
??6) N - 1 ?? N + 2 ?? N + 1 ?? N——> 接收到3個(gè)ACK N
上述除了第一種情況所计,其余都存在亂序到達(dá)柠辞,在5種亂序到達(dá)的情況下,其中只有3次收到2次ACK N主胧,即有60%的概率收到2次ACK是由于亂序造成的叭首,而如果收到兩次冗余ACK就認(rèn)為報(bào)文段丟失顯然有點(diǎn)不合適习勤。
??另一方面,如果N號(hào)報(bào)文段丟失了放棒,那么會(huì)100%收到3次ACK N姻报。所以綜合上面來(lái)看,收到3次冗余ACK就非常有可能認(rèn)為一個(gè)報(bào)文段丟失了间螟,當(dāng)然4次吴旋、5次或更多次那么丟失的概率就更大,但是也沒有必要厢破。

下面總結(jié)一下TCP接收方生成ACK的策略:
??(1) 具有所期望序號(hào)的按序報(bào)文段到達(dá)荣瑟。所在期望序號(hào)以前的數(shù)據(jù)都已經(jīng)被確認(rèn)——延遲的ACK。對(duì)另一個(gè)按序報(bào)文段到達(dá)最多等待0.5s摩泪,如果下一個(gè)按序到達(dá)的報(bào)文段沒在這個(gè)規(guī)定的時(shí)間內(nèi)到達(dá)笆焰,則發(fā)送一個(gè)ACK。

這句話的意思是:假設(shè)接收方下一個(gè)期望的序號(hào)是2號(hào)见坑,2號(hào)之前的報(bào)文段都已經(jīng)確認(rèn)過(guò)了嚷掠,如果這時(shí)2號(hào)報(bào)文段到達(dá)接收方,接收方不會(huì)立即返回對(duì)2號(hào)報(bào)文的確認(rèn)荞驴,而是會(huì)等0.5s不皆,因?yàn)樗X得3號(hào)報(bào)文段可能馬上就來(lái)了,如果在0.5s內(nèi)3號(hào)報(bào)文沒有到熊楼,就不等了霹娄,直接返回ACK 3對(duì)3號(hào)報(bào)文段進(jìn)行確認(rèn)。

??(2) 具有所期望序號(hào)的按序報(bào)文段到達(dá)鲫骗,另一個(gè)按序報(bào)文段等待ACK傳輸——立即發(fā)送單個(gè)累積ACK犬耻,以確認(rèn)兩個(gè)按序的報(bào)文段。

還是上面的例子执泰,如果在0.5s內(nèi)枕磁,3號(hào)報(bào)文段到了,那么就直接發(fā)送一個(gè)累積的ACK术吝,即ACK 4來(lái)確認(rèn)2號(hào)和3號(hào)報(bào)文段透典。

??(3) 比期望序號(hào)大的亂序報(bào)文段到達(dá),檢測(cè)出間隔——立即發(fā)送冗余ACK顿苇,指示下一個(gè)期待字節(jié)的序號(hào)(間隔的低端的序號(hào))。

如下圖税弃,如果期望收到2號(hào)報(bào)文段纪岁,但是卻收到了4號(hào)報(bào)文段(其間隔為2號(hào)~3號(hào),間隔的低端是2號(hào)则果,即期望收到的序號(hào))幔翰,立即發(fā)送冗余ACK漩氨,即ACK 1。
注:ACK N表示的是對(duì)N號(hào)報(bào)文段的確認(rèn)遗增,例如 ACK 1只是表示對(duì)1號(hào)報(bào)文段的確認(rèn)叫惊,其ACK報(bào)文段的首部中的確認(rèn)號(hào)是2。只不過(guò)ACK N這樣比較好表示而已做修。

??(4) 能部分或完全填充接收數(shù)據(jù)間隔的報(bào)文段到達(dá)——倘若該報(bào)文段位于間隔的低端霍狰,則立即發(fā)送ACK

在(3)的情況下饰及,如果接收到了2號(hào)報(bào)文段蔗坯,正好是期望的序號(hào),則立即發(fā)送ACK 2對(duì)2號(hào)報(bào)文段確認(rèn)燎含。如果不是期望的序號(hào)宾濒,則和(3) 一樣發(fā)送冗余ACK。

??TCP的可靠傳輸它既不是純粹的GBN協(xié)議也不是純粹的SR協(xié)議屏箍,同時(shí)它還引入了快速重傳等這類新的機(jī)制绘梦,它是可以看作是GBN和SR協(xié)議的混合體。

??TCP可靠傳輸?shù)木唧w內(nèi)容都在GNB協(xié)議和SR協(xié)議中介紹過(guò)了赴魁,只需要知道TCP使用了它們中的哪些機(jī)制以及引入了哪些新的機(jī)制卸奉。

4 小結(jié)

??本文完

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尚粘,隨后出現(xiàn)的幾起案子择卦,更是在濱河造成了極大的恐慌,老刑警劉巖郎嫁,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉继,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泽铛,警方通過(guò)查閱死者的電腦和手機(jī)尚辑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盔腔,“玉大人杠茬,你說(shuō)我怎么就攤上這事〕谒妫” “怎么了瓢喉?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舀透。 經(jīng)常有香客問(wèn)我栓票,道長(zhǎng),這世上最難降的妖魔是什么愕够? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任走贪,我火速辦了婚禮佛猛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坠狡。我一直安慰自己继找,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布逃沿。 她就那樣靜靜地躺著婴渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪感挥。 梳的紋絲不亂的頭發(fā)上缩搅,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音触幼,去河邊找鬼硼瓣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛置谦,可吹牛的內(nèi)容都是我干的堂鲤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼媒峡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘟栖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起谅阿,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤半哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后签餐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寓涨,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年氯檐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戒良。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冠摄,死狀恐怖糯崎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情河泳,我是刑警寧澤沃呢,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拆挥,受9級(jí)特大地震影響樟插,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一黄锤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧食拜,春花似錦鸵熟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至呻待,卻和暖如春打月,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚕捉。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工奏篙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迫淹。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓秘通,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親敛熬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肺稀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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