??再介紹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?,F(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?,F(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ò)擁塞而沒(méi)有收到確認(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次或更多次那么丟失的概率就更大,但是也沒(méi)有必要。
下面總結(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)文段沒(méi)在這個(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(jué)得3號(hào)報(bào)文段可能馬上就來(lái)了,如果在0.5s內(nèi)3號(hào)報(bào)文沒(méi)有到,就不等了,直接返回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é)
