流量控制 、可靠傳輸與滑動窗口機(jī)制
流量控制涉及對鏈路上的幀的發(fā)送速率的控制 ,以使接收方有足夠的緩沖空間來接收每一個幀。例如,在面向幀的自動重傳請求系統(tǒng)中 ,當(dāng)待確認(rèn)幀的數(shù)量增加時 ,有可能超出緩沖存儲空間而造成過載 。流量控制的基本方法是由接收方控制發(fā)送方發(fā)送數(shù)據(jù)的速率 ,常見的方式有兩種 : 停止-等待協(xié)議和滑動窗口協(xié)議 。
????停止-等待流量控制基本原理
發(fā)送方每發(fā)送一幀 ,都要等待接收方的應(yīng)答信號 ,之后才能發(fā)送下一幀;接收方每接收一幀 , 都要反饋一個應(yīng)答信號 ,表示可接收下一幀,如果接收方不反饋應(yīng)答信號,則發(fā)送方必須一直等待。每次只允許發(fā)送一幀 ,然后就陷入等待接收方確認(rèn)信息的過程中 ,因而傳輸效率很低 。
????滑動窗口流量控制基本原理
在任意時刻 ,發(fā)送方都維持一組連續(xù)的允許發(fā)送的幀的序號,稱為發(fā)送窗口;同時接收方也維持一組連續(xù)的允許接收幀的序號 ,稱為接收窗口。發(fā)送窗口用來對發(fā)送方進(jìn)行流量控制,而發(fā)送窗口的大小 WT代表在還沒有收到對方確認(rèn)信息的情況下發(fā)送方最多還可以發(fā)送多少個數(shù)據(jù)幀。同理,在接收端設(shè)置接收窗口是為了控制可以接收哪些數(shù)據(jù)幀而不可以接收哪些幀 。在接收方只有當(dāng)收到的數(shù)據(jù)幀的序號落入接收窗口內(nèi)才允許將該數(shù)據(jù)幀收下 。若接收到的數(shù)據(jù)幀落在接收窗口之外 ,則一律將其丟棄。
下圖給出了發(fā)送窗口和接收窗口的工作原理。
在發(fā)送端,每收到一個確認(rèn)幀,發(fā)送窗口就向前滑動一個幀的位置,當(dāng)發(fā)送窗口內(nèi)沒有可以發(fā)送的幀 (即窗口內(nèi)的幀全部是己發(fā)送但未收到確認(rèn)的幀) ,發(fā)送方就會停止發(fā)送 ,直到收到接收方發(fā)送的確認(rèn)幀使窗口移動 ,窗口內(nèi)有可以發(fā)送的幀,之后才開始繼續(xù)發(fā)送 。
在接收端 ,當(dāng)收到數(shù)據(jù)幀后 ,將窗口向前移一個位置,并發(fā)回確認(rèn)幀 ,若收到的數(shù)據(jù)幀落在接收窗口之外則一律丟棄 。
滑動窗口有以下重要特性 :
1)? 只有接收窗口向前滑動時(同時接收方發(fā)送了確認(rèn)幀),發(fā)送窗口才有可能(只有發(fā)送方收到確認(rèn)幀才是一定)向前滑動。
2)從滑動窗口的概念看 ,停止-等待協(xié)議、后退 N 幀協(xié)議和選擇重傳協(xié)議只在發(fā)送窗口大小和接收窗口大小上有所差別 :
停止等待協(xié)議 :發(fā)送窗口大小 =1,接收窗口大?。? ; 后退 N 幀協(xié)議:發(fā)送窗口大?。? ,接收窗口大小=1; 選擇重傳協(xié)議 :發(fā)送窗口大?。?,接收窗口大?。?。
3) 當(dāng)接收窗口的大小為 1 時,可保證幀的有序接收 。
4) 數(shù)據(jù)鏈路層的滑動窗口協(xié)議中 ,窗口的大小在傳輸過程中是固定的(注意與傳輸層的滑動窗口協(xié)議的區(qū)別)。
????可靠傳輸機(jī)制
數(shù)據(jù)鏈路層的可靠傳輸通常使用確認(rèn)和超時重傳兩種機(jī)制來完成 。確認(rèn)是一種無數(shù)據(jù)的控制幀,這種控制幀使得接收方可以讓發(fā)送方知道哪些內(nèi)容被正確接收。有些情況下為了提高傳輸效率,將確認(rèn)捎帶在一個回復(fù)幀中,稱為捎帶確認(rèn) 。超時重傳是指發(fā)送方在發(fā)送某一個數(shù)據(jù)幀以后就開啟一個計時器 ,在一定時間內(nèi)如果沒有得到發(fā)送的數(shù)據(jù)幀的確認(rèn)幀? ,那么就重新發(fā)送該數(shù)據(jù)幀,直到發(fā)送成功為止 。
自動重傳請求 (Auto Repeat Request, ARQ ) ,通過接收方請求發(fā)送方重傳出錯的數(shù)據(jù)幀來恢復(fù)出錯的幀 ,是通信中用于處理信道所帶來差錯的方法之一? 。傳統(tǒng)自動重傳請求分為三種,即停-等式 ( Stop-and-Wait) ARQ、后退 N 幀 ( Go-Back-N)? ARQ 以及選擇性重傳(Selective Repate) ARQ? 。后兩種協(xié)議是滑動窗口技術(shù)與請求重發(fā)技術(shù)的結(jié)合 ,由于窗口尺寸開到足夠大時,幀在線路上可以連續(xù)地流動 ,因此又稱其為連續(xù) ARQ協(xié)議。注意,在數(shù)據(jù)鏈路層中流量控制機(jī)制和可靠傳輸機(jī)制是交織在一起的 。
單幀滑動窗口與停止-等待協(xié)議
在停止-等待協(xié)議中 ,源站發(fā)送單個幀后必須等待確認(rèn) ,在目的站的回答到達(dá)源站之前 ,源站不能發(fā)送其他的數(shù)據(jù)幀 。從滑動窗口機(jī)制的角度看 ,停止-等待協(xié)議相當(dāng)于發(fā)送窗口和接收窗口大小均為 1 的滑動窗口協(xié)議。
在停止-等待協(xié)議中 ,除了數(shù)據(jù)幀丟失 ,還可能出現(xiàn)以下兩種差錯 : 到達(dá)目的站的幀可能己遭破壞 ,接收站利用差錯檢測技術(shù)檢出后,簡單地將該幀丟棄。為了對付這種可能發(fā)生的情況,源站裝備了計時器 。在一個幀發(fā)送之后 ,源站等待確認(rèn),如果在計時器計滿時仍未收到確認(rèn) ,則再次發(fā)送相同的幀 。如此重復(fù) ,直到該數(shù)據(jù)幀無錯誤地到達(dá)為止 。
另一種可能的差錯是數(shù)據(jù)幀正確而確認(rèn)幀被破壞? ,此時接收方已經(jīng)收到了正確的數(shù)據(jù)幀,但發(fā)送方收不到確認(rèn)幀 ,因此發(fā)送方會重傳已經(jīng)被接收的數(shù)據(jù)幀? ,接收方收到同樣的數(shù)據(jù)幀時會丟棄該幀,并重傳一個該幀對應(yīng)的確認(rèn)幀 。發(fā)送的幀交替地用0和1來標(biāo)識 ,肯定確認(rèn)則分別用 ACK0和 ACK1 來表示 ,當(dāng)收到的確認(rèn)有誤時 ,則重傳己發(fā)送的幀。
對于停止-等待協(xié)議,由于每發(fā)送一個數(shù)據(jù)幀就停止并等待 ,因此用 1bit 來編號就夠 。在停止-等待協(xié)議中 ,若連續(xù)出現(xiàn)相同發(fā)送序號的數(shù)據(jù)幀 ,表明發(fā)送端進(jìn)行了超時重傳。連續(xù)出現(xiàn)相同序號的確認(rèn)幀 ,表明接收端收到了重復(fù)幀 。
此外,為了超時重發(fā)和判定重復(fù)幀的需要,發(fā)送方和接收方都須設(shè)置一個幀緩沖區(qū)。發(fā)送端在發(fā)送完數(shù)據(jù)幀時 ,必須在其發(fā)送緩存中保留此數(shù)據(jù)幀的副本 ,這樣才能在出差錯時進(jìn)行重傳 。 只有在收到對方發(fā)來的確認(rèn)幀 ACK 時,方可清除此副本 。
由下圖可知,停止-等待協(xié)議通信信道的利用率很低 。為了克服這一缺點(diǎn) ,就產(chǎn)生了另外兩種協(xié)議 ,即后退 N幀協(xié)議和選擇重傳協(xié)議 。
多幀滑動窗口與后退 N 幀協(xié)議 ( GBN )
在后退 N 幀式 ARQ 中,發(fā)送方不需要在收到上一個幀的 ACK 后才能開始發(fā)送下一幀 ,而是可以連續(xù)發(fā)送幀? 。當(dāng)接收方檢測出失序的信息幀后,要求發(fā)送方重發(fā)最后一個正確接收的信息幀之后的所有未被確認(rèn)的幀;或者當(dāng)發(fā)送方發(fā)送了 N個幀后 ,若發(fā)現(xiàn)該 N個幀的前一個幀在計時器超時后仍未返回其確認(rèn)信息 ,則該幀被判為出錯或丟失 ,此時發(fā)送方就不得不又重傳該出錯幀及隨后的 N個幀 。換句話說 ,接收方只允許按順序接收幀 。
如圖所示,源站向目的站發(fā)送數(shù)據(jù)幀 。當(dāng)源站發(fā)完 0 號幀后,可以繼續(xù)發(fā)送后續(xù)的 1 號幀、2 號幀等。源站每發(fā)送完一幀就要為該幀設(shè)置超時計時器 。由于連續(xù)發(fā)送了許多幀,所以確認(rèn)幀必須要指明是對哪一幀進(jìn)行確認(rèn) 。為了減少開銷 ,GBN協(xié)議還規(guī)定接收端不一定每收到一個正確的數(shù)據(jù)幀就必須立即發(fā)回一個確認(rèn)幀 ,而是可以在連續(xù)收到好幾個正確的數(shù)據(jù)幀后,才對最后一個數(shù)據(jù)幀發(fā)確認(rèn)信息 ,或者可以在當(dāng)自己有數(shù)據(jù)要發(fā)送時才將對以前正確收到的幀加以捎帶確認(rèn) 。這就是說 ,對某一數(shù)據(jù)幀的確認(rèn)就表明該數(shù)據(jù)幀和這以前所有的數(shù)據(jù)幀均己正確無誤地收到了。在圖中,ACKn 表示對第 n 號幀的確認(rèn) ,表示接收方己正確收到了第 n 號幀及以前的所有幀,下一次期望收到第 n+1 號幀 (也可能是第 0 號幀)。接收端只按序接收數(shù)據(jù)幀 。 雖然在有差錯的 2 號幀之后接著又收到了正確的 6 個數(shù)據(jù)幀,但接收端都必須將這些幀丟棄。接收端雖然丟棄了這些不按序的無差錯幀 ,但應(yīng)重復(fù)發(fā)送己經(jīng)發(fā)送過的最后一個確認(rèn)幀 ACK1? ( 這是防止己經(jīng)發(fā)送過的確認(rèn)幀 ACK1 丟失)。
后退 N幀協(xié)議的接收窗口為1,可以保證按序接收數(shù)據(jù)幀。若采用n個比特對幀編號 ,則其發(fā)送窗口的尺寸 WT 應(yīng)滿足:1 <= WT? <= 2^n - 1。若發(fā)送窗口的尺寸大于2^n - 1,則會造成接收方無法分辨新幀和舊幀。
從圖中不難看出 ,后退 N 幀協(xié)議一方面因連續(xù)發(fā)送數(shù)據(jù)幀而提高了信道的利用率 ,但另一方面,在重傳時又必須把原來己傳送正確的數(shù)據(jù)幀進(jìn)行重傳 (僅因這些數(shù)據(jù)幀的前面有一個數(shù)據(jù)幀出了錯) ,這種做法又使傳送效率降低。由此可見,若信道的傳輸質(zhì)量很差導(dǎo)致誤碼率較大時,后退 N幀協(xié)議不一定優(yōu)于停止-等待協(xié)議。
多幀滑動窗口與選擇重傳協(xié)議(SR)
為進(jìn)一步提高信道的利用率 ,可設(shè)法只重傳出現(xiàn)差錯的數(shù)據(jù)幀或者是計時器超時的數(shù)據(jù)幀。
但此時必須加大接收窗口,以便先收下發(fā)送序號不連續(xù)但仍處在接收窗口中的那些數(shù)據(jù)幀 。等到所缺序號的數(shù)據(jù)幀收到后再一并送交主機(jī) 。這就是選擇重傳 ARQ 協(xié)議。
在選擇重傳協(xié)議中 ,每一個發(fā)送緩沖區(qū)對應(yīng)一個計時器 ,當(dāng)計時器超時時,緩沖區(qū)的幀就會重傳 。另外,該協(xié)議使用了比上述其他協(xié)議更有效的差錯處理策略 ,即一旦接收方懷疑幀出錯,就會發(fā)一個否定幀 NAK 給發(fā)送方 ,要求發(fā)送方對 NAK 中指定的幀進(jìn)行重傳 。如圖所示。
選擇重傳協(xié)議的接收窗口尺寸 WR 和發(fā)送窗口尺寸 WT 都大于 1,一次可以發(fā)送或接收多個幀。若采用n比特對幀編號,為了保證接收方向前移動窗口后 ,新窗口序號與舊窗口序號沒有重疊部分,需要滿足條件:接收窗口 WR+發(fā)送窗口 WT? <= 2^n。假定仍然采用累計確認(rèn)的方法 ,并且接收窗口 WR 顯然不應(yīng)超過發(fā)送窗口 WT ( 否則無意義),那么接收窗口尺寸不應(yīng)超過序號范圍的一半:WR <= 2^(n - 1)。當(dāng)接收窗口為最大值時 ,WTmax=WRmax=2^(n - 1)。需要提醒讀者的是 ,一般情況下,在 SR 協(xié)議里面 ,接收窗口的大小和發(fā)送窗口的大小是相同的。
選擇重傳協(xié)議可以避免重復(fù)傳送那些本己正確到達(dá)接收端的數(shù)據(jù)幀 ,但在接收端要設(shè)置具有相當(dāng)容量的緩沖區(qū)來暫存那些未按序正確收到的幀 。接收端不能接收窗口下界以下或窗口上界以上的序號的幀 ,因此所需緩沖區(qū)的數(shù)目等于窗口的大小 ,而不是序號數(shù)目 。
補(bǔ)充問題
在停止-等待協(xié)議中 ,確認(rèn)幀為什么不需要序號(如用 ACK0 和 ACK1 ) ?
為什么當(dāng)用n個比特進(jìn)行編號時 ,若接收窗口的大小為 1,則只有在發(fā)送窗口的大小 WT <=?2^n-1 時,連續(xù)ARQ 協(xié)議才能正確運(yùn)行 ?