3.4.1 基本概念
假如接收端檢測到了有一個幀出現錯誤,那就告訴發送方:哥們,有一個幀出錯了,麻煩重發一下。
試想一下這樣一種情況,假如接收方告訴發送方的話是有誤的,欺騙的,那會引起更大的災難。
后面我們會介紹三種實現可靠傳輸的方法。
一般情況下,有線鏈路的誤碼率比較低,為了減少開銷,並不要求數據鏈路層向上層提供可靠傳輸服務,即使出現誤碼,可靠傳輸的問題由上層處理。
無線鏈路易受干擾,誤碼率較高,因此要求數據鏈路層必須向上層提供可靠傳輸服務。
3.4.1 停止-等待協議
發送方每發送完一個分組后,就停止發送下一個分組。並且緩存還不能清掉,等到接收到接收方的確認ACK那就清掉緩存,並且發送下一個分組。如果接收方發送的是否認NAK沒有收到,那就重發。
但是實際情況更復雜,我們來看下面這種情況。一開始傳輸的時候就出現錯誤,並且接收方收不到,也就不會發ACK或者NAK,那這樣就一直等着。破冰的辦法就是超時計時器。比往返時間略大一點,超時了還沒收到回復,那就重傳。
既然發送方發送的數據分組可能丟失,那我接收方發送的接收分組也可能會丟失。這必然會造成超時重傳。假設這個重傳的也達到了接收方,那么問題來了,接收方如何判斷該數據分組是不是重復的呢?
為了避免出現分組重復,必須給分組帶上序號。
通過確認分組丟失的情況,引出了給確認分組編號的操作。
請大家思考一下:既然數據分組需要編號,那么確認分組是否也需要編號呢?
如果我們的確認遲到了,發送方到點重傳了,收到重復確認,那他怎么知道是對1還是0的確認呢?所以得編號
需要說明的是:對於數據鏈路層的點對點信道,往返時間比較固定,不會出現確認遲到的情況。因此,如果只在數據鏈路層實現停止等待協議,不用給確認分組編號。
注意事項:
練習題:
3.4.2 回退N幀協議
我們可以看出,停止等待協議信道利用率很低,並且如果發生超時重傳的話,信道利用率更低,所以我們可以用流水線的方式發送數據分組,一次發5個,提高信道的利用率
那么我們的回退N幀協議GBN(Go -Back -N)就是在流水線的基礎上設計的。利用發送窗口來限制發送方可發送的數據分組的個數。在發送窗口里面的數據分組可被連續發送,而不必等待。
發送窗口的尺寸記為WT。
如果WT的值取1就是停止等待協議。如果WT的值超過取值范圍的上限,則會造成嚴重的錯誤。
接收窗口的大小為Wr:對於回退N幀協議,其取值只能為1。
我們先來看最簡單的沒差錯的情況:
發送方按序發送,接收方一個一個接收,每接收一個,接收窗口就向前滑動一個位置。並給發送方發送所接收分組的確認分組。
發送方每接收一個接收方的ACK,發送窗口就向前滑動一個位置。
並且發送方可以將已發送的分組緩存清除,接收方呢就將已接收的分組交付給上層去處理。
接下來我們看看累積確認的概念:使用后退N幀協議的接收方,可以使用累積確認的機制。也就是我接收方不必啰嗦的每個都發個收到。而是收到5個分組之后再說一句收到5個了。ACKn表示N以及之前的分組全部都接收了。
使用累積的一個優勢:比如你先發一個ACK1,之后又發了一個ACK4,ACK1在路上丟失了,但是最后我發送方還是接收到ACK4,不會因為ACK1的丟失而發生重傳。還有其他優點:減少接收方的開銷,減少網絡資源的占用等。
使用累積確認的缺點:不能及時的反映接收方已經接收的信息。
我們來看一種出錯的情況:發送方發送的數據1丟失了,5670跟着受到牽連,也不被接收方接收。那超時之后引起重傳,重傳的話我5670這四個倒霉蛋又被重傳了一次。可見網絡不好的時候,回退N幀協議的信道利用率不見得要比停止等待協議的好。
接下來我們看一看發送窗口尺寸超出上限會怎么樣:
現在我Wt是8,我序號編的是0-7,接收方接收到之后,發送ACK7,但是ACK7在路上丟失了,沒有正確達到發送方,超時之后,發送方重傳0-7,此時接收方一看,丫的,這0-7到底是重傳的還是新的啊,我也看不出來。
回退N幀協議名字的由來:一人犯錯,牽連全家。
練習題:
因為該協議的發送窗口和接收窗口是不斷滑動的,所以又叫滑動窗口協議。
3.4.3 選擇重傳協議SR
回退N幀協議的接收窗口只能為1,因此接收方只能按序接收正確達到的數據分組。
一顆老鼠屎會壞了一鍋湯,前面只要有一個接收有誤,那后面的就不能被正確接收,引起超時重傳,對通信資源造成浪費。
那么我們可不可以只重傳出錯的那個分組,不連累其它人呢?
那我的接收窗口就不應該為1,應該大於1,哪些沒錯的就接受讓他們先在接收方休息,只重傳出錯的那個,等重傳的到達后他們再一起送到上一層去。這個就是選擇重傳協議。
需要注意:你如果想要發送方發送出錯的那個分組,那你接收方就不能再采用累積確認的機制了。應該是對每一個正確到達的分組逐一確認。
這個協議需要注意的就是發送窗口和接收窗口大小的設計
如果發送窗口和接受窗口的尺寸超過了范圍。那也會引起上面的新舊不分的問題
發送方發了0-4,接收方接收到0-4之后自己的滑動窗口就向前移動了,然后發ACK給發送方,但是ACK0丟失了。一段時間超時了,發送方重發0,但是此時滑動窗口已經不再是當年那個滑動窗口了,此時的0非當年的0。
練習題:
3號幀題目沒說啥,那就別考慮他。