前言
??TCP發(fā)送的報文段是交給IP層傳送的,但I(xiàn)P層只能提供盡最大努力服務(wù)评肆。也就是說损合,TCP下面的網(wǎng)絡(luò)所提供的是不可靠的傳輸。因此亲茅,TCP必須采用適當(dāng)?shù)拇胧┎拍苁沟脙蓚€傳輸層之間的通信變得可靠回铛。
??理想的傳輸條件有以下特點:
(1) 傳輸信道不產(chǎn)生差錯。
(2) 不管發(fā)送方以多快的速度發(fā)送數(shù)據(jù)克锣,接收方總是來得及處理收到的數(shù)據(jù)茵肃。
??在這樣的情況下,不采取任何措施就能實現(xiàn)可靠傳輸娶耍。
??然而實際的網(wǎng)絡(luò)都不具備上述的兩個條件免姿。但是我們可以使用一些可靠傳輸協(xié)議,當(dāng)出現(xiàn)差錯時讓發(fā)送方重傳出現(xiàn)差錯的數(shù)據(jù)榕酒,同時在接收方來不及處理收到的數(shù)據(jù)時胚膊,及時告知發(fā)送方降低數(shù)據(jù)發(fā)送的速度——流量控制故俐。這樣本來不可靠的信道就能實現(xiàn)可靠的傳輸。
??注:在計算機(jī)網(wǎng)絡(luò)發(fā)展初期紊婉,通信鏈路不太可靠药版,因此在鏈路層傳輸數(shù)據(jù)時都要采用的可靠的傳輸協(xié)議(如停止等待協(xié)議),同樣出傳輸層同樣也需要某種機(jī)制來保證傳輸層的可靠傳輸喻犁。如今通信鏈路質(zhì)量變得可靠槽片,通信出現(xiàn)差錯的可能性就變小,所以現(xiàn)在也就不要求數(shù)據(jù)鏈路層要實現(xiàn)可靠傳輸肢础,即數(shù)據(jù)鏈路層就拋棄了可靠傳輸?shù)呢?zé)任还栓,交給傳輸層實現(xiàn)。而鏈路層則主要負(fù)責(zé)差錯控制传轰,這樣就會讓數(shù)據(jù)在鏈路層上傳輸速度更快剩盒,延遲更小。
1 可靠傳輸
??可靠傳輸:即發(fā)送端發(fā)送的是什么慨蛙,接收端接收到的就是什么辽聊。也就是在數(shù)據(jù)傳輸?shù)倪^程中沒有傳輸差錯。
??數(shù)據(jù)傳輸過程中可能出現(xiàn)的問題:比特出差錯期贫、丟包跟匆。
丟包:物理線路故障、設(shè)備故障通砍、病毒攻擊玛臂、路由信息錯誤等原因,導(dǎo)致的數(shù)據(jù)包的丟失情況埠帕。
??可靠傳輸?shù)姆椒ǎ?strong>停止-等待協(xié)議垢揩、滑動窗口協(xié)議。
2 停止-等待協(xié)議
?? 2.1 前提
??(1) 全雙工通信的雙方既是發(fā)送方也是接收方敛瓷,但是為了討論問題方便,僅考慮一方發(fā)送數(shù)據(jù)(發(fā)送方)斑匪,一方接收數(shù)據(jù)(接收方)呐籽。
??(2) 數(shù)據(jù)傳輸?shù)倪^程中既可能出現(xiàn)差錯,又有可能出現(xiàn)丟包的現(xiàn)象蚀瘸。
??(3) 所有傳輸?shù)臄?shù)據(jù)單元稱為分組狡蝶。
?? 2.2 無差錯情況
??發(fā)送方每發(fā)送一分組就停止等待,只有等到了接收方發(fā)送來的確認(rèn)后才可以發(fā)送下一個分組贮勃。
?? 2.2 有差錯情況
??(1) 分組丟失或檢測到分組出錯
??發(fā)送方在傳輸過程中分組丟失贪惹,這時接收方?jīng)]有接收到分組不會知道發(fā)送方發(fā)送了分組,就不會給發(fā)送方返回確認(rèn)信息(分組出錯寂嘉,接收方會直接丟棄分組也不會返回確認(rèn)信息)奏瞬,而發(fā)送方在等待接收方的確認(rèn)信息以此來發(fā)送下一個分組枫绅。所以可靠傳輸協(xié)議這樣規(guī)定:當(dāng)發(fā)送方超過一段時間沒有仍然沒有收到的確認(rèn),就認(rèn)為剛才的分組丟失了硼端,因而重傳前面的發(fā)送過的分組并淋。這就是超時重傳。
??超時重傳要求在每次發(fā)送完一個分組時設(shè)置一個超時計時器珍昨,如果在超時計時器到期之前收到了對方的確認(rèn)县耽,就撤銷已設(shè)置的超時計時器。
??(1) 超時重傳要求發(fā)送完一個分組后镣典,必須暫時保留已發(fā)送的分組的副本(在超時重傳時使用)兔毙,只有收到了相應(yīng)的確認(rèn)后才能清除暫時保留的副本。
??(2) 超時計時器設(shè)置的重傳時間應(yīng)當(dāng)比數(shù)據(jù)在分組中傳輸?shù)钠骄鵕TT更長一些兄春。
??(3) 分組和確認(rèn)分組必須進(jìn)行編號瞒御。如果接收方發(fā)送確認(rèn)分組丟失(或分組出錯),發(fā)送方在規(guī)定時間內(nèi)沒有收到確認(rèn)就會超時重傳神郊,如果沒有編號肴裙,那么接收方就不知道這個分組是新的還是已經(jīng)接收過的,這可能就導(dǎo)致了分組重復(fù)涌乳,所以對分組編號可以很好的解決分組丟失或分組出錯等問題蜻懦。
??(2) 確認(rèn)分組(ACK)丟失
??接收端接收了發(fā)送方傳輸?shù)姆纸M后,向發(fā)送方發(fā)送ACK夕晓,但是ACK在傳輸過程中丟失了宛乃,那么發(fā)送方就收不到確認(rèn)信息,這時發(fā)送端超時計時器到期后就要重傳分組蒸辆,接收方仍會重復(fù)接收分組征炼,并且丟棄重復(fù)的分組,并重傳ACK躬贡。
??(3) ACK分組遲到
??下圖的傳輸過程沒有出現(xiàn)差錯谆奥,接收方接收分組后向發(fā)送方發(fā)送ACK,但是確認(rèn)信息遲到了拂玻,在超時計時器到期后發(fā)送方會重新發(fā)送分組酸些,接收方仍然會重復(fù)接收分組,并且丟棄重復(fù)的分組檐蚜,并重傳ACK魄懂。當(dāng)發(fā)送方收到ACK后會發(fā)送下一個分組,在后來發(fā)送方收到遲到的ACK時闯第,發(fā)送方會收下并直接丟失市栗。
??優(yōu)缺點:停止等待協(xié)議優(yōu)點是簡單,但缺點是信道利用率太低。
?? 2.3 信道利用率
??假定A發(fā)送分組需要的時間是TD填帽。顯然蛛淋,TD等于分組的長度除以數(shù)據(jù)率。再假定分組正確到達(dá)B后盲赊,B處理分組的時間可以忽略不計铣鹏,同時立即發(fā)回確認(rèn)。假定B發(fā)送確認(rèn)分組需要時間TA哀蘑,如果A處理確認(rèn)分組的時間也可以忽略不計诚卸,那么A在經(jīng)過(TD + RTT + TA)后就可以再發(fā)送下一個分組,這里的RTT是往返時間绘迁。
??信道利用率:發(fā)送方在一個發(fā)送周期內(nèi)合溺,有效地發(fā)送數(shù)據(jù)所需要的時間占整個發(fā)送周期的比率。
??因為僅僅是在時間TD內(nèi)才用來傳送有用數(shù)據(jù)(包括分組的首部)缀台,因此信道利用率U為:
假定1200km的信道的往返時間RTT = 20ms棠赛。分組長度是1200bit,發(fā)送速率是1MBit/s膛腐。若忽略處理時間和 TA( TA一般遠(yuǎn)小于 TD)睛约,則信道利用率U = 5.66%。
?? 2.4 流水線技術(shù)
??為了提高傳輸效率哲身,發(fā)送方可以不使用低效率的停止等待協(xié)議辩涝,而是采用流水線傳輸。
??流水線傳輸就是發(fā)送方可以連續(xù)發(fā)送多個分組勘天,不必每次發(fā)完一個分組就停下來等待對方的確認(rèn)怔揩。這樣信道上一直有數(shù)據(jù)在不斷的傳送,顯然這樣會提供信道利用率脯丝。
??但是流水線技術(shù)對可靠傳輸帶來了如下的影響:
(1) 必須增加序號范圍商膊。因為每個傳輸中的分組必須有一個唯一的序號,而且也許有多個在傳輸而沒有未確認(rèn)的分組宠进。而在停止等待協(xié)議中晕拆,由于發(fā)送一個分組就必須等待這個分組被確認(rèn),所以只需要一個序號即可(如每次傳輸完成后序號遞增)砰苍。
(2) 協(xié)議的發(fā)送方和接收方雙方需要緩存多個分組潦匈。
(3) 所需的序號范圍和對緩存的要求取決于數(shù)據(jù)傳輸協(xié)議如果處理丟失、損壞及延時過大的分組赚导。解決這些問題有兩種基本的方法:回退N步協(xié)議GBN(Go-Back-N)和選擇重傳協(xié)議SR(Selective Repeat)。
3 回退N步協(xié)議GBN
??在回退N步協(xié)議中赤惊,允許發(fā)送方發(fā)送多個分組而不需等待確認(rèn)吼旧,但它也受限于流水線中未確認(rèn)的分組數(shù)不能超過某個最大允許數(shù)N。
??發(fā)送窗口:發(fā)送方維持的一組連續(xù)的允許發(fā)送的分組的序號未舟。凡是發(fā)送出現(xiàn)的分組圈暗,在沒有收到確認(rèn)之前都需要暫時保留其副本掂为,以便在重傳時使用。
注:序號是可重用的员串,這里假設(shè)序號的范圍是 [ 0 , 7 ]勇哗。上圖中窗口的大小是5,表示最多可以連續(xù)發(fā)送5個分組而不需等待確認(rèn)寸齐∮担可見發(fā)送窗口越大,發(fā)送方在收到對方確認(rèn)之前就可以發(fā)送更多的數(shù)據(jù)渺鹦,因此傳輸效率也就越高帕膜。但是弯囊,窗口的大小也不是無限制的,窗口的大小受接收方的給出的窗口值和網(wǎng)絡(luò)擁塞的影響,是動態(tài)變化的覆糟。
??發(fā)送方每收到一個確認(rèn),就把發(fā)送窗口向前滑動一個分組的位置惑芭。如上圖所示掸绞,發(fā)送方收到了對第0分組的確認(rèn)后,將發(fā)送窗口向前移動一個分組的位置咽安。
??上圖表示了GBN協(xié)議的序號范圍示意圖伴网。其中
基序號:表示最早的未被確認(rèn)的分組。
下一個序號:表示最小未使用的序號板乙,即下一個待發(fā)分組的序號是偷。
??序號被分割成了四個部分,各個部分的含義如圖所示募逞。
??2.1 發(fā)送方必須響應(yīng)的三種類型事件:
??(1) 上層的調(diào)用蛋铆。
??當(dāng)上層要發(fā)送數(shù)據(jù)時,發(fā)送方會先檢查發(fā)送窗口是否已滿放接,如果未滿刺啦,則產(chǎn)生一個分組并將其發(fā)送;如果窗口已滿纠脾,發(fā)送方只需將數(shù)據(jù)返回給上層玛瘸,暗示窗口已滿,上層可能要等一會再試苟蹈。再實際中糊渊,發(fā)送方可以緩存這些數(shù)據(jù),等窗口不滿時再發(fā)送分組慧脱。
??(2) 收到一個ACK:GBN協(xié)議中渺绒,對序號為n的分組的確認(rèn)是采用累積確認(rèn)(cumulative acknowledgement)的方式。
??發(fā)送方可以不用每接收一個分組就返回一個確認(rèn),當(dāng)一連串分組按序到達(dá)時宗兼,發(fā)送方可以為這一連串的分組返回一個確認(rèn)躏鱼,確認(rèn)的分組就是按序到達(dá)的最大的分組序號。例如殷绍,如下圖所示染苛,接收方同時接收到0、1主到、2茶行、3號分組,那么接收方可以就返回一個ACK 3表示接收方已經(jīng)正確收到了3號分組以及之前的所有分組镰烧。
??即接收方返回一個ACK n的分組拢军,那么就表示接收方已經(jīng)收到了n分組以及n分組之前的所有分組,即使接收方?jīng)]有返回n之前的確認(rèn)怔鳖。
??(3) 超時事件:如果發(fā)生超時事件茉唉,發(fā)送方重傳所有已發(fā)送但還未被確認(rèn)過的分組。
后退N步協(xié)議名字就來源于出現(xiàn)丟失或時延過程分組發(fā)送方的行為结执。在GBN協(xié)議中度陆,發(fā)送方僅僅使用一個定時器,這個定時器可以當(dāng)作是最早的已發(fā)送但是沒有被確認(rèn)的分組所使用的定時器献幔。如果收到了一個ACK懂傀,但仍有已發(fā)送但未被確認(rèn)的分組,則定時器會被重新啟動蜡感。當(dāng)沒有已發(fā)送但是沒有被確認(rèn)的分組時蹬蚁,定時器被終止。
舉個例子說明一下郑兴,假設(shè)發(fā)送方發(fā)送了0號犀斋、1號、2號情连、3號分組叽粹,此時0號分組是最早發(fā)送但是未被確認(rèn)的分組,計時器在0號分組發(fā)送后啟動却舀,之后發(fā)送方接收到了0號虫几、1號分組的確認(rèn)。此時仍有已發(fā)送但是沒有被確認(rèn)的分組挽拔,即2號分組了辆脸,所以計時器重新啟動。但2號分組由于網(wǎng)絡(luò)原因而丟失螃诅,所以也就收不到2號分組的確認(rèn)每强,由于GBN協(xié)議是累積確認(rèn)機(jī)制始腾,自然3號分組即使送達(dá)接收方也不會返回ACK 3州刽,等到計時器超時空执,發(fā)送方會把2號分組和3號分組重新再發(fā)送一次。
??2.2 發(fā)送方需要做的事
??(1) 如果接收方正確收到n號分組穗椅,并且按序(即上次交付給上層的分組序號是n-1)辨绊,則接收方位分組n發(fā)送一個ACK,并將該分組交付給上層匹表。
??(2) 其他情況门坷,接收方丟棄分組,并為最近按序接收到的分組重新發(fā)送ACK袍镀。即GBN協(xié)議中默蚌,接收方丟失所有失序的分組,接收方不緩存任何的失序分組苇羡,只需要維護(hù)一個下一個按序接收的分組序號:expectedseqnum绸吸。
??如下圖所示,發(fā)送方發(fā)送4個分組设江,其中2號分組丟失锦茁,接收方返回0號分組的確認(rèn)后,就知道下一個需要接收的分組序號是1叉存,但是沒有接收到1號分組码俩,而是后面的3號分組和4號分組,所以接收方發(fā)現(xiàn)不是1號分組則簡單粗暴的丟失歼捏,并且為最近按序收到的分組重新發(fā)送ACK稿存,本例中即接收方返回的是ACK 0,它給發(fā)送端返回的意思是瞳秽,我已經(jīng)正確收到0號分組了瓣履,請給我下一個分組即1號分組,其他分組不是我想要的寂诱。
??很顯然拂苹,GBN協(xié)議對失序的分組選擇直接丟失的行為優(yōu)點是使得接收緩存簡單,即接收方不緩存任何失序的分組痰洒,但是缺點也是非常明顯的瓢棒,由于一個分組出錯可能需要重傳原來已經(jīng)正確傳送的分組,這對資源無疑是一種浪費丘喻,其次這些重傳的分組也許也會丟失或出錯脯宿,從而導(dǎo)致更多的重傳。
??最后泉粉,用一個例子總結(jié)下一GBN協(xié)議的工作流程
假設(shè)窗口長度為4连霉,序號范圍0~7榴芳。
??(1) 發(fā)送端發(fā)送0、1跺撼、2窟感、3號分組,此時發(fā)送窗口已滿歉井,不能在發(fā)送新的分組柿祈,在4個分組的傳輸?shù)倪^程中,其中2號分組丟失哩至。
??(2) 接收方返回對0號分組的確認(rèn)躏嚎,此時窗口向前滑動一個分組位置,并同時發(fā)送4號分組菩貌。此時卢佣,由于0號分組已被確認(rèn),計時器重新啟動箭阶,開始為分組1開始計時....
??(3) 接收方在接收到發(fā)送方的0號分組后期望接下來收到1號分組虚茶,但是沒有收到1號分組,但是卻收到2號分組和3號分組尾膊,所以直接丟失媳危,并向發(fā)送方返回ACK 0,同樣對于之后收到的4號分組也是直接丟失并返回ACK 0冈敛,此時窗口已經(jīng)滿了待笑,也無法發(fā)送新的分組。
??(4) 在計時器超時后抓谴,發(fā)送方重傳所有已發(fā)送但是沒有被確認(rèn)的分組暮蹂,即1號、2號癌压、3號和4號分組仰泻,如果這次沒有分組丟失,那么接收方會返回這4個分組的確認(rèn)滩届,發(fā)送方在收到確認(rèn)后集侯,將窗口向前移動4個分組位置。
2.3 GBN協(xié)議總結(jié)
??(1) GBN協(xié)議使用累積確認(rèn)機(jī)制帜消。
??(2) 接收方只按順序接收分組棠枉,不按序的分組直接丟失。
??(3) 重傳時需要重傳全部已發(fā)送但是沒有被確認(rèn)的分組泡挺。
??(4) 確認(rèn)序列號最大的辈讶、按序到達(dá)的分組。
3 選擇重傳協(xié)議SR
??選擇重傳協(xié)議是對GBN協(xié)議的缺點進(jìn)行了改進(jìn)娄猫,GNB超時重傳會對那些已經(jīng)正確傳送的分組都重新傳送贱除,并且對失序到達(dá)的分組直接丟失生闲。
??選擇重選協(xié)議通過讓發(fā)送方僅重傳那些可能在接收方出錯(即丟失或受損)的分組而避免了不必須要的重傳。SR協(xié)議的改進(jìn)措施:
??1) 接收方對每個分組單獨進(jìn)行確認(rèn)月幌,并設(shè)置緩存機(jī)制碍讯,緩存亂序到達(dá)的分組
??2) 發(fā)送方只重傳那些沒有收到的ACK分組,并為每個分組設(shè)置定時器飞醉。
??下圖表示選擇重選協(xié)議的發(fā)送窗口和接收窗口冲茸。發(fā)送窗口和同步窗口是不同步的。
注:上下兩個圖并沒有對應(yīng)關(guān)系缅帘。
??3.1 SR發(fā)送方必須響應(yīng)的三件事
??(1) 上層的調(diào)用。
從上層收到數(shù)據(jù)后难衰,SR發(fā)送方檢查下一個可用于該分組的序號钦无,如果序號位于發(fā)送窗口之內(nèi),則發(fā)送分組盖袭;否則就像GBN一樣失暂,要么將數(shù)據(jù)緩存,要么返回給上層過一會再傳輸鳄虱。
??(2) 收到一個ACK弟塞。
如果收到ACK,假如該分組序號在窗口內(nèi)拙已,則SR發(fā)送方將那個被確認(rèn)的分組標(biāo)記為已接收决记。如果該分組序號是窗口的下界(最左邊第一個窗口對應(yīng)的序號),則窗口向前移動到具有最小序號的未確認(rèn)分組處倍踪。
??如下圖所示系宫,當(dāng)收到2號分組的確認(rèn)后,窗口向前滑動一直到最小序號的未確認(rèn)的分組處建车,即5號分組處扩借。
??(3) 超時:定時器再次被用來發(fā)送丟失的分組。每個分組都有自己的邏輯定時器缤至,因為超時發(fā)生后只能發(fā)送一個分組潮罪。
??3.2 SR接收方必須做的事
??(1) SR接收方將確認(rèn)一個正確接收的分組(在窗口內(nèi))而不管其是否按序。失序的分組將被緩存直到所有丟失的分組(即序號更小的分組)都被收到為止领斥,這是才可將一批分組按序交付給上層嫉到,然后向前移動滑動窗口。
如下圖所示戒突,3號屯碴、4號以及6號分組失序達(dá)到并已經(jīng)確認(rèn),如果此時2號分組到達(dá)膊存,那么接收方就將2號导而、3號和4號分組交付給上層忱叭,并將窗口向前滑動。
??如果接收方收到一個在窗口左側(cè)的分組(確切的來說今艺,左邊一個窗口大小范圍的序號分組韵丑,即rev_base - N~rev_base - 1),在這種情況下虚缎,必須發(fā)送一個ACk撵彻,即使該分組是接收方以前已確認(rèn)的分組。
還是上圖实牡,如果接收端過了一會又接收到了2號分組陌僵,這就表明接收端發(fā)送給發(fā)送方的確認(rèn)分組丟失了,接收方以為接收方?jīng)]有收到自己分送的分組创坞,這時會超時重傳碗短,但是接收方確實已經(jīng)接收到了2號分組,所以此時接收方會給發(fā)送方重新返回一個ACK题涨。
??對于其他情況偎谁,則忽略分組即可。
??下面的圖可以表示SR協(xié)議的工作過程纲堵,具體分析過程和GBN協(xié)議相似巡雨,這里就不細(xì)說了。
圖中假設(shè)了發(fā)送窗口和接收窗口的大小都是4席函,序號范圍0~7铐望。
??3.3 SR協(xié)議總結(jié)
??(1) 對窗口內(nèi)的分組逐一確認(rèn),收一個確認(rèn)一個向挖。
??(2) 只傳出錯的分組蝌以。
??(3) 接收方有緩存機(jī)制,存放失序的分組何之。
4 小結(jié)
考慮到本文篇幅跟畅,還有一些內(nèi)容下篇文章再說。