【漫話】三分鐘基礎(chǔ):什么是確認(rèn)重傳機(jī)制?
作者:帥地



小白:你知道嗎?數(shù)據(jù)在傳輸?shù)臅r候是分割成一小塊一小塊傳輸?shù)?,我們把這一小塊的數(shù)據(jù)稱之為一個分組。我們在傳輸這塊分組的時候,主要面臨兩個問題。
1、這個分組在傳輸?shù)倪^程中,由于在信道傳輸過程中,收到干擾,導(dǎo)致這個分組到達(dá)目的地之后出現(xiàn)了差錯,例如分組里面的二進(jìn)制位1變成了0,0變成了1。
2、分組還沒傳輸?shù)侥康牡兀蛠G失了,我們也把這種情況稱之為丟包。
接下來我們先來談?wù)劦谝环N情況吧,即分組傳到目的地之后出現(xiàn)了差錯。
這里我們先假設(shè)計算機(jī)A給計算機(jī)B發(fā)送分組數(shù)據(jù)




在這里插入圖片描述一禪:如果沒有差錯的話,計算機(jī)B就給計算機(jī)A發(fā)送一個ACK分組,告訴對方,數(shù)據(jù)正確無誤。如果出現(xiàn)差錯的話,就給對方發(fā)送一個NAK分組,告訴對方,分組數(shù)據(jù)出現(xiàn)了差錯。
當(dāng)計算機(jī)A收到接受方的反饋之后,如果收到的是ACK分組,那么就繼續(xù)發(fā)送下一個分組數(shù)據(jù)。如果收到的是NAK分組,那么就重新傳輸這個分組。



在這里插入圖片描述
在這里插入圖片描述小白:這時就會出現(xiàn)了混亂,就相當(dāng)于兩個人A,B在對話。
A : 傳輸給你一個分組
B :你發(fā)的是啥,可以重發(fā)一次嗎?
A :你發(fā)的又是啥?可以重發(fā)一次嗎?
B :你發(fā)的又是啥?可以重發(fā)一次嗎
……
進(jìn)去無限混亂之中
在這里插入圖片描述
在這里插入圖片描述
小白:法子倒是不錯,不過如果分組出現(xiàn)大量差錯,會讓校驗(yàn)碼變的很難設(shè)計的,而且校驗(yàn)碼屬于與正文內(nèi)容無關(guān)的數(shù)據(jù),占了太多比特位的話,會降低傳輸效率。還有其他法子嗎?




小白:我們可以給每個分組添加一個序號啊,這樣就可以知道是重傳的分組還是新的分組了。
如果B收到的分組沒出差錯,這時又收到一個序號相同的分組,這時B就知道這個分組是屬于重傳的分組了,這時B就把這個重傳的分組丟棄。
在這里插入圖片描述情況二:分組丟失時的問題處理
在這里插入圖片描述一禪:哈哈,我知道怎么解決,可以采取和分組差錯類似的方法,如果A遲遲沒有收到B的反饋,A就可以認(rèn)為這個分組丟失了,重新發(fā)送。
所以我們每次發(fā)送分組的時候,需要給該分組設(shè)置一個定時器
在這里插入圖片描述小白:腦子轉(zhuǎn)的挺快啊。不過你知道嗎?我們上面談的那些,都是A發(fā)送一個分組,收到B的反饋之后,再發(fā)送下一個分組。你不覺得這種方法很浪費(fèi)信道的資源嗎?





這里先說明一下,如果同時發(fā)送多個分組時,最需要處理的問題就是接受方收到分組時,并非按照順序收到分組的,有可能序號小的分組先達(dá)到,這時就會出現(xiàn)了亂序。
回退N步協(xié)議(GBN)
在回退N步法中允許發(fā)送多個分組而不需要等待確認(rèn),但它也受限于在流水線中未確認(rèn)的分組數(shù)不能超過某個最大允許數(shù)N。如下圖,我們將基序號定義為最早的未確認(rèn)分組的序號,將下一個序號(nextseqnum)定義為最小的未使用序號(即下一個待發(fā)送分組)。
在這里插入圖片描述此時我們可以將序號分成4段。在[0, base-1]段內(nèi)的序號對應(yīng)已發(fā)送并且已經(jīng)確認(rèn)的分組序號,[base,nextseqnum]段內(nèi)對應(yīng)已經(jīng)發(fā)送但未確認(rèn)的分組序號,[nextseqnum, base+N-1]段內(nèi)表示即將要被發(fā)送的分組序號。而那些大于base+N的序號目前還不能使用,直到當(dāng)前流水線中未被確認(rèn)的分組得到確認(rèn),窗口整體向右移動之后,才能夠被使用。
所以,我們常把N稱之為窗口長度,由于窗口在序號范圍內(nèi)移動,也被GBN協(xié)議稱之為滑動窗口協(xié)議。
對于GBN協(xié)議,計算機(jī)A(發(fā)送方)需要響應(yīng)以下兩個事件:
1、收到一個ACK:在GBN協(xié)議中,對序號為n的分組的確認(rèn)采取累計確認(rèn)的方式。也就是說,當(dāng)A收到序號為n的分組時,表明分組n以及n之前的分組已經(jīng)被B正確接受了。
2、超時事件:當(dāng)久久沒有收到ACK時,A就認(rèn)為它發(fā)送的分組已經(jīng)丟失了,這時A會重傳所有已發(fā)送但還未被確認(rèn)的分組。這個時候需要注意的是,并不是為每個分組設(shè)置一個定時器,而是在序號[base,nextseqnum-1]中,設(shè)置一個定時器,當(dāng)base發(fā)送的那一刻,就開始計時,當(dāng)收到一個ACK時,則刷新重新開始計時。
計算機(jī)B(接收方)則需要處理一下事件:
如果一個序號為n的分組被正確收到,并且按序(所謂按序就是指n-1的分組也已經(jīng)收到了),則B為分組n發(fā)送一個ACK,否則,丟棄該分組,并且為最近按序接收的分組重新發(fā)送ACK。
接收方的這種處理方式,意味著如果n被正確交付,則意味著比n小的所有分組也被正確交付了。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
小白:你這個想法其實(shí)也是挺不錯的,不過如果分組n-1丟失了,那么按照GBN的重傳規(guī)則,這時n-1和n都會被重傳,這時之前緩存的n就沒啥用了。而且,我們?nèi)绻裯丟棄了,那么我們就不需要緩存任何失序的分組了,這樣可以讓我們的設(shè)計更加簡單哦。
選擇重傳(SR)
回退N步協(xié)議的缺點(diǎn)也是很明顯的,單個分組的差錯能夠引起GBN重傳大量的分組,而且許多分組根本就沒有必要重傳。例如我們發(fā)送的序號為0-100,萬一序號為1的分組出現(xiàn)了某些差錯,這會導(dǎo)致1-100的分組會被重傳,想想這是多么恐怖的事情啊。
因此,出現(xiàn)了選擇重傳這種協(xié)議。所謂“選擇”,也就是有選擇著去重傳。
不過選擇重傳和回退N步是很相似的,只是在選擇重傳中,接收方收到失序的分組時,會把它緩存起來,直到拼湊到分組按序,才把分組傳輸給上一層。而發(fā)送方會為每個分組設(shè)置一個定時器,這樣,只需要重傳那些沒有被接收方正確接收的分組就可以了。
我來個例子吧。
假設(shè)窗口長度N=6,這時A向B發(fā)送分組1-5。
在這里插入圖片描述當(dāng)A收到序號為3的ACK,則狀態(tài)如下:
在這里插入圖片描述注意,這個時候雖然序號3被確認(rèn)接收了,但窗口并不能向右移動一格。
接下來受到序號為1的ACK,則:
在這里插入圖片描述這個時候窗口才可以向右移動一格。注意,黃色的那些序號是可以繼續(xù)發(fā)送分組的,只是我沒有繼續(xù)填充發(fā)送而已。
接著收到序號為2的分組。
在這里插入圖片描述這個時候窗口向右移動了兩個格。
接著繼續(xù)這樣接收下去,如果還有分組沒發(fā)送的,就從nextseqnum開始填充發(fā)送…
如果某個分組超時了,就重新傳輸這個分組。
對于接收方B的窗口來說也差不多也一樣,在此不展開。接收方對于失序的分組緩存起來,直到所有丟失的分組全部被收到為止,再把這批分組按序交付給上一層。
我在書上截了張完整的例子圖:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述這樣,兩個完全陌生的計算機(jī)就可以就行可靠數(shù)據(jù)傳輸了。這也是可靠數(shù)據(jù)傳輸?shù)脑怼?/p>
在這里插入圖片描述最后一點(diǎn)感想
總感覺這篇文章講的好一般,感覺有點(diǎn)小啰嗦或者…..也不知道怎么說,本來我是想寫成那種一點(diǎn)一點(diǎn)引導(dǎo)出知識點(diǎn)的,不過在回退N步和選擇重傳中,有點(diǎn)不知道怎么引導(dǎo)。不過我會爭取在后面的文章講的更加通俗易懂。
說實(shí)話,這篇文章其實(shí)算是比較簡單的幾個知識點(diǎn),不過我還是寫了好久,加上自己畫圖之列的就更加了,哈哈。主要是一直不知道怎么下手。不過就算花時間,我也會盡最大努力去寫。再次感謝讀者們的支持,在之后的文章里,應(yīng)該會數(shù)據(jù)結(jié)構(gòu)與算法和計算機(jī)網(wǎng)絡(luò)穿插講。
擁塞控制以及流量控制其實(shí)也寫過的了,兩篇看這里:
三分鐘基礎(chǔ):什么是流量控制?
推薦閱讀
全部文章詳細(xì)分類與整理(算法+數(shù)據(jù)結(jié)構(gòu)+計算機(jī)基礎(chǔ))
玩公眾號寫文章一年多以來,我經(jīng)歷了被噴被拉黑被贊美,我酸了
有必要說一說即將到來的春招(經(jīng)歷+重要性+如何準(zhǔn)備)
