1. 程式人生 > >3.4.2 單幀滑動視窗與停止等待協議

3.4.2 單幀滑動視窗與停止等待協議

在停止等待協議中,源站傳送單個幀後必須等待確認,在目的站的回答到達源站之前,源站不能傳送其他的資料幀。從滑動視窗機制的角度看,停止等待協議相當於傳送視窗和接受視窗的接受視窗大小均為1的滑動視窗協議。

在停止等待協議中,除了資料幀丟失,還可能出現以下兩種差錯:

到達目的站的幀可能已遭破壞,接受站利用在前面討論過的差錯檢測技術檢出後,簡單地將該幀丟棄。為了對付這種可能發生的情況,源站裝備了計時器,在一個幀傳送之後,源站等待確認,如果在計時器計滿時仍未收到確認,則再次傳送同樣的幀。如此重複,直到該資料幀無錯誤地到達為止。

 另一個可能的差錯是資料幀正確而確認被破壞。為了避免這樣的問題,傳送的幀交替地用0和1來標識,肯定確認則分別用ACK0和ACK1來表示,當收到的確認有誤時,則重傳已傳送的幀。下面分析停止等待協議的實現步驟。

在傳送結點:

1 從主機取一個數據幀,送交發送緩衝。

2 V(s)<---0。{傳送狀態V(S)初始化}

3 N(s)<---V(S):{將傳送狀態變數值寫入資料幀的傳送序列號N(s) }

4 將傳送快取中的資料幀傳送出去。{這個資料幀的副本仍保留在傳送快取中}

5 設定超時計時器。{選擇適當的超時重傳時間Tout}

6 等待。{等待以下7和8這兩個事件中最先出現的一個}

7 若收到確認幀ACKn,

若n=1-V(s),則:{已傳送的資料幀被接收方確認}

從主機取一個新的資料幀,放入傳送快取;

V(s)<---[1-V(s)],轉到4.{更新發送狀態變數,變為下一個序號}

否則,丟棄這個確認幀,轉到6.{這說明已傳送的資料幀沒有被接收方確認}

8 若超時計數器時間到,則轉到4。{重傳已傳送的資料幀}

在接受結點:

1.V(R)<---0.{接受狀態變數初始化,其數值等於欲接受的資料幀的傳送序列}

2.等待

3.收到一個數據幀,就檢查有無產生傳輸差錯(如用CRC)。

若檢查結果正確無誤(否則直接丟棄,轉2),則執行後續演算法;

4.若N(s)=V(R),則執行後續演算法;{收到傳送序號正確的資料幀}

否則丟棄此資料幀,然後轉到7。{丟棄的資料幀就是重複幀}

5.將收到的資料幀中的資料部分送交主機。

6.V(R)<---[1-V(R)]。{更新接受狀態變數,準備接受下一個資料幀}

7.傳送確認幀ACKn,並轉到2。{n=V(R),表明期望收到V(R)}

由以上演算法可知,對於停止-等待協議,由於每傳送一個數據幀就停止並等待,因此用1bit編號就夠。在停止-等待協議中,若連續出現相同傳送序號的資料幀,表明傳送端進行了超時重傳。連續出現相同序號的確認幀,表明接收端收到了重複幀。

此外,為了超時重發和判定重複幀的需要,傳送方和接受方都需設定一個幀緩衝區。傳送端在傳送完資料幀時,必須在其傳送快取中保留此資料幀的副本,這樣才能在出差錯時進行重傳。只有在收到對方發來的確認幀ACK時,方可清除此副本。