複製鏈接
請複製以下鏈接發送給好友

選擇重發策略

鎖定
當接收方發現某一幀出錯後,仍然後續來的正確的幀存放在一個緩衝區中暫不向上層遞交,同時向發送方要求重新傳送出錯的那一幀;一旦收到重新傳來的幀後,就將其與存於緩衝區的中的其幀一同按正確順序遞交高層。
中文名
選擇重發策略
外文名
Select the retransmission strategy

選擇重發策略原理

回退N幀策略因可以連續發送數據幀而提高了傳輸效率,但也有不利的方面,那就是在重發時必須把原來已正確傳送過的數據幀再次發送,僅僅是因為這些數據幀之前的某個數據幀或確認幀發生了差錯,這樣又使傳輸效率降低。所以當通信鏈路的傳輸質量很差、誤碼率較大時,回退N幀策略就沒什麼優勢了,因為這時可能經常要重傳大量的數據幀。
為了彌補回退N幀策略的不足,另一種效率更高的差錯控制策略—選擇重發策略誕生了。在這個差錯控制策略中,當接收端發現某幀出錯後,其後繼續送來的正確幀雖然不能立即遞交給接收端的“網絡層”,但接收端仍可接收下來,先存放在一個緩衝區中,同時通過向發送端發送NAK否認幀,要求發送端重新傳送出錯的那一幀。一旦收到重新發來的正確幀後,就可以與原已存於緩衝區中的其餘幀一起按正確的順序遞交給網絡層。
選擇重發策略規定,當發送端收到包含出錯幀序號的NAK幀時,據此序號從重發表中選出相應幀的備份,直接插入到發送幀隊列的前面給予重發,因為重發表的幀重發是按照FIFO(先進先出)的機制進行排列的,插在前面是為了可以最先重發,避免了對後繼正確數據幀的多餘重發,使得傳輸效率明顯提高了。
如果仍用小孩數數來打比方的話,就是你先讓小孩自己一直數下去,發現數錯時你記下來(不要打斷他正常的數數流程),當小孩數完後你再根據這些錯誤要求小孩重數對應的數就行了,而不必要求他從錯誤的地方重新數下去。

選擇重發策略數據處理方法

下面也分兩種情況來討論“選擇重發”策略的數據處理方法。

選擇重發策略(1)數據幀出現差錯情形下的處理流程

以下是當數據幀有差錯(包括接收端檢測到所接收的數據幀有差錯,或者有數據幀丟失兩種可能)時,“選擇重發”策略的數據處理流程:
1)發送端連續發送多個數據幀,接收端對每個已正確接受的數據幀返回一個ACK幀;現假設第N+1個幀出現差錯或丟失如果檢測到第N+1個幀有錯誤,則向發送端返回一個否認NAK(N+1)幀;如果一直到收到第N+2個數據幀時還沒收到第N+1幀,則表明該幀已丟失,接收端不產生任何動作;但無論結果如何,已正確接收的數據幀,如第N個幀、第N+2個幀、第N+3個幀……仍會向發送方返回確認ACK幀;
2)當發送端收到來自接收端的否定NAK(N+1)或者收到第N+2幀的ACK幀時,會檢測出其失序(因為按順序,在收到ACK(N+2)幀之前應該是收到ACK(N+1)幀),得知第N+1幀沒有被確認。將第N+2幀從重發表中清除,並在繼續發送後繼數據幀之前重發第N+1幀。
由於接收端檢測到2號幀有錯,向發送端發送了一個否認幀NAK2,要求發送端選擇重發2號幀的示意圖。從中可以看限出,“選擇重發”策略下只需發送有錯的幀,而不會發送從有錯幀開始後面所的幀,顯然減少了信道資源浪費,提高了傳輸效率,但要求發送端和接收端都有足夠大的緩衝區空間,以便存儲多個幀的重發表和預提交數據幀。

選擇重發策略(2)響應幀出現差錯情形下的數據處理流程

在響應幀(包括確認ACK幀和否認NAK幀)出現差錯時,也就是本應接收的是第N個幀的響應幀卻接收到了第N+1個幀的響應幀情況下,在該情形下數據處理流程如下(現以ACK幀出錯進行介紹,與NAK幀出錯的處理流程一樣):
1)當發送端已到了第N-1個幀的ACK幀,接下來應該收到的是第N個幀的ACK幀,而偏偏收到的是第N+1個幀的ACK幀;
2)發送端在收到ACK(N+1)幀後,檢測出在重發表中第N個幀都還沒收到ACK幀,因此認為第N個幀出現了差錯(事實上並不是這樣的),重發第N個幀;
3)接收端在收到發送端重發的第N個幀,搜索接收表並確定第N幀已被正確接收,因此認定這個重發的第N幀是重複的,於是直接刪除這個重發的第N幀,並返回一個ACK(N)給發送端,以使發送端從重發表中刪除第N幀。這樣就達到了響應幀出現差錯時的錯誤糾正。
[1] 
參考資料