流水线可靠数据传输协议
在構(gòu)造可靠傳輸協(xié)議那一篇我們知道rdt3.0的利用率是非常低的,為了解決利用率問題我們用流水線技術(shù)解決。
流水線:發(fā)送方允許發(fā)送多個(gè)“在路上的”,還沒有確認(rèn)的報(bào)文。
流水線技術(shù)對可靠數(shù)據(jù)傳輸協(xié)議可帶來如下影響:
(1)序號數(shù)目的范圍必須增加,因?yàn)槊總€(gè)輸送中的分組必須有一個(gè)唯一的序號,而且也許有多個(gè)在輸送中未確認(rèn)的報(bào)文。
(2)協(xié)議的發(fā)送方和接收方兩端會緩存多個(gè)分組。發(fā)送方最低限度應(yīng)當(dāng)緩存那些已發(fā)送但沒有確認(rèn)的分組,接收方需要緩存已正確接收的分組。
流水線技術(shù)與停等方式對比如下圖:
流水線技術(shù)有兩個(gè)通用形式:
(1)回退N步法。
(2)選擇重傳法。
如下圖,流水線主要是為了增加利用率。
回退N幀和選擇重傳主要取決于傳輸協(xié)議如何處理丟失、損壞以及時(shí)延過大的分組。
一、回退N步
在回退N步協(xié)議中,允許發(fā)送方發(fā)送多個(gè)分組而不需要等待確認(rèn),但受限于在流水線中未確認(rèn)的分組數(shù)不能超過某個(gè)做大允許數(shù)N。
上圖為發(fā)送方看到的回退N步協(xié)議序號的范圍,將即序號定義為最早的未確認(rèn)分組的序號,對應(yīng)圖中的send_base;將下一個(gè)序號定義未最小未使用的序號即下一個(gè)待發(fā)分組的序號,對應(yīng)圖中的nextseqnum。可以將序號范圍分為4段,綠色的是已經(jīng)發(fā)送并被確認(rèn)的分組,黃色的是已經(jīng)發(fā)送但未被確認(rèn)的分組,藍(lán)色的是用于那些要被立即發(fā)送的分組,而白色的是未被發(fā)送的分組。
已經(jīng)發(fā)送但未被確認(rèn)和可用于立即發(fā)送的那一部分可以看成一個(gè)長度為N的窗口,隨著協(xié)議的進(jìn)行,窗口也會向前移動,所有回退N步也稱為滑動窗口協(xié)議。
發(fā)送方在分組首部固定長度的字段中規(guī)定一個(gè)分組序號,若分組序號字段是k比特,那么序號范圍是[0,2k^kk-1]。
發(fā)送方響應(yīng)三種類型的事件:
(1)上層的調(diào)用:發(fā)送方首先檢查發(fā)送窗口是否滿,即是否有N個(gè)已經(jīng)發(fā)送但未被確認(rèn)的分組,如未滿則發(fā)送一個(gè)分組再進(jìn)行更新。如果窗口滿了那么將數(shù)據(jù)返回給上層,表示窗口滿了,讓上層等會在調(diào)用。
(2)收到一個(gè)ACK:對序號未N的分組采取累計(jì)確認(rèn)的方式,表明接收方已正確接收到序號為n的以前且包括n在內(nèi)的所有分組。
(3)超時(shí)事件:出現(xiàn)超時(shí)會重傳所有已發(fā)送但還未被確認(rèn)的分組。這里發(fā)送方僅使用一個(gè)定時(shí)器,它可以被當(dāng)作是最早的已發(fā)送但未被確認(rèn)的分組。如果收到一個(gè)ACK,但仍有已發(fā)送但未被確認(rèn)的分組,則定時(shí)器被重新啟動。如果沒有已發(fā)送但未被確認(rèn)的分組,該定時(shí)器被終止。如圖:
分組2超時(shí),那么將會把分組2,以及后面的分組3、4、5全部重傳。
在這個(gè)傳輸過程中接收方做兩個(gè)動作:
(1)如果序號為n的分組被正確接收到,并且是按序的即上次交付給上層的數(shù)據(jù)是序號為n-1的分組,則回送發(fā)送方ACK。
(2)其它情況下接受方丟棄分組,即沒有緩沖區(qū)接收。并為最近按序接收的分組重新發(fā)送ACK。
在整個(gè)回退N步的過程中我們可以看到丟棄一個(gè)正確接受的分組的一個(gè)缺點(diǎn)是隨后對該分組的重傳也許會丟失或者出錯(cuò)。需要更多的重傳,接收方若將分組2丟棄,分組3、4、5被發(fā)現(xiàn)時(shí)已經(jīng)丟失了。所以有一個(gè)分組丟失就需要重傳更多的分組。
二、選擇性重傳
回退N步法改善了信道的效率,但仍然有不必要的重傳問題。選擇性重傳解決了這個(gè)問題。
選擇重傳協(xié)議通過讓發(fā)送方僅重傳那些它懷疑在接收方出錯(cuò)即丟失或受損的分組而避免了不必要的重傳。
接收方主要做兩個(gè)動作:
(1)接收方接收所有正確報(bào)文時(shí)需要緩存分組,以便最后按序交到上層。
(2)發(fā)送者只重發(fā)沒有收到確認(rèn)的分組,對每個(gè)沒有確認(rèn)的報(bào)文發(fā)送者都要啟動一個(gè)定時(shí)器。
上圖中上半部分是發(fā)送方看到的序號,下半部分是接收方看到的序號。上半部分含義與回退N步一樣,不再解釋。接收方看到的序號中粉色代表失序(已緩存)但未被確認(rèn)的分組。藍(lán)色代表可接受(窗口內(nèi))的分組,灰色代表期待,還未收到的分組,白色代表不可用的分組。
發(fā)送方同樣響應(yīng)三種類型的事件:
(1)發(fā)送方從上層接受數(shù)據(jù):當(dāng)從上層接收到數(shù)據(jù)后,發(fā)送方檢查下一個(gè)可用于該分組的序號。如果序號位于發(fā)送方的窗口內(nèi),則將數(shù)據(jù)打包并發(fā)送。
(2)超時(shí):定時(shí)器再次被用來防止丟失分組,然而,現(xiàn)在每個(gè)分組必須擁有自己的邏輯定時(shí)器,因?yàn)槌瑫r(shí)發(fā)送后只能發(fā)送一個(gè)分組。
(3)收到ACK。如果收到ACK,倘若分組序號在窗內(nèi),則發(fā)送方將那個(gè)被確認(rèn)的分組標(biāo)記為已接受。如果該分組的序號等于send_base,則窗口基序號向前移動到具有最小序號的未確認(rèn)分組處。如果窗口移動了并且有序號落在窗口內(nèi)的未發(fā)送分組,則發(fā)送這些分組。
在這個(gè)過程中發(fā)送窗口是N個(gè)連續(xù)的序號,需要限制被發(fā)送的未確認(rèn)的分組數(shù)量。
接收方動作:
(1)序號在[rcv_base,rcv_base+N-1]內(nèi)也就是窗口內(nèi)的分組被正確接收。在此情況下,收到的分組落在接收方的窗口內(nèi),一個(gè)選擇ACK被回送給發(fā)送方。如果該分組以前沒收到過。則緩存該分組。如果該分組的序號等于接收窗口的基序號即rcv_base,則該分組以及以前緩存的序號連續(xù)的分組交付給上層。然后,接收窗口按向前移動分組的編號向上交付這些分組。
(2)序號在[rcv_base-N,rcv_base-1]內(nèi)分組被正確收到,在此情況下,必須產(chǎn)生一個(gè)ACK,即使該分組是接收方以前已確認(rèn)過的分組。
(3)其它情況則忽略該分組。
下圖未選擇性重傳的操作:
總結(jié)
以上是生活随笔為你收集整理的流水线可靠数据传输协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux学习之系统编程篇:利用 set
- 下一篇: Linux学习之系统编程篇:与信号集有关