網(wǎng)絡(luò)是不可靠的,資料在通信鏈路的傳輸過(guò)程中践险,可能因?yàn)樾盘?hào)干擾問(wèn)題而導(dǎo)致信號(hào)錯(cuò)誤。在這種情況下,通常使用循環(huán)冗余校驗(yàn)(CRC)來(lái)檢測(cè)錯(cuò)誤巍虫。雖然有些偵錯(cuò)程序足夠強(qiáng)大彭则,強(qiáng)大到可以更正錯(cuò)誤的信號(hào),但是這個(gè)過(guò)程會(huì)消耗大量的計(jì)算資源占遥。接收端若是收到了錯(cuò)誤的訊框則會(huì)丟棄這個(gè)訊框俯抖,為了達(dá)到可靠傳輸?shù)哪康模l(fā)送端必須重新發(fā)送這些被丟棄的訊框瓦胎。
為了達(dá)到重送錯(cuò)誤訊框的目的芬萍,我們使用了以下 2 種基礎(chǔ)方法
- 肯定回復(fù)(Acknowledgment,ACK)
- 等待超時(shí)(timeout)
ACK 是一個(gè)控制訊框搔啊,接收端用它來(lái)通知傳送端其已收到之前的訊框柬祠,發(fā)送端端則通過(guò)接收到 ACK 確認(rèn)其訊框發(fā)送成功。
若是發(fā)送端在經(jīng)過(guò)一段等待時(shí)間后還沒(méi)有收到 ACK负芋,發(fā)送端會(huì)重新發(fā)送原來(lái)的訊框漫蛔,發(fā)送端等待 ACK 的一段合適的時(shí)間的動(dòng)作叫做等待超時(shí)。
停止和等待協(xié)議
發(fā)送端在傳送完一個(gè)訊框之后必須等收到 ACK之后旧蛾,才能發(fā)送下一個(gè)訊框莽龟。當(dāng)發(fā)送端等待一段時(shí)間后還未收到 ACK,發(fā)送端發(fā)送等待超時(shí)锨天,重新發(fā)送原來(lái)的訊框毯盈。
上圖所示,發(fā)送端在等待超時(shí)前收到 ACK病袄。
上圖所示搂赋,發(fā)送端的原始訊框丟失,發(fā)送端等待超時(shí)后重新發(fā)送訊框陪拘。
上圖所示厂镇,接收端的 ACK 丟失,發(fā)送端等待超時(shí)左刽,重新發(fā)送訊框。
上圖所示酌媒,接收端的 ACK 延遲到達(dá)欠痴,接收端重新發(fā)送訊框。
接收端的 ACK 在到達(dá)發(fā)送端的過(guò)程中丟失或者延遲了秒咨,那么傳送端會(huì)等待超時(shí)并且重送原本的訊框喇辽。這樣的話(huà)重復(fù)發(fā)送同樣的訊框,造成網(wǎng)絡(luò)資源浪費(fèi)雨席。
上面存在的問(wèn)題菩咨,通過(guò)給訊框設(shè)置一個(gè)序號(hào)則可以解決。當(dāng)發(fā)送端發(fā)送編號(hào)為 0 的訊框,接收端可以知道這個(gè)訊框 0 重復(fù)抽米,因此可以忽略這個(gè)訊框特占,但是依舊會(huì)給發(fā)送端發(fā)送 ACK。
滑動(dòng)窗口協(xié)議 (Sliding Window Protocol)
到現(xiàn)在為止云茸,發(fā)送端和接收端的通信模型在同一個(gè)時(shí)間只有一個(gè)訊框在發(fā)送是目,嚴(yán)重浪費(fèi)網(wǎng)絡(luò)資源。為了充分利用網(wǎng)絡(luò)資源标捺,發(fā)送端在停下來(lái)等待 ACK 之前懊纳,發(fā)送端必須發(fā)送更多的訊框。
為了實(shí)現(xiàn)滑動(dòng)窗口協(xié)議亡容,發(fā)送端給每個(gè)訊框一個(gè)序號(hào)嗤疯,假設(shè)這個(gè)序號(hào)值可以無(wú)限大,發(fā)送端需要持續(xù)記錄下面 3 個(gè)變量
- 傳送窗口的大泄刖ぁ(Sending Window Size鱼鼓,SWS)
- 最后收到的 ACK 序號(hào)(Last Acknowledgment Received,LAR)
- 最后發(fā)送的訊框序號(hào) (Last Frame Sent廓潜,LFS)
對(duì)于上面的 3 個(gè)變量結(jié)合圖示台丛,我們有底下的等式
LFS - LAR <= SWS
當(dāng)發(fā)送端接收到一個(gè)編號(hào)為 LAR+1 的 ACK,將 LAR 向右移動(dòng)戴而,使發(fā)送端可以發(fā)送另一個(gè)訊框凑术。每個(gè)發(fā)送端對(duì)每個(gè)發(fā)送出去的訊框都會(huì)有一個(gè)計(jì)時(shí)器,若是計(jì)時(shí)器在 ACK 到達(dá)前超時(shí)所意,則重送該訊框淮逊。發(fā)送端也需要一個(gè)有 SWS 容量大小的緩沖區(qū),用于存在發(fā)送出去的訊框扶踊,這樣才能在需要重送訊框的時(shí)候找到訊框泄鹏。
為了實(shí)現(xiàn)滑動(dòng)窗口協(xié)議,接收端需要持續(xù)記錄下面 3 個(gè)變量
- 接收窗口的大醒砗摹(Receiving Windows Size 备籽,RWS)
- 最大可接收的訊框序號(hào)(Largest Acceptable Frame ,LAF)
- 最后收到的訊框序號(hào) (Last Frame Received 分井,LFR)
對(duì)于上面的 3 個(gè)變量結(jié)合圖示车猬,我們有底下的等式
LAF - LFR <= RWS
當(dāng)接收端接收到序號(hào)為 SeqNum 的訊框時(shí),若是 SeqNum <= LFR 或者 SeqNum > LAF 尺锚,此訊框在接收端滑動(dòng)外面珠闰,那么接收端會(huì)將此訊框丟棄。若是 LFR < SeqNum <= LAF 瘫辩,接收端接收此訊框伏嗜。當(dāng)接收端接收到一個(gè)編號(hào)為 LFR+1 的 訊框坛悉,將 LFR 向右移動(dòng)。
如上圖所示承绸,假設(shè) LFR = 1, RWS = 7, LAF = 8裸影。若訊框 4,6八酒,3空民,5 先后到達(dá),雖然它們沒(méi)有按照序號(hào)順序到達(dá)羞迷,但是它們都會(huì)被收起來(lái)界轩,因?yàn)樗鼈兌荚诮邮斩舜翱趦?nèi)。但是接收端不會(huì)發(fā)送 ACK衔瓮,因?yàn)橛嵖?2 還沒(méi)有到達(dá)浊猾,等到訊框 2 到達(dá)之后,接收端發(fā)送訊框 6 的 ACK热鞍,此時(shí)窗口滑動(dòng)葫慎, LFR 改為 6, LAF 改為 13薇宠。
如上圖所示偷办,滑動(dòng)窗口協(xié)議中的 ACK 采用的是累積式的 ACK (Accumulative ACKs), SeqNumToAck 表示所有編號(hào)小于 SeqNumToAck 的訊框都已經(jīng)收到了,即使收到較高序號(hào)的訊框澄港,接收端還是會(huì)送出序號(hào)為 SeqNumToAck 的 ACK椒涯,對(duì)于接收端來(lái)說(shuō) LFR = SeqNumToAck -1, LAF = LFR+ RWS
總結(jié)
- 為了達(dá)到可靠傳輸?shù)哪康模瑓f(xié)議設(shè)計(jì)者在通信鏈路上使用了 2 個(gè)基礎(chǔ)技術(shù)回梧,分別是 ACK 和 等待超時(shí)废岂。
- 停止和等待協(xié)議是一個(gè)可靠的協(xié)議,但是運(yùn)行效率不夠好狱意,同時(shí)只有一個(gè)訊框在通信鏈路上傳送湖苞,而且接收端可能受到重復(fù)的訊框。
- 滑動(dòng)窗口協(xié)議是一個(gè)可靠而且高效率的協(xié)議详囤,它會(huì)給所有的訊框設(shè)置一個(gè)序號(hào)财骨,多個(gè)訊框可以同時(shí)在通信鏈路上傳送。對(duì)于發(fā)送端需要維持 3 個(gè)變量纬纪,分別是發(fā)送端視窗大序驹佟(SWS),最后收到的 ACK 編號(hào)(LAR),最后發(fā)送的訊框編號(hào)(LFS)包各。對(duì)于接收端需要維持 3 個(gè)變量,分別是接收端窗口大邪忻怼(RWS),最大可接收的訊框編號(hào)(LAF),最后收到的訊框編號(hào)(LFR)问畅。
對(duì)于發(fā)送端來(lái)說(shuō),有以下等式
對(duì)于接收端來(lái)說(shuō),有以下等式
- 滑動(dòng)窗口協(xié)議提供了 3 個(gè)特性护姆,分別是可靠的傳輸矾端,維持訊框順序,流量控制卵皂。利用每個(gè)訊框都有序號(hào)秩铆,順序錯(cuò)誤的訊框會(huì)被置于緩沖區(qū)的功能來(lái)實(shí)現(xiàn)維持訊框順序特性。流量控制是利用接收端可以設(shè)定 RWS 的值來(lái)調(diào)節(jié)發(fā)送端的速度灯变,防止發(fā)送端發(fā)送過(guò)多的訊框?qū)⒔邮斩巳?/li>
參考
作為網(wǎng)絡(luò)方面的簡(jiǎn)單入門(mén)內(nèi)容殴玛,文章主要是介紹網(wǎng)絡(luò)的可靠傳輸機(jī)制的簡(jiǎn)單知識(shí)。這篇博客內(nèi)容總結(jié)于黃能富教授的《CS01060 2017-秋季-計(jì)算機(jī)網(wǎng)路概論》課程添祸,博客截圖來(lái)源于課程 PPT滚粟。